How to Analyze a Stripe Payments Export in a Spreadsheet
Reading a Stripe payments CSV: amounts, statuses, fees, and refunds — plus the MRR, churn, and failed-payment questions you can answer in minutes.
10 min read · Updated August 28, 2026
Stripe's dashboard is good at "how much did we collect this month." The exports are for everything else: net of fees by product, failed-payment patterns, refund rates by customer cohort, reconciling with the bank. The files are clean — Stripe is careful — but they have conventions that produce wrong numbers if you don't know them. This guide covers the three exports worth using, the conventions, and the questions each one answers.
Which export?
Stripe has several. Three cover most analysis:
| Export | Where | One row per | Use it for |
|---|---|---|---|
| Payments | Payments → Export | payment (charge / PaymentIntent) | revenue, fees, refunds, failures |
| Subscriptions | Billing → Subscriptions → Export | subscription | MRR, plan mix, churn |
| Balance transactions | Balance → Export | every ledger movement | reconciliation with payouts |
Choose the date range and all columns (the default column set omits metadata you may want). Files arrive as CSV.
Conventions that change your numbers
Amounts are in the major unit in exports — 24.00, not 2400. (The API uses cents; the CSV export does not.) If you also pull data from the API or from webhook logs, don't mix the two without dividing by 100.
Currency is a column. Multi-currency accounts must group by Currency before summing. Converted Amount and Converted Currency give the settlement-currency equivalent if you enabled it.
Status matters. The Payments export includes every attempt:
| Status | Meaning | Count as revenue? |
|---|---|---|
Paid / succeeded | Money collected | Yes |
Failed | Card declined, etc. | No — but count it for failure analysis |
Refunded | Fully refunded | No (or as negative) |
Partially refunded | Some returned | Amount − Amount Refunded |
Pending / Uncaptured | Not yet settled | No |
A raw =SUM(Amount) over the export counts failed and refunded payments as revenue. Always filter on status.
Fees are separate. Fee is Stripe's cut; Net = Amount − Fee. Refunds return the amount to the customer; whether the fee comes back depends on your account and timing, and shows up as a separate balance transaction.
Dates are UTC. Created (UTC) is explicit. A payment at 11pm Pacific on the 31st is the 1st in the export. For monthly revenue reporting, either accept UTC months or convert first.
Payments export: questions
- Gross, refunds, fees, net — by month. Four lines, one chart. This is the reconciliation table your accountant wants.
- Failure rate = failed ÷ (failed + succeeded), by month and by card brand (
Card Brandcolumn). A rising failure rate on one brand usually means a 3DS or issuer problem. - Failure reasons —
Decline Reasongrouped and counted.insufficient_fundsis a retry-later problem;do_not_honoris a customer problem;fraudulentis your problem. - Refund rate by customer — refunds ÷ payments per
Customer Email. A few customers usually account for most refunds. - Average payment size and its distribution — median beats mean here; one annual plan skews the average.
- Payments by description or product — the
Descriptioncolumn carries the invoice or product; group by it for revenue mix. - Repeat payers — distinct customers with 2+ successful payments. For non-subscription businesses this is your retention number.
Subscriptions export: questions
MRR is the sum, over active subscriptions, of the monthly-normalized plan amount: monthly plans as-is, annual plans ÷ 12, quantity-multiplied. The export has Status, Plan, Amount, Interval, Quantity, and Current Period Start/End.
- MRR by plan — normalize the interval first:
=IF(Interval="year", Amount/12, Amount) * Quantity. - Churn — subscriptions with
Status = canceledandCanceled Atin the month ÷ active at the start of the month. Needs a snapshot of the previous month; keep a monthly export. - Trials converting —
Trial Endin the past andStatus = activevscanceled. - Plan mix over time — count by
PlanandCreated (UTC)month.
Balance transactions: reconciliation
Each payout groups a set of balance transactions. Filter Type to charge, refund, stripe_fee, payout; the sum of everything except payouts should equal the sum of payouts over a closed period. When it doesn't, the difference is almost always a payout that crossed the period boundary or a dispute (Type = adjustment).
Doing it without formulas
All of the above are group-and-filter questions, which is what an AI assistant does well over a table. Upload the Payments export to ChatExcel and ask:
- "Gross revenue, refunds, fees, and net by month for succeeded payments, and chart net."
- "Failure rate by card brand."
- "Which five customers have the highest refunded amount, and what share of their payments was refunded?"
The assistant filters on Status and groups by Currency when you ask it to; make those two instructions part of the first question so they apply throughout. For MRR, upload the Subscriptions export and ask "MRR by plan, treating yearly amounts as amount ÷ 12 and multiplying by quantity, for active subscriptions only." Ask "how do I do that in Excel?" to get the SUMIFS version for your finance workbook.
Two sanity checks
- Net for a month should match the Stripe dashboard's Net volume for the same UTC month.
- The sum of
Netfor succeeded payments minus refunds, over a payout period, should match the payouts that landed in the bank. If it doesn't, check for disputes.
- Are Stripe export amounts in cents or dollars?
- CSV exports from the dashboard are in the major currency unit (dollars, euros). The API and webhook payloads use the minor unit (cents). Don't mix the two without dividing API amounts by 100.
- How do I calculate MRR from a Stripe export?
- Use the Subscriptions export, keep Status = active, normalize Amount by Interval (yearly ÷ 12), multiply by Quantity, and sum. Group by Plan for the mix. Stripe Billing analytics also reports MRR directly if you want to reconcile.
- Why don't my monthly totals match the Stripe dashboard?
- Usually one of three things: failed or refunded payments included in the sum, mixed currencies, or time zones — exports are UTC, and the dashboard may be set to your local zone.
- Does the Net column already subtract refunds?
- No. Net is Amount minus Stripe's fee for that payment. Refunds are separate rows or a separate Amount Refunded column depending on the export; subtract them explicitly.