Stripe MRR Reports - SaaS Metrics from Your Stripe Data
How ERPClaw computes MRR, ARR, churn, expansion, and contraction from your Stripe subscription data. Cohort retention, net new MRR, and the math that powers SaaS reports.
If you run a SaaS business on Stripe, MRR is the metric that defines your trajectory. ERPClaw computes MRR, ARR, churn, expansion, and contraction directly from your Stripe subscription data, not from estimates or aggregations.
What ERPClaw reports
| Metric | Definition | Command |
|---|---|---|
| MRR | Sum of all active subscription monthly amounts | stripe-mrr |
| ARR | MRR × 12 | stripe-arr |
| New MRR | MRR added by brand-new subscriptions in the period | stripe-mrr-breakdown |
| Expansion MRR | MRR added by upgrades + add-ons | stripe-mrr-breakdown |
| Contraction MRR | MRR lost from downgrades | stripe-mrr-breakdown |
| Churn MRR | MRR lost from cancellations | stripe-mrr-breakdown |
| Net New MRR | New + Expansion − Contraction − Churn | stripe-mrr-breakdown |
| Logo churn | Customers cancelled / customers at start of period | stripe-churn |
| Revenue churn | Churn MRR / MRR at start of period | stripe-churn |
| Cohort retention | Per-cohort retention curve over months | stripe-cohort-retention |
| Customer lifetime value | Average revenue per customer × average lifespan | stripe-ltv |
All metrics are computed from stripe_subscription and
stripe_subscription_item tables, not from aggregate Stripe API
calls.
How MRR is calculated
MRR is the sum of all currently-active subscriptions, normalized to one month.
For each active subscription:
- If billing interval is monthly: add the unit_amount × quantity
- If billing interval is yearly: add (unit_amount × quantity) / 12
- If billing interval is weekly: add (unit_amount × quantity) × 52 / 12
- If billing interval is daily: add (unit_amount × quantity) × 365 / 12
Multi-line subscriptions (a base plan plus add-ons): each line is summed separately.
Trialing subscriptions: NOT included in MRR until the first paid charge succeeds. (Some companies count trials in MRR; we do not, and we think the inclusion masks churn.)
Paused subscriptions: NOT included.
Past-due (delinquent): included for the first 7 days, then excluded.
You can override this in stripe-configure-mrr-policy.
How churn is calculated
Two definitions, both reported:
Logo churn = (customers who cancelled in period) / (customers active at start of period). What percentage of your customers left.
Revenue churn = (sum of MRR lost to cancellation in period) / (MRR at start of period). What percentage of your revenue left.
Logo churn and revenue churn diverge when high-paying customers leave disproportionately (or stay disproportionately). Both matter; either can mask the other.
Net new MRR formula
Net New MRR = New MRR + Expansion MRR − Contraction MRR − Churn MRR
Components:
- New MRR: subscriptions where the customer signed up in this period AND the subscription started AND first charge succeeded
- Expansion MRR: existing customers whose MRR went up (upgrades, add-ons, plan-tier increases)
- Contraction MRR: existing customers whose MRR went down (downgrades, plan-tier decreases) but still subscribed
- Churn MRR: subscriptions that cancelled or expired in this period
Period is configurable; default is calendar month.
Cohort retention
ERPClaw groups customers by signup month (the cohort), then tracks each cohort’s retained MRR over the following months.
erpclaw stripe-cohort-retention --account-id <id> --periods 12
Output is a 2D table:
| Cohort | M0 | M1 | M2 | M3 | M4 | M5 | M6 |
|---|---|---|---|---|---|---|---|
| 2026-01 | $5,000 | $4,800 | $4,650 | $4,500 | $4,350 | $4,200 | $4,000 |
| 2026-02 | $7,000 | $6,700 | $6,500 | $6,300 | $6,150 | $5,950 | --- |
| 2026-03 | $9,500 | $9,100 | $8,900 | $8,700 | $8,500 | --- | --- |
Each row shows what that cohort’s MRR is N months after they signed up. Decay over time = churn. Increase = expansion (rare; usually due to upgrades).
LTV calculation
stripe-ltv reports lifetime value as average revenue per customer
multiplied by average customer lifespan (in months).
LTV = (sum of revenue per customer) / (count of customers) × (sum of months active per customer) / (count of customers)
For customers who haven’t churned yet, lifespan is computed up to today. As cohorts mature, the LTV becomes more accurate.
ERPClaw also reports LTV/CAC if you have configured
acquisition cost data via stripe-set-cac (per-month or per-channel).
Annual subscriptions and MRR
Annual subscriptions normalized to MRR can mislead. A customer paying $12,000/year is $1,000 MRR. If they don’t renew, that’s $1,000 MRR churn. But the cash impact is $12,000 over 12 months, not $1,000.
ERPClaw reports both:
- Booked MRR (the normalized figure used for SaaS metrics)
- Cash MRR (actual cash collected, divided by months in the period)
Use Booked MRR for investor reports. Use Cash MRR for runway models.
Multi-currency
ERPClaw v1 reports MRR in USD. Subscriptions in other currencies are recorded but not converted. Multi-currency MRR is on the roadmap.
Common edge cases
- Quarterly subscriptions: normalized to MRR by dividing by 3.
- Custom billing cycles: if not month/year/week/day, fall back to (unit_amount × quantity) × 12 / billing_period_in_months.
- Free plans: not in MRR by definition. They appear in “active customers” count but contribute $0.
- Discounts: applied to MRR. A $100 plan with 50% off is $50 MRR.
- Coupons that expire: ERPClaw recomputes MRR when the coupon expires; the customer’s MRR jumps back to full price on that date.
- Subscription paused mid-cycle: subtracted from MRR on the pause date.
Audit trail
Every MRR computation is reproducible. Run with --show-detail to
get the per-customer breakdown:
erpclaw stripe-mrr --account-id <id> --as-of 2026-04-30 --show-detail
Output is a CSV with every active subscription, its MRR contribution, and the math used.
When MRR doesn’t match Stripe Dashboard
Stripe Dashboard’s MRR can differ from ERPClaw’s because:
- Stripe includes trials in some views; ERPClaw does not
- Stripe handles paused subscriptions differently
- Stripe rounds MRR per subscription; ERPClaw computes exactly
If they differ by more than 5%, run stripe-mrr-breakdown to see
which subscriptions are causing the gap.
Source
- MRR engine source: github.com/avansaber/erpclaw-addons
- SaaS metrics primer: klipfolio.com/resources/articles/what-is-mrr