Connecting Stripe to Google Sheets: what a sheet can tell you about MRR
Connect Stripe to Google Sheets and work out MRR: the movements behind it, what a sheet handles well and when to outgrow it.
On this page
- What we'll cover
- Key takeaways
- 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 the report reliable
- Limits of a Stripe-to-Sheets report
- What to build first
- Frequently asked questions
- Related reading
To connect Stripe to Google Sheets and report recurring revenue, pull subscriptions into a sheet with one row per subscription per period, normalise each amount to a month, and classify the change into new, expansion, contraction, churn, and reactivation. Stripe does not store monthly recurring revenue (MRR) as a field, because MRR is a number you compute from decisions about what counts.
A spreadsheet is a good place to make those decisions, because they are arguable and a sheet lets people look at them. A sheet is a poor permanent system of record, and knowing where that line sits saves rebuilding the report 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 the report reliable
- Limits of a Stripe-to-Sheets report
- What to build first
- Frequently asked questions
Key takeaways
- Stripe holds subscriptions and invoices, which are the inputs to MRR, so you must define the calculation yourself.
- Report the movements (new, expansion, contraction, churn, reactivation), because they must reconcile to the change in the total.
- Write down your decisions on annual plans, discounts, trials, past-due accounts, and usage, and keep them beside the sheet.
- Separate customer churn from revenue churn, and voluntary churn from failed-payment churn.
- Snapshot each period so the report never silently restates last month.
Why Stripe cannot tell you your MRR
Stripe cannot tell you your MRR because it holds subscriptions and invoices, which are inputs, and the answer depends on rules you choose. Fixing those rules makes the number comparable over time.
Billing intervals differ. Annual, quarterly, and monthly plans have to be normalised to a month, and the method is a choice.
Discounts and coupons may be temporary or permanent. Whether a discounted subscription counts at list price or actual price is a decision.
Usage-based charges vary from month to month, so what counts as recurring about them is a definition, not a reading.
Trials, pauses, and past-due states each need a rule about whether they count.
The number is comparable only to itself once those rules are fixed, which is the reason to write them down.
The movements that make up the number
The movements are the useful report, not the total. A spreadsheet handles movement analysis well, and the movements must reconcile to the change in total.
| Movement | Meaning |
|---|---|
| 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 |
| Churn | Subscriptions ending |
| Reactivation | Customers returning after leaving; separate it so it does not distort new-customer counts |
Contraction is separate from churn and can be larger than churn. When the movements do not sum to the change in total, a definition has a bug, not the arithmetic.
Decisions you have to make
You must decide five treatments before MRR is comparable. Write each one down and keep it with the sheet, because every argument about this number is an argument about definitions.
| Item | Common options |
|---|---|
| Annual plans | Divide by twelve, or recognise on billing; the two produce very different charts |
| Discounts | Actual price (what you receive) or list price (what people often prefer to report) |
| Trials | Exclude until they convert |
| Past due | Count or exclude; the choice matters when involuntary churn is significant |
| Usage | Trailing average, committed minimum, or excluded entirely |
Building it with CodeWords
CodeWords connects to 3,000+ integrations (CodeWords pricing page, 2026), 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 the automation 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 costs $0, Pro costs $39 per month, and Business costs $100 per month (CodeWords pricing page, 2026). Details are on the pricing page.
What the sheet should hold
The sheet should hold one row per subscription per period, because that shape makes movement analysis possible. Six columns cover the report.
One row per subscription per period.
The normalised monthly amount, beside the raw amount and the interval.
The movement type for that period, computed instead of typed.
The customer identifier, so rows join to anything else you hold.
The plan and any discount. Segment analysis is the most common follow-up question.
A snapshot date. Without it, history gets restated and nothing agrees with last month's report.
Churn, which is several numbers
Churn is several numbers, and the report must state which one it shows. The most common error is quoting customer churn as revenue churn.
Customer churn and revenue churn differ, often substantially.
Net revenue churn can be negative where expansion exceeds losses. That statement is more informative than gross churn.
Voluntary and involuntary churn need separating. Failed payments are a fixable operational problem, not a product problem.
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 gives different numbers from the same data.
State the definition on the report every time.
When to stop using a sheet
Stop using a sheet as the permanent record when the data outgrows it or the numbers leave your team. Five signals indicate the move.
Row counts grow with customers and periods, and a subscription-period grid reaches a spreadsheet's practical limits quickly.
More than a couple of joins (to product data, support data, or marketing spend) is a database question.
The numbers feed something external, such as a board pack or an investor update. Restatement risk then becomes expensive.
Several people edit the sheet. A definitional change by one person is invisible to everyone else.
You need history: point-in-time reconstruction of what was reported.
Use the sheet to decide the definitions, and move the definitions to a database once settled.
Segments, which is where the number becomes useful
Segments turn one recurring revenue figure into decisions. A blended total shows direction only, and a spreadsheet produces these cuts well.
By plan, to show whether growth comes from where you priced it to.
By cohort, grouped by start month. This is the clearest way to see whether retention is improving.
By acquisition channel, joined from your own data, because a channel's customers may behave very differently once they arrive.
By size. A handful of large accounts and a long tail of small ones are two businesses with one total.
By tenure, which tends to show churn concentrated in the first months.
Cut before drawing conclusions. A surprising movement in a blended number usually resolves into one segment doing something specific.
Making the report reliable
A reliable report keys rows on subscription and period, recomputes history consistently, and states how it handles proration and currency.
Key on the subscription and period and upsert (update or insert), never append blindly.
Recompute instead of mutating, so a definitional fix applies to history consistently.
Handle proration and mid-period changes explicitly. They 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 of a Stripe-to-Sheets report
A Stripe-to-Sheets report has five limits.
Google 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 Stripe's definitions, which may not match yours. Explain the difference instead of trying to resolve it.
Proration creates partial amounts that are not recurring and should not be treated as such.
Refunds and disputes affect cash, not recurring revenue. Mixing the two produces a number that is neither.
What to build first
Build the movement report first: new, expansion, contraction, churn, and reactivation for the last closed month, reconciling to the change in total. The report is more useful than the total alone, and the reconciliation is a real check. If the movements do not sum to the change, a definition is wrong, and you find that out now instead of in a board meeting.
Two habits make the difference. Write the definitions down and keep them beside the sheet, because every dispute about recurring revenue turns out to be a dispute about method. And snapshot each period instead of recomputing history on every run, because silently restating last month costs the report the trust of its readers.
Frequently asked questions
Why does Stripe not show my MRR?
Stripe does not show MRR because it holds subscriptions and invoices, which are inputs, not an answer. Normalising billing intervals and handling discounts, usage charges, trials, and past-due states are all decisions, and MRR becomes comparable only once you fix those rules.
What is the most useful subscription report?
The most useful report shows the movements (new, expansion, contraction, churn, and reactivation) instead of only the total. The movements should reconcile to the change in total, and a period where they do not reconcile indicates a bug in the definitions.
Should annual plans be divided by twelve?
Dividing by twelve is one of two common treatments, and recognition on billing is the other. Both are used, and they produce very different charts, so the important step is to choose one treatment and record it beside the sheet.
Is contraction the same as churn?
No, contraction is not churn. Contraction means existing customers paying less, while churn means subscriptions ending. Contraction can be larger than churn, and collapsing the two hides which problem you actually have.
What is the most common churn reporting error?
The most common error is quoting customer churn as revenue churn, or the reverse. The two differ substantially. Net revenue churn can also be negative where expansion exceeds losses, which is a different statement from gross churn.
Should failed payments count as churn?
Report failed-payment churn separately from voluntary cancellations. 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?
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 of what you reported.
Why snapshot each period?
Snapshot each period because recomputing history on every run silently restates what you reported earlier. Once a number in last month's board pack no longer matches the sheet, readers stop trusting both, and the report loses its purpose.
Why segment recurring revenue?
A blended total shows only direction. A surprising movement usually resolves into one segment doing something specific, such as a plan, a cohort, a channel, or a size band, and the blended view hides which segment. Cut the data before drawing conclusions.
What is the most honest retention view?
Cohorts grouped by start month are the most honest retention view. They show whether retention is improving, because a blended churn rate moves with the mix of new and old customers instead of with retention itself.