Skip to main content

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.

Zuny FesterBy Zuny Fester, Head of Operations and Marketing
Reviewed by Zuny Fester
Published Last reviewed Editorial policy

Part of the payment reconciliation and cash application guide.

What ties to whatSum of all balance transactions' net amounts in a payout's batch = the payout deposit amount
Per-transaction fieldsamount (gross), fee, fee_details (breakdown), reporting_category (charge/refund/payout/fee)
Why a simple gross-minus-fee-rate estimate failsRefunds and disputes in the same batch also carry their own fee impact, not just charges
Where the batch boundary isA payout is a specific set of balance transactions bundled together, not "everything since the last payout"
What to actually querylist_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.

Book a workflow review

Worked example

A $4,850 payout reconciled from its balance transaction batch

reporting_categoryCountGross (amount)FeeNet
charge14$5,320.00$178.20$5,141.80
refund2-$310.00$0.00-$310.00
dispute1$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

The general principle — reconcile at the batch/settlement level using each transaction's own gross, fee, and net, not an estimated rate applied to a calendar period's gross sales — applies broadly. The specific field names and batch mechanics described here (balance transactions, reporting_category) are Stripe's own API shape.

A dispute fee is typically assessed as its own balance transaction, separate from reversing the original charge's balance transaction — the dispute fee itself carries no gross sale value, just a fee, which is why it shows $0 gross but still reduces net.

For tying a payout to the bank deposit, batch-level netting is sufficient. For understanding which specific sale a refund relates to (useful for revenue and margin analysis, not just cash reconciliation), refunds should also be traced back to their original charge individually.

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 more

Integration

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 more

How-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 more

Comparison

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