How to import bank statements into Xero (CSV template, PDF workaround, common errors)
2026-07-21 · 8 min read
Xero's bank feed handles the day-to-day, but it leaves gaps exactly where you need history: a closed account, transactions older than the feed goes back, a bank Xero can't connect to, or a client who arrives with a folder of PDFs. For all of those you import a statement by hand — and Xero is fussy about the file, so half the battle is getting the shape right the first time.
What Xero accepts
- CSV — Xero's own bank-statement layout (below). This is the one most people need.
- OFX / QFX and QIF — accepted directly if your bank or converter can produce them, and they carry dates and signs unambiguously, which sidesteps a whole class of CSV errors.
- Never a PDF. A PDF statement has to become a CSV or OFX first — that's the conversion step below.
The CSV shape Xero wants
Import a statement from Accounting → Bank accounts → your account → Manage account → Import a statement. Xero asks you to map your columns to its fields, so a clean header row saves time:
- Date — in a single consistent format. Xero asks you to confirm the format on import; answer it honestly, because a DD/MM vs MM/DD mix-up shifts every date silently.
- Amount — one signed column, money out negative. (Xero can also take separate debit and credit columns, but one signed column has fewer ways to go wrong.)
- Payee and Description — the more recognisable the payee, the faster reconciliation goes, because Xero's bank rules match on it.
Two things break imports more than any others: currency symbols or thousands separators inside the amount cells (strip them), and summary or balance rows sitting above the header (delete them).
Turning a PDF statement into that CSV
Convert each PDF with a tool that re-checks dates and amounts rather than trusting raw OCR — here's why that matters — then reconcile the converted totals against the statement's printed opening and closing balances before you import a single row. Our converter has a Xero export that outputs the bank-statement template with the identified merchant already in the payee field, and there are per-bank converter pages if you want the export steps for a specific bank.
The errors people hit, and the fixes
- Every date is out by months — the date-format confirmation was answered wrong. Re-import with the right format; never hand-edit rows.
- Everything imports as spent (or as received) — the sign convention is flipped. In a single signed column, money out must be negative; some bank exports use the opposite, so negate the column and re-import.
- Duplicates against the live feed — your file overlaps the connected feed's window, or two consecutive monthly statements overlap. Trim the overlap before importing; Xero only catches exact matches, and overlapping statements are collapsed automatically if you merge them first.
- "The file could not be imported" — usually a stray header/footer row or an encoding issue. Re-export a fresh CSV and remove anything above the column headers.
Doing it for a whole client
Onboarding means several accounts across many months. The workflow that stays sane: batch-convert everything first, let merchant identification pre-clean the payees so Xero's reconciliation and bank rules do more of the work, then import account by account, oldest first. The full discipline — gather, convert, dedupe, categorise, reconcile — is in the bookkeeping workflow guide. If a client needs QuickBooks instead, the same file converts — here's that version.