All guides

Export Stripe data to CSV: which export to take, what it holds, and matching payouts to the bank

Stripe offers several CSV exports and people often take the wrong one: the payments list, one row per charge; the balance transactions, one row per charge, refund, fee and payout; and the payouts, one row per transfer to the bank. A bank statement line is one payout, and a payout is the net of many transactions, so reconciling means adding those back up. The query below does that over the sample file, and every amount stays the text Stripe wrote — no retyping, no rounding.

Which export to download

By Stripe’s documentation there are three kinds to choose from. The Payments page has an Export button that asks for a time zone, a date range and the columns to include, and can be limited to successful, refunded or uncaptured payments: one row per payment, with its fee. The export of all balance transactions has one row per charge, refund, fee and payout, with the columns Type, Amount, Fee, Net and Transfer — the payout each row was bundled into — and it is the file this page’s sample and query follow. Under Reports, the Balance summary report and the Payout reconciliation report download itemized files built for accounting.

For sales figures, take the payments export. To add payouts back up to the bank, take the balance transactions export, because the query reads its Type, Amount, Net and Transfer columns by name. The itemized reports carry the same money under their own headings — reporting_category rather than Type, gross rather than Amount — and the balance summary’s activity section leaves payouts out, so the query will not run on one of those unchanged. Stripe moves buttons from time to time; if a menu is not where this page says, Stripe’s own help search for “export” finds the current one.

What the export usually contains

A balance-transactions export has a row for each movement of money: charges with their fee and net, refunds as negatives, Stripe’s own fees, adjustments, and the payouts themselves, which appear as negative amounts because money left the balance. Timestamps are in UTC and say so in the column heading; amounts are in the currency’s ordinary units with two decimals; and a column carries the id of the payout each transaction was bundled into, so the rows can be grouped by it.

A payouts export is the other view: one row per transfer, with its amount, currency, status and arrival date. It is what the bank statement should agree with, line for line, once the fees are understood.

Add each payout back up

The SQL console here opens with a query that groups the balance transactions by payout, sums the net of everything except the payout row itself, and shows it beside what was paid out. On the sample file the two columns agree to the cent, which is the point: when they disagree on your export, the transactions that were bundled after the export was taken, or a refund that landed in a different payout, are what to look for.

Drop your own export and change the table name in the query to the one the console gives your file. Amounts are converted only inside the sum; the values in the grid and in the download stay the exact text Stripe wrote.

Against the bank statement

With one line per payout, the bank statement is a matter of ticking off amounts and dates. When the two are both files, the compare tool lists what is in one and not the other; when the payout ids appear in the bank’s reference field, the merge tool lines the two files up by that id and shows the rows with no match.

A refund issued after the payout it belongs to reduces a later payout, not the original — that is the commonest reason a month’s payouts do not equal a month’s sales.

Into a database, a BI tool or JSON, once

For a one-off load into PostgreSQL, MySQL, SQLite or SQL Server, the CSV-to-SQL converter here writes a CREATE TABLE and batched INSERT statements for the one you pick. Every column is declared as text, so an id like ch_1A and an amount like 49.00 arrive exactly as Stripe wrote them; convert the amounts to numbers in the database, where a failed conversion shows which row is wrong.

For JSON — a script to feed, or a tool that takes nothing else — the CSV-to-JSON converter writes one object per row, and writes every value as a JSON string, so "49.00" stays "49.00" and never becomes 49; a blank cell and a missing one stay different.

Power BI, Tableau and Qlik each open a CSV directly, so the export needs no conversion — only trimming. Delete the columns nobody will chart, and cut the rows to the period you need, before loading. If the file has to pass through Excel on the way, turn it into a workbook with the CSV-to-Excel converter first: long ids and amounts go in as text cells, and Excel has nothing to retype.

This is for a file, not a feed. A dashboard that has to stay current needs the data refreshed on a schedule, which Stripe sells as Data Pipeline — sending your account’s data to Snowflake, Amazon Redshift, BigQuery or Databricks — and which extract-and-load services also do. None of that is something a page in your browser can offer.

The sample file

id,Type,Source,Amount,Fee,Net,Currency,Created (UTC),Available On (UTC),Description,Customer Email,Transfer
txn_1A,charge,ch_1A,49.00,1.72,47.28,usd,2024-01-29 14:02:11,2024-01-31 00:00:00,Order #1001,amira.khan@example.com,po_0131
txn_1B,charge,ch_1B,120.00,3.78,116.22,usd,2024-01-29 16:45:09,2024-01-31 00:00:00,Order #1002,tomasz.nowak@example.com,po_0131
txn_1C,refund,re_1C,-49.00,-1.72,-47.28,usd,2024-01-30 09:12:40,2024-01-30 09:12:40,Refund of order #1001,amira.khan@example.com,po_0131
txn_1D,payout,po_0131,-116.22,0.00,-116.22,usd,2024-01-31 00:00:00,2024-01-31 00:00:00,STRIPE PAYOUT,,po_0131
txn_1E,charge,ch_1E,75.50,2.49,73.01,usd,2024-02-01 10:30:00,2024-02-03 00:00:00,Order #1003,chen.wei@example.com,po_0203
txn_1F,charge,ch_1F,15.00,0.74,14.26,usd,2024-02-01 18:20:33,2024-02-03 00:00:00,Order #1004,priya.raman@example.com,po_0203
txn_1G,stripe_fee,,-2.00,0.00,-2.00,usd,2024-02-02 00:00:00,2024-02-02 00:00:00,Radar fee,,po_0203

Obviously made-up data, small enough to read. Download it and drop it on the tool to see the fix before trying your own file.

Questions

Why are the payouts negative in the export?
Because the export is a ledger of the balance: money in is positive, money out is negative, and a payout is money out to your bank. Multiply by minus one, as the query does, to read it as an amount received.
Are the times local or UTC?
UTC, and the heading says so. A payout dated 31 January at 00:00 UTC arrived at the bank on a local date that may differ; match on amount and payout id, not on the date alone.
Why does the sum of net for a payout not equal the payout?
Usually a transaction bundled after the export was taken, a refund or dispute that landed in a later payout, or a currency conversion. Group by payout id as the query does and the odd one out is visible.
Can I merge the payouts with my bank statement file?
Yes, on any shared value — the payout id if your bank shows it in the reference, otherwise the amount. The merge tool matches the two files by the column you choose and lists the rows with no match.
Will the amounts be changed or rounded?
Not in the data. The query converts them to numbers inside the sum only; the grid and the download carry the exact text from the export, including trailing zeros.
How do I export all the data from my Stripe account?
For the money, export all balance transactions over the whole date range: every charge, refund, fee, adjustment and payout that moved your balance, one row each. Payments and customers have exports of their own; everything in one scheduled copy is what Stripe’s Data Pipeline is for.
Can I load a Stripe export into PostgreSQL or Power BI from here?
Once, yes: the CSV-to-SQL converter writes the statements for PostgreSQL and three other databases, and Power BI opens the CSV itself. For a table that stays in step with Stripe, a scheduled sync such as Stripe’s Data Pipeline is the tool.
Is my export uploaded anywhere?
No. Your payouts are added back up by a database engine running in this page; the balance history is reconciled without a single transaction leaving your device.