· 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.

Export Stripe data to Google Sheets

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:

ResourceTypical use
customersThe customer list, with metadata
subscriptionsMRR, plan mix, churn
invoicesBilling history, outstanding amounts
chargesIndividual payments and their status
payment_intentsAttempts, including failures
balance_transactionsWhat actually hit your balance, with fees
products / pricesYour 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

  1. Add a Stripe source and choose the resource. A restricted API key with read access is enough — this only ever reads.
  2. 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.
  3. Pick the tab and range, and choose append or overwrite.
  4. Select your columns and add any computed fields.
  5. 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

Related Posts

View All Posts »
Import a CSV from a URL into Airtable

Import a CSV from a URL into Airtable

Point a job at a CSV link and it re-reads it on your schedule — no download, no manual import. Here is the setup, and the field-type trap to avoid first.

Mailchimp campaign reports in Airtable

Mailchimp campaign reports in Airtable

Mailchimp's reporting lives one campaign at a time. Here is how to get opens, clicks and bounces for every campaign into Airtable, updating on a schedule.