Stripe itemized balance change (transactions) report
The transaction-grain export where every charge, refund, dispute and fee is its own row. It is the file people should use for revenue, and the one where they most often sum the wrong column.
The shape, how the file is really laid out
One row per balance transaction. Load-bearing columns: balance_transaction_id,
reporting_category, currency, gross, fee, net, created_utc, available_on_utc,
plus a source id (charge/refund id) and any customer or metadata columns you
opted into. For cross-border charges a separate presentment amount and
presentment currency describe what the customer paid before conversion, while
gross/fee/net are in your settlement currency. Refunds, disputes and fees post
as their own rows with negative net; there is no single signed "amount"
column that already reflects direction, direction lives in the sign of net
and in reporting_category. created_utc is when the charge happened;
available_on_utc is when the money becomes payout-eligible, and they routinely
fall in different months.
The traps
The fee-net trap: gross is what the customer paid, fee is Stripe's cut, net is what hit your balance, and gross = fee + net per row.
- Every trap in this export, worked through
- The reconciliation anchor, the total the file asserts about itself
- The refusal cases, when to stop and ask instead of guess
Reference: Stripe Docs, Reporting: Itemized balance change from activity report and reporting categories · Stripe Docs, Payouts: available_on vs created and settlement timing