Use cases at a glance
Revenue monitoring for SaaS is not just about knowing your MRR number — it's about knowing why it changed overnight. These agents pull from Stripe, compute the standard SaaS MRR movement components, and surface the answer before you open your laptop.
📊 Daily MRR Snapshot
Total active MRR at end of day, compared to yesterday and the same day last month. Delivered every morning.
📈 MRR Movement Breakdown
New MRR from signups, expansion MRR from upgrades, contraction MRR from downgrades, and churned MRR from cancellations — all in one view.
🚨 Overnight Drop Alert
Immediate alert if MRR drops more than your configured threshold overnight — before your morning standup.
📅 Weekly ARR Summary
Weekly ARR snapshot, month-to-date MRR movement, revenue vs target tracking, and 30-day cohort retention revenue.
🏆 Top Accounts Report
Top 10 accounts by MRR, recently churned accounts with their MRR value, and newly upgraded accounts this week.
Stripe restricted key setup
Always use a restricted key — never your secret key — for read-only monitoring. Create one in 4 steps:
- Go to Stripe Dashboard → Developers → API keys → Create restricted key
- Name it something identifiable:
openclaw-monitoring-read - Grant Read access to: Customers, Subscriptions, Invoices, Payment Intents, Charges, Payouts. Grant No access to everything else.
- Add to your
secrets.env:STRIPE_RESTRICTED_KEY=rk_live_xxxxxxxxxxxx STRIPE_ACCOUNT_CURRENCY=usd # your base currency for MRR calculations
sk_live_...) for monitoring. A restricted key with read-only permissions cannot initiate charges, process refunds, or modify subscriptions — even if OpenClaw were ever misconfigured.
Daily MRR snapshot agent
This agent queries all active subscriptions, normalises billing amounts to monthly figures, and stores a daily snapshot. It handles annual plans (divides by 12), semi-annual plans (divides by 6), and weekly plans (multiplies by 4.33). Metered/usage-based subscriptions are flagged separately.
MRR movement breakdown
The movement breakdown compares today's subscription state against yesterday's stored snapshot. It classifies each subscription change into one of four categories:
| Category | Definition | Stripe event |
|---|---|---|
| New MRR | Subscription created and now active for the first time | customer.subscription.created |
| Expansion MRR | Existing subscription upgraded to a higher plan | customer.subscription.updated (amount ↑) |
| Contraction MRR | Existing subscription downgraded to a lower plan | customer.subscription.updated (amount ↓) |
| Churned MRR | Subscription cancelled (voluntary or involuntary) | customer.subscription.deleted |
Add the movement breakdown to your snapshot agent config:
Overnight drop alert
This is the agent you want running even on weekends. It checks your current MRR against the stored snapshot and fires an alert if the drop exceeds your threshold — useful for catching a large enterprise cancellation before your support team even opens Slack.
single_cancellation_above value set to roughly 1% of your MRR — that way a large single cancellation always fires even if the percentage threshold isn't crossed yet.
Weekly ARR & cohort summary
Runs every Monday morning. Covers the full week's MRR movement, ARR (MRR × 12), month-to-date net new MRR, revenue vs your target, and a 30-day cohort retention breakdown showing how much revenue from last month's new customers is still active.
HEARTBEAT templates
Sample report output
FAQ
How does OpenClaw calculate MRR from Stripe?
It queries the Stripe Subscriptions API for all active subscriptions, normalises each to a monthly figure (annual plans ÷ 12, weekly plans × 4.33), and sums them. It then compares against yesterday's snapshot to compute the movement breakdown. The result matches standard SaaS MRR definitions used by tools like Baremetrics or ChartMogul.
Is it as accurate as a dedicated MRR tool?
For most setups yes. Edge cases include metered/usage-based subscriptions (flagged separately), multi-currency (uses Stripe's embedded exchange rates), and complex discount structures. Use it as a daily health signal rather than an audited source of truth for investor reporting.
How should I set the overnight drop threshold?
Start at 3-5% for businesses under $50k MRR, and 1-2% above that. Pair it with a single_cancellation_above value at roughly 1% of your MRR so a large single cancellation always fires even if the percentage threshold isn't met.