How do I reconcile processor fees so net deposits tie to gross sales?
A payout's net deposit ties to gross sales only once every balance transaction feeding that payout is accounted for — not just charges, but every fee, refund, and dispute in the same batch. Stripe's balance transactions carry gross amount, fee, and net separately per transaction; summing the whole batch's net should equal the payout, and summing gross minus total fees should also equal it.
Part of the payment reconciliation and cash application guide.
| What ties to what | Sum of all balance transactions' net amounts in a payout's batch = the payout deposit amount |
|---|---|
| Per-transaction fields | amount (gross), fee, fee_details (breakdown), reporting_category (charge/refund/payout/fee) |
| Why a simple gross-minus-fee-rate estimate fails | Refunds and disputes in the same batch also carry their own fee impact, not just charges |
| Where the batch boundary is | A payout is a specific set of balance transactions bundled together, not "everything since the last payout" |
| What to actually query | list_balance_transactions filtered to the payout's transaction batch, summing net across every entry |
Why gross sales minus an estimated fee rate doesn't tie
A quick approximation — take gross sales for the period, subtract an assumed processing rate, expect that to equal the deposit — fails because a payout batch isn't only charges. It also includes refunds issued in that window (which reduce the payout and can affect fees differently than the original charge), and any disputes or chargebacks that settled in the same batch. An estimate based purely on gross charge volume and a flat fee percentage ignores all of that, which is exactly why it never quite ties to the cent, even when it's close.
What a balance transaction actually gives you
Stripe creates a balance transaction for every event that moves money through the account balance — a charge, a refund, a fee, a payout itself. Each one carries its own amount (the gross value), fee (what was deducted for that specific transaction), and a reporting_category that groups it (charge, refund, payout, fee, and so on). Reconciling isn't matching one number against another; it's summing every balance transaction that belongs to a specific payout's batch and confirming that sum equals the payout amount that actually landed in the bank.
Why the batch boundary matters more than the date range
A payout doesn't necessarily correspond cleanly to "everything that happened since the last payout" by calendar date — depending on the account's payout schedule and processing timing, a transaction that occurred right at a boundary can land in the next batch rather than the one its date might suggest. Reconciling by pulling transactions for a calendar period and comparing that sum to a payout dated within that period is a common source of small, persistent discrepancies; the batch itself, not the calendar window, is the actual unit that needs to tie.
What to do when it still doesn't tie
If summing an entire batch's net balance transactions still doesn't equal the payout, the next place to look is transactions with a reporting_category outside the obvious charge/refund set — a dispute fee, a reversed transaction, or an adjustment tied to a prior period's payout landing in this batch instead. Isolating the difference amount first, then filtering the batch's transactions for anything with that category, finds the specific line responsible faster than re-summing the whole batch repeatedly.
Next step
Map the finance workflow with the most exposure and prove the automation path.
Bring the invoice, contract, payment reconciliation, or customer finance workflow you have to defend at audit. Loopfour can map the trigger, controls, integrations, and approval loop.
Worked example
A $4,850 payout reconciled from its balance transaction batch
| reporting_category | Count | Gross (amount) | Fee | Net |
|---|---|---|---|---|
| charge | 14 | $5,320.00 | $178.20 | $5,141.80 |
| refund | 2 | -$310.00 | $0.00 | -$310.00 |
| dispute | 1 | $0.00 | $15.00 | -$15.00 |
Net across all three categories: $5,141.80 − $310.00 − $15.00 = $4,816.80. That's the figure that should match the payout — not the $5,320.00 gross charge total, and not $5,320.00 minus a flat estimated processing rate. A gross-based estimate using, say, a 3% assumed rate would predict roughly $5,160, off from the real $4,816.80 payout by over $340 — almost entirely because it never accounted for the $310 in refunds or the $15 dispute fee sitting in the same batch.
Frequently Asked Questions
Sources
Related
Topic
Payment Reconciliation & Cash Application
Payment reconciliation is the process of proving that every dollar that hit your bank account is accounted for somewhere in your books — matched to a deposit, a payout, an invoice, or an explained var…
Read moreIntegration
Why don't my Stripe payouts tie to the NetSuite bank deposit?
A Stripe payout rarely equals one NetSuite deposit line: Stripe nets many charges, fees, and refunds into one transfer settled days later. Check, in order: the payout isn't unbundled into individual charges, the deposit date doesn't match the transaction date, fees are netted not booked separately, a partial capture created a variance, or the payout is still in Undeposited Funds.
Read moreHow-to
How do I reconcile Stripe payouts independent of which ERP I use?
Every Stripe payout is backed by BalanceTransaction records — one per charge, fee, refund, or adjustment that makes up the net payout amount. Reconciling a payout means listing its BalanceTransactions by payout ID and summing them by type, a mechanic that's identical regardless of which ERP or accounting system receives the result.
Read moreComparison
Plaid vs. Stripe: which side of reconciliation are you actually looking at?
Plaid is the bank side: read-only transaction data from the account the money actually lands in. Stripe is the processor side: the system that generated the payment. They aren't two views of the same event that should match directly — both reconcile against a common bank statement line, and disagreeing is normal until that line is found.
Read more