Connecting Stripe to Google Sheets: what a sheet can tell you about MRR
Recurring revenue is a derived number, not a field. Which movements make it up, what a spreadsheet handles well, and where this stops being a sheet problem.
On this page
- What we'll cover
- Why Stripe cannot tell you your MRR
- The movements that make up the number
- Decisions you have to make
- Building it with CodeWords
- What the sheet should hold
- Churn, which is several numbers
- When to stop using a sheet
- Segments, which is where the number becomes useful
- Making it survive
- Limits worth knowing about
- What to build first
- Frequently asked questions
- Related reading
Most people pulling Stripe into a spreadsheet are trying to answer one question: what is our recurring revenue and which way is it moving. Stripe does not hold that number, because it is not a field — it is something you compute, from decisions about what counts.
A spreadsheet is a reasonable place to make those decisions, precisely because they are arguable and a sheet is where arguable things can be looked at. What it is not good at is being the permanent system of record for them, and knowing where that line is saves rebuilding this twice.
What we'll cover
- Why Stripe cannot tell you your MRR
- The movements that make up the number
- Decisions you have to make
- Building it with CodeWords
- What the sheet should hold
- Churn, which is several numbers
- When to stop using a sheet
- Segments, which is where the number becomes useful
- Making it survive
- Limits worth knowing about
- What to build first
- Frequently asked questions
Why Stripe cannot tell you your MRR
It holds subscriptions and invoices, which are the inputs rather than the answer.
Billing intervals differ. Annual, quarterly and monthly plans have to be normalised to a month, and how you do that is a choice.
Discounts and coupons may be temporary or permanent, and whether a discounted subscription counts at its list or its actual price is a decision.
Usage-based charges vary month to month, so what is recurring about them is a definition rather than a reading.
Trials, pauses and past-due states each need a rule about whether they count.
The number is only comparable to itself once those rules are fixed, which is the real reason to write them down.
The movements that make up the number
The useful report is not the total; it is the movement, which is what a spreadsheet does well.
New: subscriptions starting this period.
Expansion: existing customers paying more — upgrades, added seats, higher usage tiers.
Contraction: existing customers paying less, which is separate from churn and is frequently larger.
Churn: subscriptions ending.
Reactivation: customers returning after leaving, which distorts new-customer counts if it is not separated.
The four or five movements reconcile to the change in total, and a period where they do not reconcile has a bug in the definitions rather than in the arithmetic.
Decisions you have to make
Annual plans: divided by twelve, or recognised on billing. Both are used and they produce very different charts.
Discounts: at actual price, which is what you receive, or at list, which is what people often prefer to report.
Trials: excluded until they convert is the common answer.
Past due: still counted or not, which matters more than it sounds when involuntary churn is significant.
Usage: a trailing average, a committed minimum, or excluded entirely.
Write them down and keep them with the sheet, because every argument about this number is an argument about the definitions rather than the data.
Building it with CodeWords
CodeWords connects to more than 3,000 integrations, so Stripe, the sheet and your reporting destination can meet in one automation.
- Open CodeWords and start a new automation.
- Describe what should happen in plain language to Cody, the automation builder: which objects to pull, how movements are classified, and where the output goes.
- Authorize the connections — Stripe and Google Sheets.
- Describe the exceptions: a trial, a discounted subscription, a past-due account, a mid-period plan change.
- Run it over a closed quarter and check that the movements reconcile to the change in total.
You describe the outcome; Cody builds it, connects it, and deploys it. The free plan covers light use, with Pro at $39 per month and Business at $100 per month as usage grows; details are on the pricing page.
What the sheet should hold
One row per subscription per period, which is the shape that makes movement analysis possible.
The normalised monthly amount, alongside the raw amount and the interval.
The movement type for that period, computed rather than typed.
The customer identifier, so rows can be joined to anything else you hold.
The plan, and any discount, since segment analysis is the most common follow-up question.
A snapshot date, because restating history is what happens otherwise and then nothing agrees with what was reported last month.
Churn, which is several numbers
Customer churn and revenue churn differ, often substantially, and quoting one as the other is the most common error here.
Net revenue churn can be negative where expansion exceeds losses, which is a different and more informative statement than gross churn.
Voluntary and involuntary churn need separating, since failed payments are a fixable operational problem rather than a product one.
Cancellation reasons are not in Stripe unless you put them there, and they are the most useful field this system could carry.
The denominator matters. Churn over customers at the start, over average customers, or over revenue produces different numbers from the same data.
State the definition on the report, every time, for the same reason as everything else here.
When to stop using a sheet
Row counts grow with customers and periods, and a subscription-period grid reaches a spreadsheet's practical limits faster than expected.
More than a couple of joins — to product data, to support data, to marketing spend — is a database question.
When the numbers feed something external, such as a board pack or an investor update, the restatement risk gets expensive.
When several people edit, since a definitional change made by one person is invisible to everyone else.
When you need history, meaning point-in-time reconstruction of what was reported.
The sheet is a good place to decide the definitions and a poor place to keep them once they are settled.
Segments, which is where the number becomes useful
A single recurring revenue figure tells you very little beyond whether it went up. The same data cut by segment is where decisions come from, and a spreadsheet is well suited to producing those cuts.
By plan, which shows whether growth is coming from where you priced it to.
By cohort, grouped by the month they started, which is the only honest way to see whether retention is improving.
By acquisition channel, joined from your own data, since a channel's customers may behave very differently once they arrive.
By size, since a handful of large accounts and a long tail of small ones are two businesses with one total.
By tenure, which usually shows churn concentrated in the first months and a much steadier picture afterwards.
Cut before drawing conclusions. Almost every surprising movement in a blended number resolves into one segment doing something specific, and the blended view makes that invisible.
Making it survive
Key on the subscription and period and upsert, never append blindly.
Recompute rather than mutate, so a definitional fix can be applied to history consistently.
Handle proration and mid-period changes explicitly, which are the most common source of a movement that classifies strangely.
Handle multi-currency with a stated conversion approach and a stated rate date.
Report the outcome: subscriptions processed, movements by type, and whether they reconcile to the total.
Limits worth knowing about
Sheets has cell limits, which a per-subscription-per-period grid reaches faster than an order list.
Stripe's API is paginated and rate limited, so a full historical pull takes time.
Stripe's own dashboard metrics use its definitions, which may not match yours — a difference to explain rather than to resolve.
Proration creates partial amounts that are not recurring and should not be treated as such.
Refunds and disputes affect cash rather than recurring revenue, and mixing the two produces a number that is neither.
What to build first
The movement report: new, expansion, contraction, churn and reactivation for the last closed month, reconciling to the change in total. It is more useful than the total on its own, and the reconciliation is a genuine check — if the movements do not sum to the change, a definition is wrong, and you find that out now rather than in a board meeting.
Two habits make the difference. Write the definitions down and keep them beside the sheet, since every dispute about recurring revenue turns out to be a dispute about method. And snapshot each period rather than recomputing history on every run, because silently restating last month is how a report loses the confidence of everybody reading it.
Frequently asked questions
Why does Stripe not show my MRR?
Because it holds subscriptions and invoices, which are inputs rather than an answer. Normalising billing intervals, handling discounts, usage charges, trials and past-due states are all decisions, and the number only becomes comparable once those rules are fixed.
What is the most useful subscription report?
The movements — new, expansion, contraction, churn and reactivation — rather than the total. They should reconcile to the change in total, and a period where they do not indicates a definitional bug.
Should annual plans be divided by twelve?
It is one of two common treatments, the other being recognition on billing. Both are used and they produce very different charts, so the important thing is choosing one and recording it.
Is contraction the same as churn?
No, and it is frequently larger. Existing customers paying less is a separate movement from customers leaving, and collapsing them hides which problem you actually have.
What is the most common churn reporting error?
Quoting customer churn as revenue churn or the reverse. They differ substantially, and net revenue churn can be negative where expansion exceeds losses — which is a different statement from gross churn.
Should failed payments count as churn?
Separate them. Involuntary churn from failed payments is a fixable operational problem, and mixing it with voluntary cancellations hides a recoverable loss inside a product conclusion.
When should I move off a spreadsheet?
When row counts approach the cell limit, when you need more than a couple of joins, when the numbers feed a board pack, when several people edit the definitions, or when you need point-in-time history.
Why snapshot each period?
Because recomputing history on every run silently restates what was previously reported. Once a number in last month's board pack no longer matches the sheet, nobody trusts either.
Why segment recurring revenue?
Because a blended total only tells you the direction. Almost every surprising movement resolves into one segment doing something specific — a plan, a cohort, a channel, a size band — and the blended view hides which.
What is the most honest retention view?
Cohorts grouped by start month. It is the only cut that shows whether retention is actually improving, since a blended churn rate moves with the mix of new and old customers rather than with retention itself.