MetricMint
All posts
mrrstripemetricssaas

How to Calculate MRR from Stripe Data

Arun K C

·7 min read

You've probably done this before

You open Stripe. You click around for a bit. You export something to CSV. Then you stare at a spreadsheet full of subscription rows, trying to answer one question: what's my actual MRR?

It should be simple, right? Add up what everyone pays you each month. Done. But then you remember that one customer on an annual plan. And the one who upgraded mid-month. And the two who cancelled but still show as "active" because their billing period hasn't ended yet.

So what starts as a 5-minute task turns into 45 minutes of spreadsheet wrangling. And you're still not sure the number is right.

Why MRR is trickier than it looks

MRR is nothing but the total monthly recurring revenue from all your active subscriptions, normalized to a monthly amount. That's the textbook definition.

Think of it like a monthly paycheck for your business. If you had a job that paid you weekly, biweekly, and monthly all at once, you'd need to normalize everything to one timeframe before you could say "I earn X per month." MRR does the same thing for your subscriptions.

The tricky part is that your Stripe data doesn't just hand you this number. Stripe tracks individual subscriptions, charges, and invoices. It doesn't compute your MRR for you. You have to derive it from the raw data.

And here's where most founders get it wrong: they add up last month's charges and call it MRR. But charges include one-time payments, failed retries, and prorated amounts. That's cash, not MRR. They're different things.

MRR is about subscription state, not cash collected. A customer on a $100/month plan contributes $100 to your MRR whether their payment succeeded this month or not. A customer who paid you a $1,200 annual fee last January still contributes $100/month to your MRR every month until they cancel.

How to calculate MRR from your Stripe export

Here's the manual process, step by step. I'll use a small example so the numbers stay readable.

Step 1: Export your subscriptions CSV from Stripe

Go to your Stripe Dashboard, navigate to Billing > Subscriptions, and click Export. Choose CSV format. You want the subscriptions export, not the payments or invoices export.

The CSV will have columns like these (the exact names can vary slightly depending on your Stripe version):

id, customer_id, status, plan_amount, plan_interval, plan_currency, quantity, current_period_start, current_period_end, canceled_at

The columns that matter most for MRR:

  • status — is this subscription active, canceled, past_due, etc.?
  • plan_amount — the price in cents (Stripe stores amounts in cents, so $49/month shows as 4900)
  • plan_interval — "month" or "year"
  • quantity — how many seats or units (defaults to 1)
  • canceled_at — when the customer cancelled, if they did

Step 2: Filter to active subscriptions only

You only want subscriptions where status is active or trialing (if you count trials as MRR, which most early-stage founders do). Remove anything with status canceled, incomplete, or incomplete_expired.

If canceled_at has a date in the past, that subscription is gone. Filter it out.

Step 3: Normalize annual plans to monthly

This is the step people forget. If a customer is paying $588/year, their monthly MRR contribution is $588 / 12 = $49/month. Not $588.

For each row, check the plan_interval column:

  • If it says "month", the MRR is plan_amount * quantity
  • If it says "year", the MRR is (plan_amount * quantity) / 12

Step 4: Add it all up

Let's walk through a concrete example. Say you have a small SaaS with 8 active subscriptions:

Customer       Plan       Interval   Amount    Qty   Monthly MRR
─────────────────────────────────────────────────────────────────
Alice          Pro        month      $49       1     $49
Bob            Starter    month      $19       1     $19
Charlie        Pro        year       $468      1     $39
Diana          Starter    month      $19       1     $19
Eve            Team       month      $99       3     $297
Frank          Pro        month      $49       1     $49
Grace          Starter    month      $19       1     $19
Hank           Pro        year       $468      1     $39
─────────────────────────────────────────────────────────────────
                                          Total MRR: $530

Notice a few things:

  • Charlie and Hank are on annual plans. Their plan_amount is $468/year, which normalizes to $39/month.
  • Eve has a quantity of 3 (three seats on the Team plan), so her MRR is $99 x 3 = $297.
  • Everyone else is straightforward: monthly plan, quantity 1.

Your ending MRR for this month is $530.

Step 5: Break down the MRR movement

