· Simple Data Foundry Team · Tutorials · 4 min read
Export Stripe data to Google Sheets
Stripe's dashboard exports are manual and stale the moment you download them. Here is how to keep customers, invoices and charges fresh in a sheet instead.

Short answer: Stripe’s dashboard export gives you a CSV download, not a live connection — it is out of date the moment it lands. A scheduled job pulls the same objects from the Stripe API and rewrites a tab on whatever cadence you choose, so the sheet is current without anyone touching it.
What you can pull
Eight Stripe resources, each as its own job:
| Resource | Typical use |
|---|---|
customers | The customer list, with metadata |
subscriptions | MRR, plan mix, churn |
invoices | Billing history, outstanding amounts |
charges | Individual payments and their status |
payment_intents | Attempts, including failures |
balance_transactions | What actually hit your balance, with fees |
products / prices | Your catalogue |
Records are fetched 100 per page — Stripe’s own maximum — and paged through.
Filtering by date
Both created_after and created_before are available, and they matter for two different reasons.
Keeping runs small. Refetching every charge you have ever taken, every hour, is wasteful and slow. Filter to a recent window and the run stays quick.
Building history deliberately. If you want a rolling window — the last 90 days of charges, overwritten each morning — set created_after and use overwrite mode. If you want a permanent log, append with a narrower window and let it accumulate.
Append or overwrite
The Sheets destination writes two ways, and the right answer depends on what the tab is for:
- Overwrite replaces the range. Correct for a snapshot: “current subscriptions”, “open invoices”. The tab always reflects now.
- Append adds rows underneath. Correct for a log you are building up over time.
There is no upsert for Google Sheets — a spreadsheet has no primary key, so there is nothing to merge on. If you need rows updated rather than replaced or added, send the same data to Airtable and upsert on the Stripe id, or to Postgres.
Tracking MRR
The common request, and the honest version of the answer.
Pull subscriptions, filter to active ones, and you have the raw material. Between the pull and the write you can select columns, filter rows, cast types and add computed fields — enough to normalise amounts and derive a monthly figure per subscription.
Two things to get right, because they are where spreadsheet MRR usually goes wrong:
Stripe amounts are in the smallest currency unit. A 5000 on a USD subscription is $50.00, not $5,000. Divide by 100 as a computed field, or you will present a number a hundred times too large to someone who will believe it.
Annual plans are not monthly. A yearly subscription at $1,200 is $100 of MRR, not $1,200. If you have mixed intervals, normalise before summing.
Computed fields take a restricted expression — abs, round, min, max, len, and col() for column names containing spaces. Deliberately not a general scripting environment: enough for unit conversions and arithmetic, not enough to hide business logic nobody can find later.
Setting it up
- Add a Stripe source and choose the resource. A restricted API key with read access is enough — this only ever reads.
- Choose Google Sheets. The connection asks for the spreadsheets scope and deliberately not Drive access, so you paste a spreadsheet URL rather than browsing your whole Drive.
- Pick the tab and range, and choose append or overwrite.
- Select your columns and add any computed fields.
- Schedule it. Daily before work covers most reporting. Hourly is worth it for payment monitoring; anything faster is usually noise.
Connect Stripe to Google Sheets →
Why not Zapier
Zapier is trigger-based: it fires per event, as events happen. That is the right shape for “post to Slack when a payment fails”, and the wrong shape for “this tab should hold all charges from the last 90 days” — which is a bulk query on a schedule, not a stream of events, and which gets expensive fast when you are billed per task.
Different job. If you want the event notification, use Zapier. If you want the table, use a scheduled pull.
Where else it can go
- Stripe to Airtable → — upsert on the Stripe
id, so records update rather than duplicate - Stripe to Postgres → — for joining against your own data in SQL



