Revenue

How to Calculate MRR From Stripe Subscriptions

Nemo · · 5 min read

Monthly recurring revenue is the number most subscription founders check first and compute worst. Stripe shows you payments, balances and invoices, but MRR is a model you build on top of them. Get the model wrong and a yearly plan looks like a spike, a trial looks like revenue, and a discount silently inflates your growth.

This guide walks through how to compute MRR from Stripe subscriptions, the edge cases that trip people up, and the related numbers that make MRR useful.

MRR is not revenue

Revenue is what you collected. MRR is the recurring amount your active subscriptions are worth per month, right now. A customer who pays $120 for a year brings $120 of revenue in January and nothing for the next eleven months, but they are worth $10 of MRR every month of that year.

That is why MRR should be computed from subscriptions, not from charges or invoices.

The basic formula

For each subscription that counts, take every recurring item, normalize its price to one month, multiply by quantity, and subtract discounts. Then add up all subscriptions.

Normalizing the interval:

Billing interval Monthly value
Monthly price
Every 3 months price / 3
Yearly price / 12
Weekly price x 52 / 12
Daily price x 365 / 12

Stripe stores the interval and the interval count on each price, so a plan billed every 3 months is interval: month with interval_count: 3. Divide by the count after normalizing.

Quantities matter for seat-based plans: a $10 per seat plan with 5 seats is $50 of MRR.

Metered prices, where the amount depends on usage, do not have a fixed monthly value. Most founders leave them out of MRR and track usage revenue separately.

Which subscriptions count

Stripe subscriptions move through statuses. A common, defensible rule:

  • active: counts.
  • past_due: counts. The customer has not churned yet; Stripe is retrying the payment. If the retries fail and the subscription ends, it leaves MRR then.
  • trialing: does not count. A trial is a lead, not revenue. Track trials separately.
  • canceled, unpaid, incomplete_expired: do not count.
  • incomplete: does not count until the first payment succeeds.

A subscription set to cancel at the end of the period is still active until it ends, so it still counts. Some founders like to track scheduled cancellations as a warning; it is worth looking at, but not subtracting early.

Discounts

Coupons change what the customer pays, so they change MRR:

  • A percent off coupon scales the subscription’s monthly value. 20% off a $50 plan is $40 of MRR.
  • An amount off coupon subtracts a fixed amount per billing period. Normalize it with the same interval rule as the price.
  • A coupon that applies only for the first few months will raise MRR when it expires. That is real expansion and should show as such.

Ignoring discounts is the most common way MRR ends up higher than the bank account suggests.

Currencies

If you sell in more than one currency, keep MRR per currency. Converting with today’s exchange rate makes your MRR move when nothing in your business changed. Show USD MRR and EUR MRR side by side, and only convert when you need one number for a report.

Movements: new, expansion, contraction, churn

MRR on its own tells you where you are. The movements tell you why:

  • New MRR: subscriptions that started paying, including trials that converted.
  • Expansion: existing customers paying more, from upgrades, extra seats or an expired discount.
  • Contraction: existing customers paying less, from downgrades or fewer seats.
  • Churned MRR: the MRR of subscriptions that ended.

Next month’s MRR equals this month’s MRR plus new and expansion, minus contraction and churn. If your numbers do not reconcile with that equation, something in the model is off.

To compute movements you need two snapshots of every subscription’s MRR, for example yesterday and today, and the difference per subscription. That is why a revenue tool keeps a mirror of your subscriptions instead of reading a single total.

Churn rates

Two churn rates answer different questions:

  • Customer churn: customers who churned in the period divided by active customers at the start. It tells you how many people leave.
  • Revenue churn: churned MRR in the period divided by MRR at the start. It tells you how much money leaves. If your biggest customers are the ones staying, revenue churn will be lower than customer churn.

For a small product, look at 30-day windows and expect them to be noisy. One cancellation out of twenty customers is 5% churn.

Trials

Trials deserve their own numbers: how many are running now, how many converted in the last 30 days, and how many ended without paying. A trial that converts appears as new MRR on the day it starts paying, not the day it started.

ARPU and ARR

ARPU is MRR divided by active subscriptions: the average a paying customer is worth per month. ARR is MRR times 12. Both are simple once MRR is right.

Reading Stripe safely

You do not need full access to your Stripe account to read subscriptions. Create a restricted key with read permissions on Customers, Subscriptions, Invoices, Charges, Prices and Products. A publishable key cannot read subscription data, and a full secret key gives more access than a reporting tool should have.

Let a tool do the bookkeeping

Indiehacker Studio connects to Stripe per project with a read-only restricted key, keeps the key encrypted, and shows MRR, ARR, active subscriptions, trials, churn, new MRR, expansion, contraction and ARPU, per project and summed across all your apps in USD, with other currencies converted at the day’s exchange rate. Start free and add revenue when you upgrade to Pro.

One script. Every project.

Start free

More in Revenue

Free · Pro $12/mo or $120/yr See the plans

Contact support

We reply by email, usually within one business day.