If you want to understand why your MRR changed from last month, you need to classify each customer's MRR into categories:

  • New MRR — revenue from customers who weren't paying you last month
  • Expansion MRR — additional revenue from customers who upgraded or added seats
  • Contraction MRR — revenue lost from customers who downgraded
  • Churned MRR — revenue lost from customers who cancelled entirely

The formula ties together like this:

Ending MRR = Starting MRR + New MRR + Expansion MRR - Contraction MRR - Churned MRR

Let's say last month your MRR was $450. This month it's $530. That's a net change of +$80. But that $80 might break down as:

Starting MRR:       $450
+ New MRR:          +$68   (Diana and Grace signed up)
+ Expansion MRR:    +$99   (Eve added 2 seats)
- Contraction MRR:  -$10   (Bob downgraded from Pro to Starter)
- Churned MRR:      -$17   (one customer cancelled)
                    ─────
= Ending MRR:       $530   (wait, let me check that math...)

(Okay, the sample numbers don't add up perfectly because I kept the example simple. In real life, you'd reconcile each customer row by row. And that's exactly the point... it gets tedious fast.)

Step 6: Compute the derived metrics

Once you have your MRR movement, you can compute a few more numbers that tell you how healthy your business is:

  • Customer churn rate = churned customers / start-of-month active customers. If you started with 50 customers and lost 2, that's 4%.
  • ARPU (Average Revenue Per User) = ending MRR / active customers. With $530 MRR and 8 customers, your ARPU is about $66.
  • MRR growth rate = net MRR change / starting MRR. That's $80 / $450 = 17.8% for the month.
  • Quick Ratio = (new MRR + expansion MRR) / (contraction MRR + churned MRR). Higher is better. Above 4 is excellent.

Where the spreadsheet breaks down

If you have 8 customers, the spreadsheet approach works fine. You might even enjoy it. (No judgment.)

But here's where it starts to fall apart:

Mixed intervals get messy. When half your customers are on monthly plans and the others are annual, quarterly, or custom, every row needs different normalization. Miss one and your MRR is wrong.

Classifying MRR changes requires last month's data. To know if a customer's MRR is "new", "expansion", or "contraction", you need to compare this month's subscription to last month's. That means maintaining a running spreadsheet across months. And if you change the structure, everything breaks.

Edge cases multiply. What about customers who cancelled and resubscribed in the same month? Customers with multiple subscriptions? Subscriptions with a trial that converted partway through the month? Each of these is solvable, but each adds another formula and another place where things can go wrong.

You also need to do this every month. The first time is a learning exercise. The twelfth time is a chore.

How MetricMint handles this

MetricMint does exactly what we just walked through, but automatically. You export your Stripe subscriptions CSV (two clicks in the Stripe dashboard), upload it, and get your monthly metrics pack in under a minute.

It normalizes annual plans, handles quantity-based subscriptions, classifies every customer's MRR movement, and computes all the derived metrics: churn rate, ARPU, MRR growth rate, Quick Ratio, and a per-customer breakdown showing exactly who churned, who expanded, and who's new.

You get a web report you can review immediately, plus a downloadable PDF that works as a standalone monthly briefing. Attach it to your investor update, share it with your cofounder, or just keep it for yourself.

No API keys to manage. No OAuth flows. No dashboard that tries to be everything. Just a clean monthly snapshot of your numbers.

So here's the takeaway

Calculating MRR from Stripe data is straightforward in theory:

  • Filter to active subscriptions only
  • Normalize annual and non-monthly plans to a monthly amount
  • Multiply by quantity for multi-seat subscriptions
  • Sum everything up for your ending MRR
  • Compare to last month to get your MRR movement breakdown

The formulas aren't complicated. The tedious part is doing it correctly every single month, handling edge cases, and not making a mistake in row 47 of your spreadsheet that throws off everything downstream.

Personally, I think every SaaS founder should understand how MRR works at this level. Even if you automate it later, knowing what the numbers actually mean makes you a better operator. But spending 45 minutes in a spreadsheet every month? That's time you could spend building.

If you want to skip the spreadsheet next month, MetricMint does all of this from a single Stripe CSV. It's free during the beta.