The 30-second version
Xero accepts statement imports as CSV — not PDF, not Excel, not .qbo. The CSV has a specific schema (Date, Amount, Payee, Description, Reference, Cheque Number) and a strict set of date formats. The hard parts are: the UK/Irish/AU/NZ Money-In / Money-Out column trap (Xero treats Amount as a single signed column), the EU comma-decimal issue (1.234,56parses as €1.23 if you're unlucky), multi-currency accounts, and the difference between manual statement import and live bank feeds. A reconciled bank statement converter handles all of this. This is the practical end-to-end guide.
Xero's reconciliation UI is one of the better experiences in modern bookkeeping software — when the transactions you import line up with the expected schema. When they don't, the failures are quieter than QuickBooks but no less expensive: an Amount column that imported as the wrong sign, a date format that flipped DD/MM and MM/DD, a multi-currency account where the statement was in EUR but Xero recorded the rows in GBP. This guide is the practical playbook for using a bank statement converter with Xero — what the import expects, where it breaks silently, and the end-to-end workflow that just reconciles.
We'll cover Xero's actual CSV format (with examples), the manual-import vs bank-feed decision, the Money-In / Money-Out column trap, the decimal-comma issue, multi-currency handling, batch import for practices, and how to combine the converter with our free reconciliation checkerto catch problems before they hit your client's file.
The Xero CSV schema, accurately
Xero's manual statement import (Accounting → Bank accounts → Import a statement) accepts a CSV with these columns:
- Date — required.
DD/MM/YYYY,YYYY-MM-DD, orD MMM YYYY(e.g.3 May 2026) all work.MM/DD/YYYYdoes not work in non-US Xero regions, even though the prompt sometimes accepts it. - Amount — required. Single signed column. Negative for debits, positive for credits. Xero rejects
(1234.56)parens-for-negative notation. - Payee — optional but strongly recommended. Drives Xero's contact matching.
- Description — optional. Free-text memo.
- Reference — optional. Used for cheque numbers, bank references, end-to-end IDs on SEPA payments.
- Cheque Number — optional, legacy. Most converters skip this.
A clean Xero CSV for a EUR account looks like this:
Date,Amount,Payee,Description,Reference
2026-05-03,-42.30,Stripe Inc,SEPA DD Stripe Inc,STR-20260503-001
2026-05-04,3200.00,Acme GmbH,Salary May,SAL-2026-05
2026-05-04,-12.75,Edeka,Card payment groceries,POS-7724That's the whole format. Note the absence of header preamble, the absence of branding, the absence of currency symbols inside the Amount cells, the ISO-formatted dates. Most banks emit none of this on their CSV export — which is why you need a converter even if your bank does offer a CSV download.
The header preamble strip
Many UK and EU banks prepend two or three rows of metadata ("Statement for Account 1234", "Period: 01/05/2026 - 31/05/2026", blank row) before the actual column titles. Xero treats the first row as the header — so it imports the metadata as a transaction and silently drops the next ten rows. Strip the preamble before upload, or use a converter that emits a clean Xero CSV with one header row.
Manual statement import vs bank feeds
Xero supports three ways to get transactions into a bank account:
- Direct bank feed — live OAuth connection from Xero to the bank. Available for ~5,000 institutions globally; Xero pays the data fee for the user.
- Yodlee / Plaid feed— paid bank feed for banks that aren't direct-connected. Roughly $5/month per feed for users on the Premium plan.
- Manual statement import — upload a CSV file. Free, unlimited, supports any bank in the world. This is where a converter slots in.
Even practices using bank feeds end up using manual import for: historical years (feeds typically reach back 90 days), foreign accounts on banks without a feed, corporate / trust accounts the feed doesn't cover, and any case where the feed mis-categorised and needs a clean re-import. So you need both. A bank statement converter doesn't replace the feed — it fills the gaps the feed leaves.
Bank feeds cover the last 90 days. A bank statement converter covers everything else — and everything the feed missed.
The Money-In / Money-Out column trap
This is the single most common silent failure on UK, Irish, Australian, and New Zealand statements. Banks like Lloyds, Barclays, AIB, Bank of Ireland, NatWest, HSBC UK, ANZ, and ASB emit statements with two amount columns: Money In and Money Out (sometimes called Credits / Debits or Paid In / Paid Out). Xero expects a single signed Amount column.
If you upload that raw CSV to Xero — or if a converter passes it through without merging the columns — the import does one of two things:
- Imports Money In as positive amounts and silently drops every Money Out row (the most common case).
- Imports both columns as positives, doubling the apparent balance.
Either way, the bank reconciliation in Xero fails by an enormous number and you have to delete the import and start over. The fix is to merge the two columns into a single signed Amount: Money In becomes positive Amount, Money Out becomes negative Amount. A converter built with awareness of UK / EU / ANZ banking does this automatically. We wrote a longer guide on this for the specific banks involved: AIB, Lloyds, Barclays → Xero — the 2026 workflow.
Money-In / Money-Out also breaks the Description column
On UK and Irish statements the Description column is often split across multiple rows — a SEPA payment might have the merchant name on one row and the reference / end-to-end ID on the next. Pure column-extraction tools treat each row as a separate transaction with a zero amount. The right extraction merges multi-line descriptions into one transaction. Look for this in your converter's output before you upload to Xero.
The decimal-comma issue
Germany, France, Spain, Italy, the Netherlands, Belgium, and most of mainland Europe use comma as decimal separator and period as thousands separator —1.234,56 means one thousand two hundred thirty-four point five six. Anglo-locale tooling assumes the opposite: 1,234.56.
Xero respects the regional settings of your organisation. A Xero org based in Germany happily parses 1.234,56. A Xero org based in the UK gets confused if you upload a German bank's CSV — the import might either reject it, parse 1.234,56 as 1.23456 (off by a factor of 100), or import every amount as zero. None of those throw a readable error.
Fix: normalise amounts to the Xero org's expected locale before import. If your Xero is set to UK or US locale, emit 1234.56 (no thousands separator, period decimal). If your Xero is set to a comma-decimal locale, emit 1234,56. A converter that understands locales handles this automatically — and importantly, doesn't require you to remember which locale your Xero org is in.
Multi-currency accounts
Xero's multi-currency support is solid but the import path has a few gotchas. A foreign-currency bank account (say, a EUR account in a GBP-base Xero org) imports transactions in EUR with no conversion at the CSV level — Xero applies the spot rate from xe.com or your manual rate on the reconciliation side. Two things to verify before you upload:
- The Xero bank account is set to the right currency. Click the account in Bank accounts, check the currency. An import of EUR rows into a GBP-coded account will be rejected with a currency mismatch error (or, worse on older Xero versions, silently treated as GBP).
- The Amount column is in the account's native currency, not the base currency. If your bank emits the statement in EUR with a GBP-equivalent column for reporting, you want the EUR column, not the GBP one. A converter has to know which column to read.
For Xero practices handling multi-jurisdiction clients (UK practice with EU subsidiaries, US practice with a Mexican branch) the converter saves a lot of time by pre-merging the right columns and emitting in the right locale per statement. The alternative is column-mapping every import manually.
Batch import for practices
Xero has no batch CSV import in the standard UI — each bank account's statement is uploaded one at a time. For a 30-client practice closing 30 months of statements, that's 30 uploads minimum. Two patterns to compress the work:
- Batch convert, then sequential import. Drop 30 PDFs into the converter in one go (we support batch upload on paid plans), download as a ZIP of Xero-template CSVs named by client + month, then upload each to Xero. The conversion is fast and parallel; the upload is the rate-limiting step. A practice we work with runs through 80 accounts in roughly 90 minutes this way.
- API-driven via Xero API.Xero's public API has a
BankTransactionsendpoint that takes JSON instead of CSV. Combine our REST APIfor PDF-to-JSON with Xero's API for JSON-to-Xero and you have a fully automated pipeline — ideal for internal finance teams onboarding a new entity.
Use the reconciliation checker before upload
If you have any doubt about a CSV — a converter you're evaluating, a file the client cleaned up themselves, a statement with unusual layout — run it through our free reconciliation checker first. Paste opening balance, closing balance, and the rows. It tells you whether the totals balance and, if not, which row broke the chain. Faster than uploading to Xero, finding the mismatch, and reverse-engineering which row is wrong.
The end-to-end workflow we recommend
- Download the bank statement PDF from the client's portal. If it's password-protected (corporate accounts, some EU banks), unlock it via our free PDF unlock tool first.
- Drop the PDF into the bank statement converter. Wait ~30 seconds.
- Check the reconciliation badge. Green = balanced. Amber = balanced within rounding (good). Red = review the flagged rows before downloading.
- Download as Xero CSV. Don't use the generic CSV option unless you've customised your column layout.
- In Xero: Accounting → Bank accounts → [your account] → Manage account → Import a statement. Upload the CSV.
- Xero shows a preview. Confirm the column mapping (it auto-detects from the template), confirm the date format, click Import.
- Reconcile from the bank reconciliation screen. Statement lines should match your invoices, bills, and existing entries automatically.
The mapping table — Xero behaviour to fix
| Xero behaviour | Likely cause | Fix |
|---|---|---|
| "Statement line couldn't be imported" | Date format Xero can't parse | Re-emit as YYYY-MM-DD |
| Every Money Out row missing | Two-column Money In/Out not merged | Use a UK-aware converter; merge to signed Amount |
| Amounts off by factor of 100 | Comma/period decimal confusion | Normalise to Xero org locale |
| Dates flipped between Apr/Mar | DD/MM vs MM/DD ambiguity | Use ISO dates |
| Currency mismatch error | Account currency ≠ statement currency | Set account currency before import |
| Reconciliation off by small amount | Silent extraction error on one row | Use a reconciled converter; check flagged rows |
| Duplicate transactions | Re-import without dedupe | Use Xero's "Discard" on duplicates; better — import via API with idempotent identifiers |
| Description split across rows | Multi-line description not merged | Use a converter that merges multi-line rows |
Further reading
- The complete guide to bank statement converters in 2026 — the pillar piece.
- AIB, Lloyds, Barclays → Xero: the 2026 workflow — per-bank quirks for UK and Ireland.
- What "auto-reconciled" actually means — the reconciliation idea that powers the badge.
- Bank statement converter for QuickBooks — the QuickBooks counterpart of this guide.
- For accountants and bookkeepers — multi-client workflow patterns.
- Free vs paid — when the free tier covers a Xero workflow.
- Free reconciliation checker · PDF unlock · Statement validator.
- REST API + MCP server · Pricing · Security.