Skip to main content

Whisperr server-side SDK for Python — reliable churn-signal event tracking.

Project description

whisperr (Python)

The Whisperr server-side SDK for Python — reliable churn-signal event tracking for any Python backend. The backend is where the highest-signal churn events live (payment failures, cancellations, trial expiry, usage drops), so this is where Whisperr gets its most valuable signal.

pip install whisperr

Quick start

import os
from whisperr import Whisperr

whisperr = Whisperr(api_key=os.environ["WHISPERR_API_KEY"])

# A server-side churn signal:
whisperr.track("user_8842", "payment_failed", {"amount_cents": 4900, "reason": "card_declined"})

# Associate traits / contact channels with a user:
whisperr.identify("user_8842", email="ada@example.com", traits={"plan": "pro"})

# Deliver everything before the process exits:
whisperr.shutdown()

The user id (external_user_id) is always explicit here — unlike a browser SDK, the server has no persisted session to infer it from. Pass the same id you use everywhere else for that user, and frontend + backend events land on one timeline automatically.

Design

  • Same wire contract as the other Whisperr SDKs. Events post to /v1/events/batch, identities to /v1/identify, authenticated with X-API-Key.
  • Non-blocking. track()/identify() enqueue and return immediately; a background thread batches and delivers. Call flush() for a barrier.
  • Reliable in-process. In-memory queue, batching, retry with backoff (429/5xx), malformed-4xx drop, per-event idempotency key. On 401/403 or exhausted retries, delivery pauses and events stay buffered for the next flush rather than being dropped. The queue is not crash-durable — call flush()/shutdown() before exit (see Short-lived processes).
  • Process-friendly. A daemon thread that never blocks exit; shutdown() is also registered via atexit.
  • Zero runtime dependencies. Uses the standard library only.

Django

# settings.py
WHISPERR_API_KEY = os.environ["WHISPERR_API_KEY"]
MIDDLEWARE = [
    # ... after your authentication middleware ...
    "whisperr.django.WhisperrMiddleware",
]
# views.py
def upgrade(request):
    request.whisperr.track("plan_upgraded", {"plan": "pro"})
    ...

request.whisperr.track() is bound to the request's authenticated user (request.user.pk by default; override with WHISPERR_RESOLVE_USER, a dotted path to def resolve(request) -> str | None). For events with no request — Celery tasks, webhooks, management commands — use a client directly with the user id from your domain data:

from whisperr.django import get_client
get_client().track(subscription.user_id, "subscription_cancelled", {"reason": reason})

Install the Django extra if you want the dependency pinned: pip install whisperr[django].

Short-lived processes

In scripts, serverless handlers, or management commands, call flush() (or shutdown()) before exit so queued events aren't lost:

whisperr.track(user_id, "report_generated")
whisperr.flush()

Options

Option Default Notes
api_key App ingestion key (wrk_…). Required.
base_url https://api.whisperr.net Ingestion base URL.
flush_at 20 Flush when this many events are queued.
flush_interval 10.0 Background flush cadence (seconds).
max_queue_size 10000 Oldest events drop on overflow.
max_batch_size 500 Events per batch (hard backend cap is 500).
max_retries 6 Consecutive retries before giving up a batch.
request_timeout 10.0 Per-request timeout (seconds).
disabled False No-op client (useful in tests).
debug False Verbose logging to stderr.
on_error Callable[[WhisperrError], None] for observability.

Whisperr — predict churn, automate interventions, recover revenue. whisperr.net

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

whisperr-0.1.0.tar.gz (12.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

whisperr-0.1.0-py3-none-any.whl (11.1 kB view details)

Uploaded Python 3

File details

Details for the file whisperr-0.1.0.tar.gz.

File metadata

  • Download URL: whisperr-0.1.0.tar.gz
  • Upload date:
  • Size: 12.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for whisperr-0.1.0.tar.gz
Algorithm Hash digest
SHA256 a4f5fc37c68b5fc12ffc8303adeaa1c6b115e1fa5a375c9002e4941ead761cc4
MD5 1fae29cdc5f67e7c029a45a174ee3c0d
BLAKE2b-256 1ba38b366499987cd6588acacea94ab11481d8bab777447ff338e61ebc1ae1ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for whisperr-0.1.0.tar.gz:

Publisher: publish.yml on WhisperrAI/whisperr-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file whisperr-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: whisperr-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 11.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for whisperr-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2f451f4d0bfe4a0111ad38b616d96d26f3a4b5e574f724be783cea6ae0fe10cb
MD5 80ca89d7fcec6fd9f5def8432d01603d
BLAKE2b-256 9cf4ff979f8cdb82fa2fcba57d779a3c0617566258b5597debf1c4cbfb783e8b

See more details on using hashes here.

Provenance

The following attestation bundles were made for whisperr-0.1.0-py3-none-any.whl:

Publisher: publish.yml on WhisperrAI/whisperr-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page