Subscription SaaS

Finance: Stripe + Sheets reporting hub

Daily revenue dashboard. No manual Stripe exports.

Finance exported Stripe CSVs weekly for board metrics. We built incremental sync into Sheets with MRR, churn, and payout tabs updated daily.

Timeline: 2–3 weeks

Context

Bootstrapped SaaS; finance lead part-time. Needed investor-ready numbers without ChartMogul fees.

Challenge

  • Manual CSV exports missed mid-week spikes; board saw stale numbers.
  • Multiple Stripe products made pivot tables fragile when SKUs changed.
  • Payout reconciliation against bank deposits was a monthly fire drill.

Approach

  1. Stripe REST API with cursor-based pagination stored in Script Properties.
  2. Normalized Charges, Subscriptions, and Payouts into separate sheet tabs.
  3. Daily trigger at 6 AM; error emails to finance on API failure.

Solution

UrlFetchApp + Stripe secret key in Script Properties + summary KPI tab with QUERY() views.

Google Apps ScriptStripe APIGoogle SheetsUrlFetchApp

Outcome

  • Leadership opens one Sheet for daily MRR and cash view — no exports.
  • Monthly reconciliation time cut by ~70%.
  • Investor updates pull live numbers instead of week-old CSVs.

Technical approach

Scheduled trigger → paginated Stripe API calls → upsert by ID → refresh KPI tab → optional email if row count anomaly detected.

Lessons learned

Store Stripe object IDs for idempotent upserts. Version your KPI tab separately from raw imports. Monitor API failures — silent failures erode trust fast.

At a glance

Sync frequency
Daily 6 AM
Reconciliation
~70% faster
Integrations
Stripe + Sheets

More case studies

Discuss a similar build

Share your stack and constraints, we'll be honest about quotas, security, and timeline.