Official Python SDK for Ripples.sh — server-side event tracking
Project description
Ripples Python SDK
Server-side Python SDK for Ripples.sh analytics.
Install
pip install ripples
Set your secret key:
RIPPLES_SECRET_KEY=priv_your_secret_key
Usage
from ripples import Ripples
ripples = Ripples()
ripples.revenue(49.99, "user_123")
ripples.signup("user_123", email="jane@example.com")
ripples.track("created a budget", "user_123", area="budgets")
ripples.identify("user_123", email="jane@example.com")
That's it. Events are batched and sent automatically when the process exits.
Track product usage
Call track() only for significant product usage — actions that prove a user got real value (created a budget, sent a message, invited a teammate). This is not a generic event log like PostHog or Mixpanel: do not send pageviews, banner impressions, button clicks, or "viewed X" events. Every track() call feeds the Activation dashboard, so noise here pollutes your funnel. Ripples auto-detects activation (first occurrence per user), computes adoption rates, and correlates with retention and payment.
ripples.track("created a budget", "user_123", area="budgets")
ripples.track("shared a list", "user_123", area="sharing", via="link")
ripples.track("exported report", "user_123", area="reports", format="csv")
Use area to group actions into product areas. Use activated=True to mark the specific moment a user activates:
ripples.track("added transaction", "user_123", area="transactions", activated=True)
Track subscriptions (MRR)
Call subscription() when a subscription is created, upgraded, downgraded, or canceled. This powers the MRR metric on your dashboard.
Stripe / Paddle users: MRR is tracked automatically via the integration. Only use this method if you use a payment provider without a native Ripples integration.
# User subscribes to Pro Monthly ($29/mo)
ripples.subscription("sub_123", "user_456", "active", 29.00, "month",
name="Pro", currency="EUR")
# User upgrades to Business Annual ($499/yr)
ripples.subscription("sub_123", "user_456", "active", 499.00, "year",
name="Business")
# User cancels
ripples.subscription("sub_123", "user_456", "canceled", 0)
Parameters:
subscription_id(str, required) — stable identifier for the subscriptionuser_id(str, required) — your internal user IDstatus(str, required) — one of:active,canceled,past_due,trialing,pausedamount(float, required) — amount per billing cycle (e.g.29.00), pass0when cancelinginterval(str, optional) —"month"(default),"year","week", or"day"currency(str, optional) — 3-letter currency codename/plan(str, optional) — plan name shown in the dashboardinterval_count(int, optional) — billing frequency multiplier (e.g.3for quarterly)
Track revenue
ripples.revenue(49.99, "user_123")
Any extra keyword argument becomes a custom property:
ripples.revenue(49.99, "user_123",
email="jane@example.com",
currency="EUR",
transaction_id="txn_abc123",
plan="annual",
coupon="WELCOME20",
)
Refunds are negative revenue:
ripples.revenue(-29.99, "user_123", transaction_id="txn_abc123")
Track signups
ripples.signup("user_123",
email="jane@example.com",
name="Jane Smith",
referral="twitter",
plan="free",
)
Identify users
Update user traits at any time:
ripples.identify("user_123",
email="jane@example.com",
name="Jane Smith",
company="Acme Inc",
role="admin",
)
Error handling
from ripples import RipplesError
try:
ripples.revenue(49.99, "user_123")
except RipplesError as e:
print(e)
By default, errors during flush are swallowed so your app is never disrupted. Use on_error to log them:
ripples = Ripples(on_error=lambda e: print(f"Ripples error: {e}"))
Configuration
ripples = Ripples(
"priv_explicit_key",
base_url="https://your-domain.com/api",
timeout=10,
max_queue_size=50,
)
Or via environment variables:
RIPPLES_SECRET_KEY=priv_your_secret_key
RIPPLES_URL=https://your-domain.com/api
Flush manually
Events are flushed automatically at exit. For long-running processes or CLI scripts, call flush() explicitly:
ripples.flush()
Custom HTTP client
Subclass and override _post():
class MyRipples(Ripples):
def _post(self, path, data):
# your custom implementation
pass
Requirements
- Python 3.9+
- requests
License
MIT
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ripples-0.1.6.tar.gz.
File metadata
- Download URL: ripples-0.1.6.tar.gz
- Upload date:
- Size: 14.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b0605dc04f0cd63561b381758ab77963c48c816725d18514f2446329c69f1ec2
|
|
| MD5 |
80cd3365bb1b62f0cdacf02bdfbf163c
|
|
| BLAKE2b-256 |
017df4c1a79cebb7f9828cba4dd5b4d91be82c2bf83ee3e787b946cffa9138f7
|
Provenance
The following attestation bundles were made for ripples-0.1.6.tar.gz:
Publisher:
publish.yml on RipplesAnalytics/ripples-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ripples-0.1.6.tar.gz -
Subject digest:
b0605dc04f0cd63561b381758ab77963c48c816725d18514f2446329c69f1ec2 - Sigstore transparency entry: 1339023046
- Sigstore integration time:
-
Permalink:
RipplesAnalytics/ripples-python@6e9fa9b994fce4ea26882a0d796a2b83b224e776 -
Branch / Tag:
refs/tags/v0.1.6 - Owner: https://github.com/RipplesAnalytics
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6e9fa9b994fce4ea26882a0d796a2b83b224e776 -
Trigger Event:
push
-
Statement type:
File details
Details for the file ripples-0.1.6-py3-none-any.whl.
File metadata
- Download URL: ripples-0.1.6-py3-none-any.whl
- Upload date:
- Size: 6.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
56c587bed37c57a926925d510221e87bb8a46fd1d2a1279434daf42d5b18af11
|
|
| MD5 |
dd2ae8a2022134203f29bfb50c5a51ea
|
|
| BLAKE2b-256 |
02e8c5b423a05995a4d562cff7d9c100c99ed56c072488069a5891a082d2f149
|
Provenance
The following attestation bundles were made for ripples-0.1.6-py3-none-any.whl:
Publisher:
publish.yml on RipplesAnalytics/ripples-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ripples-0.1.6-py3-none-any.whl -
Subject digest:
56c587bed37c57a926925d510221e87bb8a46fd1d2a1279434daf42d5b18af11 - Sigstore transparency entry: 1339023128
- Sigstore integration time:
-
Permalink:
RipplesAnalytics/ripples-python@6e9fa9b994fce4ea26882a0d796a2b83b224e776 -
Branch / Tag:
refs/tags/v0.1.6 - Owner: https://github.com/RipplesAnalytics
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6e9fa9b994fce4ea26882a0d796a2b83b224e776 -
Trigger Event:
push
-
Statement type: