All guides

Xero and Stripe integration: what breaks

Updated 30 July 2026 · By Alex

Stripe takes the money. Xero has to explain it. Reconciling the two by hand costs small businesses hours every month.

Short answer: Stripe's built-in Xero connection is fine if you sell a flat product and raise invoices inside Xero. It starts costing you time the moment invoices originate somewhere else, or the payment lifecycle includes surcharges, deposits, partial payments or refunds. A payout is a net number and your accounts need the gross detail.

What the native connection does and does not do

Handled natively Usually not handled
A bank feed for the Stripe balance Matching a payment to an invoice raised outside Xero
Payout records arriving in Xero Splitting Stripe fees to their own account code
Simple charge to deposit flows Card surcharges passed on to the customer
Refunds as standalone transactions Refunds credited against the original invoice
Deposits and partial payments against one invoice
Multi-currency settlement differences

The mismatch appears because Stripe thinks in charges and payouts, while Xero thinks in invoices and payments, and those two models do not map one to one.

The payout problem, concretely

A Stripe payout is a net figure. On a normal day it might contain forty successful charges, two refunds, one dispute hold and the fees deducted from all of them, arriving in the bank as a single deposit.

Xero sees one number. To reconcile properly you need that number decomposed into:

  • The gross value of each charge, matched to the invoice it paid
  • The Stripe fee, coded to its own expense account so it appears as an expense in your P&L
  • Refunds applied against the original invoices
  • Any surcharge you collected, which is revenue and needs to be treated as such
  • GST on the fee, if you are registered

Done by hand this is fifteen minutes a day that grows with volume. Done wrong it understates revenue and overstates margin, so the business looks more profitable than it is.

When to fix it, and how

Work up this ladder and stop as soon as the problem goes away.

  1. Raise invoices in Xero and take payment via the Xero payment link. If this fits how you work, it is free and you can stop here.
  2. Use an off-the-shelf connector. These handle the common shapes well and cost far less than a build. They struggle when invoices originate outside Xero or the chart of accounts is unusual.
  3. Automate the reconciliation, not the whole flow. A scheduled job that decomposes each payout and pushes correctly coded line items into Xero solves the accounting problem without rebuilding your invoicing.
  4. Build the integration properly. Justified when invoices originate in your own system, when the payment lifecycle includes deposits or partial payments, or when the manual work has a cost you can put a number on.

What a proper integration has to get right

If you do get to rung four, these are the parts that have to be right.

  • Idempotency. Webhooks are delivered at least once, which means sometimes twice. Every write to Xero needs a key so a duplicate delivery does not create a duplicate payment.
  • Reconciliation against the payout, not the charge. Post to Xero in the shape the bank feed will present, or you will match transactions by hand.
  • Fees as their own line. Coded to an expense account, with GST handled correctly if registered.
  • Refunds against the original invoice. Otherwise someone has to allocate a standalone credit note later.
  • Failure visibility. When Xero rejects a write, someone has to find out the same day.
  • Replay. When something does break, you need to reprocess a date range without creating duplicates.

A worked example

TradieTally runs into this directly. Trades businesses quote a job, convert it to work, invoice it, take card payment and then need the margin on that job to be visible while the job is still running rather than a quarter later.

That required the money flow to be correct at every step: quotes becoming invoices, card payments taken through Stripe with surcharges handled, and the accounting side landing in Xero already coded, so nobody is reconciling by hand at month end.

Deciding whether it is worth it

The test is arithmetic. Estimate the hours per month currently spent reconciling payments, multiply by what that person's time is worth, and annualise it. If the answer is small, the native connection plus a bookkeeper is the right call and you should not spend money on a build. If the answer is uncomfortable, or the reconciliation is being skipped because it is tedious, a build is worth costing.

There is a broader version of this trade-off in what custom software costs in Australia and in custom software vs off-the-shelf SaaS.

Frequently asked questions

Does Stripe sync to Xero automatically?

Partly. Stripe's Xero connection creates a bank feed for the Stripe balance and can create payouts, which is enough for a business selling a flat product. It does not reliably reconcile a payment against an invoice raised in your own system, split fees the way your accountant wants them coded, or handle surcharges, partial payments and refunds against the original invoice.

Why does my Stripe payout not match my Xero deposit?

Because a payout is a net figure. Stripe deducts its fees and bundles many charges, refunds and adjustments into one bank deposit. Xero sees one number arriving. Unless something splits that payout back into its component charges and codes the fees separately, reconciliation stays manual and gets worse as volume grows.

When is a custom integration worth building?

When the manual reconciliation work has a cost you can name, when invoices originate in your own system rather than in Xero, or when you need surcharges, deposits or partial payments handled against the original invoice. Below that threshold, the native connection plus a bookkeeper is cheaper and entirely sensible.

Can an off-the-shelf connector do this?

Sometimes. Connectors handle the common shapes well and cost far less than a build. They struggle when invoices originate outside Xero, when the chart of accounts is non-standard, or when the payment lifecycle includes deposits and partial payments. Try a connector first and build only when you hit a wall you can describe.

Want this done on your own site?