Why Stripe Reporting Is Harder Than It Looks
Stripe processes over $1 trillion in payments annually. For SaaS companies, it is the de facto billing platform. But Stripe is a payment processor, not an accounting system. The gap between Stripe's data model and your financial reporting needs is where most companies struggle.
Stripe tells you that a customer was charged $99. It does not tell you whether that charge represents new MRR, expansion MRR, or a one-time payment. It does not separate recognized revenue from deferred revenue. It does not categorize refunds by reason or attribute them to the correct reporting period. All of that interpretation is your job.
This guide covers how to extract accurate financial reports from Stripe data, handle the edge cases that trip up most companies, and build dashboards that reflect your true financial position.
Understanding the Stripe Data Model
Core Objects
Stripe organizes financial data across several interconnected objects. Understanding these relationships is essential for accurate reporting.
| Object | What It Represents | Financial Relevance |
|---|---|---|
| Customer | A person or business you charge | Customer count, segmentation |
| Subscription | Recurring billing agreement | MRR source, churn tracking |
| Invoice | Bill sent to a customer | Revenue recognition trigger |
| PaymentIntent | A charge attempt | Cash flow timing |
| Charge | Successful payment | Cash received |
| Refund | Money returned | Revenue reversal |
| Payout | Transfer to your bank | Bank reconciliation |
| BalanceTransaction | Every money movement | Source of truth for accounting |
The BalanceTransaction Is Your Source of Truth
For financial reporting, the BalanceTransaction object is the most important entity in Stripe. Every financial event — charges, refunds, disputes, payouts, fee deductions — creates a balance transaction with a net amount, fee, and timestamp.
When reconciling Stripe to your books, always start with balance transactions. They represent the actual money movement, including Stripe's fees, which charges and invoices do not.
Subscription Lifecycle Events
Each subscription event maps to a financial outcome:
| Subscription Event | MRR Impact | Revenue Impact |
|---|---|---|
customer.subscription.created | New MRR | Begin recognizing revenue |
customer.subscription.updated (upgrade) | Expansion MRR | Increased recognition |
customer.subscription.updated (downgrade) | Contraction MRR | Decreased recognition |
customer.subscription.deleted | Churned MRR | Stop recognizing revenue |
customer.subscription.paused | Paused MRR | Pause recognition |
customer.subscription.resumed | Reactivation MRR | Resume recognition |
invoice.payment_failed | At-risk MRR | Revenue at risk |
Calculating MRR from Stripe
The Correct Method
MRR (monthly recurring revenue) should be calculated from active subscriptions, not from payment amounts. Here is why: a customer on a $1,200/year plan who pays annually contributes $100/month to MRR, but Stripe records a single $1,200 charge.
Step-by-step MRR calculation from Stripe data:
- List all active subscriptions (
status: activeortrialingwith payment method) - For each subscription, get the recurring amount per billing interval
- Normalize to monthly: divide annual amounts by 12, multiply weekly by ~4.33
- Sum all normalized monthly amounts
- Exclude one-time charges, setup fees, and usage overages unless they are contractually recurring
MRR normalization table:
| Billing Interval | Normalization | Example |
|---|---|---|
| Weekly | Amount x 4.33 | $25/week = $108.25 MRR |
| Monthly | Amount x 1 | $99/month = $99 MRR |
| Quarterly | Amount / 3 | $270/quarter = $90 MRR |
| Semi-annual | Amount / 6 | $540/6mo = $90 MRR |
| Annual | Amount / 12 | $1,188/year = $99 MRR |
Use the SaaS metrics calculator to quickly calculate and track your MRR from subscription data.
MRR Movement Analysis
To understand growth, break MRR into components each month:
Net New MRR = New MRR + Expansion MRR + Reactivation MRR
- Contraction MRR - Churned MRR
Tracking MRR movements in Stripe:
- New MRR: Subscriptions where
createdtimestamp falls in the current period and the customer has no prior subscriptions - Expansion MRR: Subscriptions where
plan.amountincreased viacustomer.subscription.updated - Contraction MRR: Subscriptions where
plan.amountdecreased - Churned MRR: Subscriptions that transitioned to
canceledstatus - Reactivation MRR: Customers who had a previously canceled subscription and created a new one
Common MRR Calculation Mistakes
- Counting gross charges as MRR - Stripe fees are not subtracted from MRR. MRR is a gross metric.
- Including trial subscriptions without payment methods - These are not revenue-generating.
- Double-counting prorated charges - A mid-cycle upgrade generates a prorated charge AND changes the subscription amount. Only count the subscription change in MRR.
- Missing coupon/discount adjustments - A $99/month subscription with a 20% coupon contributes $79.20 to MRR, not $99.
- Ignoring multi-currency conversions - Convert all subscription amounts to your reporting currency at a consistent rate.
Read how to track MRR for a deeper dive into accurate MRR tracking methodology.
Handling Refunds and Disputes
Refund Types and Their Impact
| Refund Type | Financial Treatment | MRR Impact |
|---|---|---|
| Full refund (within period) | Reverse entire charge | Remove MRR if subscription canceled |
| Partial refund | Reduce recognized revenue | Reduce MRR proportionally if plan changed |
| Prorated refund (downgrade) | Credit for unused time | Contraction MRR |
| Goodwill refund | Expense or revenue reduction | Usually no MRR impact |
| Dispute/chargeback | Revenue reversal + fee | At-risk MRR, potential churn |
Refund Accounting
Refunds should be recorded as a reduction in revenue for the period in which they are issued, not backdated to the original charge period. This aligns with standard accounting practices:
- Refund issued: Debit Revenue, Credit Cash (or Refund Payable)
- Stripe fee on refund: Stripe does not refund their processing fee on partial refunds. The fee is a sunk cost.
- Dispute fee: Stripe charges a $15 dispute fee regardless of outcome. Record as an operating expense.
Dispute Management
Disputes (chargebacks) are both a financial and operational problem:
Financial impact of disputes:
- Original charge amount is reversed immediately
- $15 dispute fee per case
- If you win the dispute, the charge is reinstated (minus the fee in some cases)
- Dispute rates above 1% can trigger Stripe account review
Tracking disputes:
- Monitor
charge.dispute.createdwebhook events - Track dispute rate: disputes / total charges per month
- Categorize by reason code to identify patterns
- Maintain evidence templates for efficient responses
Multi-Currency Reporting
The Currency Challenge
If you accept payments in multiple currencies, financial reporting gets significantly more complex. Stripe processes each currency independently, which means your Stripe balance includes separate balances per currency.
Currency Conversion Approaches
| Approach | Accuracy | Complexity | Best For |
|---|---|---|---|
| Transaction-date rate | Highest | High | Companies with material FX exposure |
| Monthly average rate | Good | Medium | Most SaaS companies |
| Fixed quarterly rate | Adequate | Low | Small international revenue share |
Recommended approach for most SaaS companies:
- Choose a reporting currency (usually USD)
- Convert each subscription's MRR at the exchange rate on the date of calculation
- Record exchange rate gains/losses monthly
- Use a consistent rate source (e.g., European Central Bank daily rates)
Multi-Currency MRR Example
| Currency | Subscriptions | Local MRR | Exchange Rate | USD MRR |
|---|---|---|---|---|
| USD | 500 | $49,500 | 1.00 | $49,500 |
| EUR | 120 | EUR 11,400 | 1.08 | $12,312 |
| GBP | 80 | GBP 7,600 | 1.26 | $9,576 |
| CAD | 40 | CAD 5,200 | 0.74 | $3,848 |
| Total | 740 | $75,236 |
Exchange rate fluctuations directly affect your reported MRR even when no actual business changes occur. A 5 percent swing in EUR/USD on EUR 11,400 of MRR creates a $616 MRR movement that has nothing to do with customer activity.
Stripe Connect Reporting
What Stripe Connect Changes
Stripe Connect adds a layer of complexity for platforms that facilitate payments between buyers and sellers. Your financial reporting now involves three parties: the platform (you), the connected account (your merchant/seller), and the customer.
Connect payment flows:
| Flow Type | Who Collects Payment | Fee Deduction | Platform Revenue |
|---|---|---|---|
| Direct charge | Connected account | From connected account | Application fee |
| Destination charge | Platform | From platform | Total minus transfer |
| Separate charges and transfers | Platform | From platform | Total minus transfer |
Platform Revenue Recognition
Your platform revenue from Connect is typically the application fee or the spread between what the customer pays and what the connected account receives. This is fundamentally different from direct subscription revenue.
Connect revenue calculation:
Platform Revenue = Gross Payment - Connected Account Payout - Stripe Fees
Track application fees separately from subscription revenue in your P&L. They are different revenue streams with different characteristics, margins, and growth drivers.
Connected Account Payouts
When reporting on connected accounts:
- Gross merchandise volume (GMV) is the total amount processed through your platform
- Take rate is your platform's revenue as a percentage of GMV
- Net revenue is your take rate amount minus Stripe processing fees
Most platforms report GMV and take rate separately. Investors care about both: GMV shows scale, take rate shows monetization strength.
Reconciliation
Stripe-to-Bank Reconciliation
Stripe pays out to your bank account based on your payout schedule (usually 2-day rolling for US accounts). Each payout bundles multiple transactions, making direct reconciliation non-trivial.
Reconciliation process:
- Download Stripe payout report for the period
- Match payout amounts to bank deposits (Stripe shows the payout ID and amount)
- Reconcile individual transactions within each payout to invoices/charges
- Verify fees - Stripe deducts processing fees before payout
- Check for holds - Stripe may hold funds for disputes or risk review
Read Stripe payout reconciliation for a detailed walkthrough of matching payouts to bank deposits.
Common reconciliation issues:
| Issue | Cause | Resolution |
|---|---|---|
| Payout doesn't match bank deposit | Currency conversion, bank fees | Check Stripe payout currency vs. bank currency |
| Missing transactions in payout | Refund or dispute processed after payout creation | Check refund/dispute timestamps |
| Timing differences | Stripe payout in transit | Allow 2-3 business days for bank processing |
| Fee discrepancies | Variable fees (international cards, currency conversion) | Review fee breakdown per transaction |
Stripe-to-Accounting Reconciliation
Your accounting system should mirror Stripe's balance transactions. Monthly reconciliation steps:
- Export Stripe balance transactions for the month
- Categorize by type: charges, refunds, disputes, fees, payouts, transfers
- Match to accounting entries: revenue, refunds, bank deposits, expense
- Verify totals: Sum of all balance transactions should equal net change in Stripe balance + payouts
- Investigate discrepancies: Any difference indicates a missing or incorrect entry
Target: zero discrepancy between Stripe balance transaction totals and your accounting records.
Revenue Reconciliation
Revenue reconciliation verifies that your reported MRR/revenue matches the actual subscription data:
Expected Monthly Revenue = Sum of (Active Subscriptions × Monthly Normalized Amount)
Actual Revenue = Sum of (Invoices Paid in Period, excluding one-time charges)
Difference = Timing adjustments, proration, coupons, mid-cycle changes
If the difference exceeds 3-5 percent, investigate. Common causes: mid-cycle plan changes creating prorated amounts, coupons not accounted for, or trial-to-paid conversions being misclassified.
Building Dashboards from Stripe Data
Essential Stripe Dashboard Metrics
Build a dashboard that answers your key financial questions using Stripe data:
Revenue dashboard:
- MRR (current, trend, movement components)
- MRR by plan/product
- New vs. expansion vs. churned MRR
- ARPU (average revenue per user)
- Revenue by currency
Cash flow dashboard:
- Gross volume processed
- Net volume after fees
- Refund rate and amount
- Payout timeline and amounts
- Stripe balance (funds in transit)
Health dashboard:
- Churn rate (subscription cancellations / active subscriptions)
- Failed payment rate and recovery
- Dispute rate
- Average days to receive payout
Data Pipeline Architecture
For accurate dashboards, build a data pipeline from Stripe:
- Webhooks for real-time events (subscription changes, charges, refunds)
- API polling for periodic snapshots (active subscriptions list, balance)
- Data warehouse for historical analysis (sync Stripe data to your database)
- Calculation layer for derived metrics (MRR, churn rate, NRR)
- Visualization for dashboards (your app, Metabase, or similar)
The SaaS metrics calculator provides a starting point for understanding your metrics before building custom dashboards.
Stripe Sigma and Reporting
Stripe offers two built-in reporting tools:
Stripe Dashboard Reports (free): Basic reports on payments, payouts, and customers. Useful for quick checks but limited customization.
Stripe Sigma (paid): SQL-based querying against your Stripe data. Powerful for custom analysis but requires SQL knowledge and carries additional cost ($0.02 per query row read).
For most early-stage SaaS companies, exporting data via the API or CSV and analyzing in a spreadsheet or dedicated tool is more cost-effective than Sigma.
Common Stripe Reporting Pitfalls
Mixing Up Charges, Revenue, and Cash
These are three different numbers:
| Concept | What It Represents | Source |
|---|---|---|
| Gross charges | Total amount charged to customers | charge.amount |
| Net charges | Charges minus Stripe fees | balance_transaction.net |
| Recognized revenue | Revenue earned in the period | Subscription schedule + ASC 606 |
| Cash received | Money deposited in your bank | Payout amounts |
A $1,200 annual charge creates $1,200 in gross charges, ~$1,165 in net charges (after ~$35 in Stripe fees), $100/month in recognized revenue, and a bank deposit that arrives 2 days later as part of a bundled payout.
Ignoring Stripe Fee Variability
Stripe's published rate of 2.9% + $0.30 per transaction is the starting point. Actual fees vary based on:
- Card type: International cards cost more (+1-1.5%)
- Card brand: Some cards carry higher interchange
- Currency conversion: Additional 1% for cross-border transactions
- Disputes: $15 per dispute regardless of outcome
- Stripe products: Billing, Connect, Radar add their own fees
Use the Stripe fee calculator to model your actual fee burden based on your transaction mix.
Not Handling Webhooks Reliably
If your financial reporting depends on Stripe webhooks (and it should), you need reliable webhook processing:
- Verify webhook signatures to prevent spoofing
- Handle duplicate events (Stripe may send the same event multiple times)
- Process events idempotently so replays don't create duplicate records
- Monitor for missed events with periodic API reconciliation
- Log all webhook payloads for debugging and audit
Learn more about handling Stripe reporting with multiple products to manage webhook complexity.
Getting Started
Stripe is a powerful payment platform, but it is not a financial reporting system. The gap between Stripe's data and your financial statements requires deliberate work to bridge.
Start with these steps:
- Audit your current MRR calculation - Is it based on subscriptions or charges? Are you normalizing annual plans correctly?
- Set up monthly reconciliation - Match Stripe balance transactions to your accounting entries
- Build a basic dashboard - Track MRR, churn, and cash flow from Stripe data
For automated Stripe financial reporting — including real-time MRR tracking, payout reconciliation, and revenue dashboards — try culta.ai. We connect directly to your Stripe account and handle the data transformation so you always have accurate financial metrics.