Skip to content

How to reconcile Stripe payouts in Xero without the monthly gap

StatementClear7 min read

Stripe records sales gross and pays out net of fees days later, so the bank feed shows one figure and your sales show another. The fix is to treat the Stripe balance as its own Xero bank account: sales and fees land there, and the payout reconciles against the bank as a transfer.

Why the numbers never match

A customer pays 100. Stripe takes its fee and holds the rest, then two days later sends a payout covering several days of activity, minus fees, minus refunds, minus any disputed amount held back. Your bank feed sees one deposit. Your sales records see dozens of transactions. Neither is wrong and neither can be reconciled against the other directly.

Every workable approach solves this the same way: give the money somewhere to sit between the sale and the payout. In Xero, that place is a bank account representing the Stripe balance.

Set up the Stripe balance as a Xero bank account

  1. Create a bank account in Xero for the Stripe balance, in the currency Stripe settles in. If Stripe settles in more than one currency, create one per currency.
  2. Sales post into that account gross, as the money actually arrives in Stripe.
  3. Stripe's fees post out of it, because that is where they are deducted.
  4. Refunds, chargebacks and dispute holds post out of it too, on the dates Stripe applied them.
  5. The payout posts out of it and into your real bank account, where the bank feed already shows the matching deposit. Reconcile the two as a transfer.

The test that the structure is right: the Stripe balance account in Xero should agree with the balance Stripe shows on the same date. If it drifts, something inside the balance is not being recorded.

Where Xero's native Stripe connection stops

Xero connects Stripe as a payment service, which marks invoices as paid and brings daily sales and fee lines into Xero. It works well on the setup it was designed for: an automatic payout schedule, one Stripe account per organisation, and no history to catch up.

It frays outside that. Manual payouts break the daily rhythm it expects. A second Stripe account has nowhere to go. Refunds and chargebacks that cross a payout boundary land awkwardly. And a year of pre-connection history is not something it will ever bring in.

Filling the gap by hand, and what it costs

The manual version is to download Stripe's balance transaction report each month, shape it into something Xero's importer accepts, and import it into the Stripe balance account. It works. It is also the same job every month, with no check that the closing balance agrees and nothing confirming the report was complete.

The specific risk with Stripe reports is volume. A busy month is thousands of rows, and a conversion that silently drops the tail of the file produces an import that looks fine and leaves the balance account wrong by an amount nobody can trace back.

Feeding the Stripe balance instead

The structure above does not change. What changes is how the lines get in: StatementClear posts the Stripe balance report into Xero through the Bank Feeds API, so the Stripe balance account is fed rather than imported into.

Overlapping uploads are deduplicated, so re-posting a period the payment service connection already covered is safe. The running balance is verified against the report before anything posts, which is the check that catches a truncated export. And Xero's Stripe payment service connection can stay exactly where it is, doing the invoice-matching job it is good at.

Stop importing Stripe statements. Feed them instead.

StatementClear posts the statements you already export into Xero as live bank feed lines, deduped and balance-checked before anything reaches the ledger.

Frequently asked

Gross, with the fees recorded separately as an expense. Recording net understates both revenue and costs, and makes the Stripe balance in Xero impossible to agree against Stripe's own figure.

Yes, if you want payouts to reconcile cleanly. Without somewhere for the money to sit between the sale and the payout, the gross sales and the net deposit have nothing to reconcile against.

Yes. It handles invoice payment matching, which is a different job from feeding the Stripe balance account. They post to different places and do not duplicate each other.

Read next