Live Stripe MRR in Google Sheets (in under 5 minutes)
Stripe shows you MRR. Stripe does not let you slice MRR by plan, by cohort, or by anything you wish you could. The Dashboard's "MRR" tile is read-only, not reportable, and missing half the breakdowns finance teams actually need.
The usual fixes are bad:
- Apps Script. Works. Requires writing 100 lines of code and re-handling pagination + auth refresh every time Stripe changes the API. You'll do this once and never again.
- Zapier / Make. Works for triggers. Not built for "pull the last 1,000 subscriptions on demand".
- Paid SaaS dashboards (ChartMogul, Baremetrics). Great for $200+/month. Overkill if you just want MRR in a sheet you can pivot.
The fast lane is BYOK: a $199 lifetime add-on with a Stripe connector that hits your dashboard's API directly, no proxy, no markup. Here's how the whole thing fits together.
What you'll be able to do
=MRR()-style cell that updates on refresh.- Subscriber list with plan, MRR contribution, and start date as rows.
- Top 20 customers by revenue, ranked.
- Recent failed payments and overdue invoices.
- Daily / weekly / monthly auto-refresh — schedule once, forget.
The 5-minute setup
Step 1: install gptsheet
Open any Google Sheet → Extensions → Get add-ons → search "gptsheet" → install. Activate your Pro license (the Stripe connector is in the Pro tier).
Step 2: create a Stripe restricted key
Stripe Dashboard → Developers → API keys → "Create restricted key". Name it something like gptsheet-reader. Grant read-only permissions for:
- Customers
- Subscriptions
- Charges
- Invoices
- Balance
- Payment Intents
Copy the resulting rk_live_... key. (Or rk_test_... for test mode.) Restricted keys are revocable and least-privilege — much safer than a full secret key.
Step 3: wire it up
In the gptsheet sidebar → Menu → Connectors → Stripe → paste the key → Connect. The connector verifies by making a single GET /balance call. If you see ✓ Connected, you're in.
Pulling the first numbers
Each connector ships with a set of canned actions. Click "▶ Run now" to write rows into the active cell. Some examples:
| Action | Returns |
|---|---|
| List active subscriptions | One row per subscription, with customer email, plan, MRR contribution, status. |
| List customers (last 100) | Customer ID, email, created date, default payment method. |
| Search charges by date | All charges since a given date. Set the date as a parameter. |
| List invoices status=open | Outstanding invoices. The set you'll chase next week. |
| Balance summary | Available, pending, in-transit. Useful for cash-flow modelling. |
Computing MRR from the data
Stripe doesn't return MRR as a number — it returns subscriptions. You compute MRR by summing the normalized monthly value of each active sub. If you've imported List active subscriptions into rows starting at A2:
# Assuming columns: A=id, B=customer, C=plan, D=amount_cents,
# E=interval, F=interval_count, G=status
=SUMPRODUCT(
(G2:G1000="active") *
(D2:D1000 / 100) /
IFS(E2:E1000="month", F2:F1000,
E2:E1000="year", F2:F1000 * 12,
E2:E1000="week", F2:F1000 / 4.345)
)
Yearly subs get divided by 12. Monthly subs are kept as-is. Weekly subs (rare in SaaS) get scaled to monthly equivalent. The result: live MRR in one cell.
Slicing the same data
The whole point of Stripe-in-a-sheet is the pivot. With the active-subs data dumped into a range, every slice becomes a pivot table:
- MRR by plan: pivot on column C (plan), aggregate the MRR formula above.
- Cohort retention: bucket by
createdmonth, count active subscriptions still alive N months later. - Top 20 customers: sort the table by MRR contribution, take the top 20 rows.
- Failed payments: import "List invoices status=past_due" — a row per overdue invoice, with email and dunning info already present.
Auto-refresh
Click "▶ Run now" once, then look at Menu → Imports. The action is saved as an Import. Set its schedule to Hourly / 6h / Daily / Weekly. A single hourly time-trigger drives the refresh. Your MRR cell updates on the schedule with no further action.
Imports re-execute the saved request against the same target range, so your formulas don't break — they recompute against fresh data.
What about real-time?
If you genuinely need second-level freshness (e.g., live "money received today" tickers on a TV in the office), Stripe's webhook → Supabase → live-sheet approach is better. For 95% of finance ops — MRR, churn, top customers, cohort analysis — hourly refresh is more than enough and far cheaper to operate than a streaming pipeline.
Privacy note
gptsheet is BYOK. Your Stripe key is stored in your browser's localStorage, never uploaded to our servers. Every API call goes from your sheet to api.stripe.com directly. We see your license key when we verify it, and nothing else.
Going further
The same connector pattern works for:
- HubSpot / Salesforce / Apollo — pull deals + activities (CRM Pack).
- PostHog / Amplitude — event analytics queries into rows.
- MySQL / Postgres / DynamoDB — direct database queries with AI-generated SQL via the Ask SQL feature.
- GA4 / Search Console — traffic + acquisition metrics.
Anywhere your data lives, you can have it in a Sheet within 5 minutes.
Get Stripe (and 30+ more) in your sheet
Stripe connector is in the Pro tier — $199 lifetime. Includes PostHog, Amplitude, GA4, Search Console, Ghost.
Get gptsheet Pro