Skip to main content

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

MetricDefinitionCommand
MRRSum of all active subscription monthly amountsstripe-mrr
ARRMRR × 12stripe-arr
New MRRMRR added by brand-new subscriptions in the periodstripe-mrr-breakdown
Expansion MRRMRR added by upgrades + add-onsstripe-mrr-breakdown
Contraction MRRMRR lost from downgradesstripe-mrr-breakdown
Churn MRRMRR lost from cancellationsstripe-mrr-breakdown
Net New MRRNew + Expansion − Contraction − Churnstripe-mrr-breakdown
Logo churnCustomers cancelled / customers at start of periodstripe-churn
Revenue churnChurn MRR / MRR at start of periodstripe-churn
Cohort retentionPer-cohort retention curve over monthsstripe-cohort-retention
Customer lifetime valueAverage revenue per customer × average lifespanstripe-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:

CohortM0M1M2M3M4M5M6
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