How to Read a Stripe Balance Transaction CSV
The Payout Reconciliation (Itemized) CSV from Stripe gives you one row per balance transaction and one row for the payout itself. Once you know the key columns and the sign convention, you can prove a payout equals its component transactions.
The short answer: group rows by their
automatic_payout_id, then add the Net column for the
component rows. The total equals the payout amount and your bank deposit. Each
row’s Net is its Gross minus its
Fee.
The columns that matter
The itemized report is built on Stripe’s balance transactions. The columns you need most are:
balance_transaction_id— the unique id of the event (txn_…).automatic_payout_id— the payout (po_…) each row belongs to; this is how you group rows into one payout.reporting_category— what kind of event it is:charge,refund,fee,dispute,payout,adjustment, currency conversion, and so on.type— the granular event type (Stripe recommends grouping byreporting_categoryfor accounting).created— when the event happened.available_on(orautomatic_payout_effective_at) — when the funds settled and became eligible for payout; this is the date to match against your bank deposit.currency— ISO currency code.gross— the transaction amount before Stripe’s fee. (In the Balance Transactions API the same value is calledamount; the report labels itgross.)fee— the fee for that transaction.net— the impact on your balance, equal togross − fee.trace_id— the bank-level reference used to find the payout on your bank statement.
The sign convention
Money in is positive; money out is negative. Charges have a
positive gross. Refunds and
disputes have a negative gross, and disputes also
carry a positive fee. The payout row has a negative
net — it is the total being moved out of your Stripe balance
to your bank, not a component to be summed.
A real row example
One payout (po_9Q) and its four component rows (simplified):
| balance_transaction_id | category | gross | fee | net | payout |
|---|---|---|---|---|---|
| txn_1A | charge | 120.00 | 3.78 | 116.22 | po_9Q |
| txn_1B | charge | 84.00 | 2.74 | 81.26 | po_9Q |
| txn_1C | refund | −40.00 | 0.00 | −40.00 | po_9Q |
| txn_1D | fee | 0.00 | 0.30 | −0.30 | po_9Q |
| txn_1E | payout | −157.18 | 0.00 | −157.18 | po_9Q |
| Sum of net of components (txn_1A–1D) | 157.18 | ||||
116.22 + 81.26 − 40.00 − 0.30 = 157.18. The payout
(txn_1E) is −$157.18; your bank should show
a +$157.18 deposit. The payout row is the total you are checking
— exclude it from the sum.
Step-by-step: read and reconcile the file
-
Export the itemized report
In the Dashboard go to Reporting → Reports, choose Payout reconciliation, pick a date range, and download the Itemized CSV.
-
Keep IDs and amounts clean
Open it in a spreadsheet but store
balance_transaction_idandautomatic_payout_idas text. Don’t let the tool convert them to numbers or scientific notation, and keepgross/fee/netas real numbers. -
Group by automatic_payout_id
Filter to one payout at a time. Every component row shares that payout’s id.
-
Sum the Net column
Add
netfor the component rows (exclude the payout row). The sum should equal the payout amount. -
Match to the bank by available_on
Use the settlement (
available_on) date, not thecreateddate, when comparing to your bank deposit. If you settle in multiple currencies, watch for FX conversion before comparing.
Common mistakes
- Letting a spreadsheet corrupt IDs. All-numeric or mixed IDs can be turned into numbers or scientific notation; store them as text.
-
Counting the payout row as a component. The
payoutrow is the total you are verifying; sum only the transactions that feed it. -
Blank fee cells. Stripe often leaves
feeempty on refund rows;netis stillgross − fee. -
Confusing Gross with the fee-inclusive total.
grossis pre-fee;netis what actually hits your balance. - Mixing up created and available_on. Match the bank deposit to the settlement date, not the sale date.
- Currency-conversion rows. When you take payments in a non-settlement currency, extra conversion rows appear and must be included.
- Duplicate balance transaction IDs. If the same id appears twice, flag it rather than adding it twice.
How Stripe Money Detective can help. Stripe Money Detective imports the Payout Reconciliation (Itemized) CSV and groups every balance transaction by reporting category, so you can see the payout’s composition and reconciliation status at a glance. It flags duplicate balance transaction IDs instead of double-counting them and marks a payout Unverified when a row is missing or cannot be parsed. It supports automatic payouts in a single currency and runs entirely on your Mac — no Stripe connection, no upload. It reads the file for you; it is not a substitute for accounting or tax review. See how it works.
Related official resources
- Stripe Docs — Payout reconciliation report (itemized CSV per payout)
- Stripe API — Balance Transactions (amount/gross, fee, net, status)
- Stripe Docs — Balance transaction types (reporting categories)
- Stripe Docs — Receive payouts (settlement timing, pending vs available)