Skip to main content
More Stripe documentation

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

You ask for these the way you would ask a finance lead:

“What is our MRR this month, and how much of the change was expansion versus churn?”

The table below names the same metrics and the action behind each one, for when you are calling them directly.

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 Not available
2026-03 $9,500 $9,100 $8,900 $8,700 $8,500 Not available Not available

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, deliberately: ERPClaw never converts currency inside a transaction, so each subscription’s MRR reads in the currency it bills in.

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