All posts
bank-statement-converterxerocsvaccountingguidehow-toimport

Xero bank statement CSV import: the format that actually works in 2026

The exact CSV schema Xero's manual statement import accepts — two required columns (*Date, *Amount) plus Payee, Description, and Reference — with ISO dates, single signed amounts, UTF-8-without-BOM, and comma delimiters. Covers the six visible failure modes (semicolon delimiters from European exports, header preamble rows, missing asterisks, currency symbols in amounts, Dr/Cr and parenthesis notation, Money-In/Money-Out column splits) and the seven silent ones that import with a green banner but wrong numbers (sign-flipped merges, decimal-comma as thousands, DD/MM vs MM/DD ambiguity, Description truncation at 4000 chars, OCR digit misreads, multi-currency on single-currency accounts, duplicate-detection collisions). Includes a worked UK bank CSV reshape (Lloyds/Barclays/HSBC shape → Xero-clean), the exact 2026 menu path (Accounting → Bank accounts → Manage account → Import a statement), the pre-upload verification checklist, and when to use OFX or a bank feed instead of manual CSV.

StatementEdge··10 min read

The 60-second version

Xero's manual CSV statement import accepts a very small schema — two required columns (Date and Amount) plus three commonly used optional ones (Description, Payee, Reference). Nearly every "why won't it import?" ticket traces back to one of six things: the date format, the amount sign convention, hidden BOM/encoding, a preamble above the header, a semicolon delimiter from a European export, or a Money-In / Money-Out split that Xero silently treats as two half-imports. The format that works is smaller than the format most banks emit.

Xero's manual statement import is a deceptively simple screen: pick a file, map the columns, click Save. On a clean export it takes ten seconds. On a real-world bank CSV — the kind with two logo rows above the header, semicolon delimiters, and amounts written 1.234,56 — it can eat an afternoon before you realise Xero imported half the debits as zeros and the other half with the sign flipped. This post lays out exactly what the working format looks like, why the common exports break, and how to get a first-time-clean import from any bank.

If you'd rather skip the format-authoring entirely, drop a PDF into our converter and pick Xero CSV as the export target — the schema below is baked in and the amount column is already reconciled to the closing balance. But if you're building a CSV by hand, or fixing one your bank produced, the mechanics below are what matters.

The columns Xero actually accepts

Xero's CSV template has five columns in the recommended order. Only the first two are strictly required; the rest are optional but almost always useful:

ColumnRequired?What Xero does with it
*DateYesSets the statement-line date. Also feeds Xero's duplicate detector.
*AmountYesSingle signed column. Positive = money in, negative = money out.
PayeeNoPrimary field for Bank Rules matching and contact suggestions.
DescriptionNoFree-text detail shown in the reconcile screen.
ReferenceNoShort identifier — cheque number, invoice ref, transfer ID.

That's the entire schema. There is no separate Debit column, no Credit column, no Balance column, no Type column. Xero will accept a file with extra columns present but ignore them at the mapping step — which is fine, except when the extra column is where the actual amount lives (see below).

The two-column minimum works

A CSV with only *Date and *Amountwill import successfully. Reconciliation is harder without Payee/Description, but the import itself won't fail. If you're troubleshooting a broken file, strip it to the two required columns first and see if that imports — it's the fastest way to isolate whether the problem is a column Xero doesn't like or something structural.

The Date column: ISO or bust

Xero accepts several date formats — DD/MM/YYYY, MM/DD/YYYY, YYYY-MM-DD, and a few with two-digit years — but the mapping screen picks a default based on your organisation's region, and it gets the choice wrong constantly on exports from banks in a different locale.

The failure mode is silent and specific: any row where the day is 12 or less will parse under whichever format Xero picked, so 03/04/2026 imports as either 3 April or 4 March with no complaint. You only find out when the March/April boundary is wrong on your VAT return.

The fix is to emit ISO dates — 2026-04-03 — before you upload. ISO is unambiguous, Xero recognises it in every region, and the date-format dropdown on the mapping screen becomes irrelevant. If you can control the export shape (a converter, a script, a spreadsheet formula), always emit ISO.

Excel will silently reformat your dates

Open an ISO-dated CSV in Excel, save it, and Excel will helpfully rewrite every date column in your local display format — usually DD/MM/YYYY in Europe, M/D/YYYY in the US. The next Xero import silently picks the wrong parse on ambiguous rows. Either format the date column as text before opening in Excel, or edit the CSV in a plain text editor.

The Amount column: single signed number, no decoration

This is where most manually-authored CSVs go wrong. Xero wants one Amount column with signed numbers. Positive is money in (deposits, credits), negative is money out (payments, debits). None of the following work:

  • Money In / Money Out as two columns.The UK/Irish/ Australian bank convention. Xero's mapper only reads one of them, so half your transactions come in as zero.
  • Debit / Credit as two columns. Same problem, different labels. Same fix — merge into a single signed Amount.
  • Parentheses for negatives. (1,234.56) is US accounting convention. Xero parses it as text, and the mapping row fails silently.
  • Currency symbols. €1,234.56 or £1,234.56 parses as zero. Strip the symbol before upload.
  • Dr/Cr suffixes. German Soll/Haben, Indian Dr/Cr, Brazilian Débito/Crédito. Xero ignores the suffix and reads the bare number, losing the sign on every debit.
  • Trailing minus. 1234.56- is a SAP export convention. Xero reads it as positive.

The canonical amount format is -1234.56 for a debit, 1234.56 for a credit, with no thousands separator, no symbol, and a period as the decimal mark. If your source data uses 1.234,56(Continental European), you must convert it — Xero assumes the anglophone convention regardless of your org's region setting on manual CSV imports.

The header row: exact spelling, single row, first line

Xero's CSV parser expects the header on row 1. It doesn't skip blank lines, it doesn't auto-detect a header two rows down, and it doesn't forgive typos. Two things break here constantly:

  • Bank branding preamble. Many bank CSVs open with rows like "Account Statement", "Account: 12345678", "Period: 01/04 to 30/04" before the actual column titles. Xero either errors at row 1 or treats those rows as transactions and burns three cells of the file to failed parses.
  • Missing asterisks on required columns.Xero's template shows required columns with a leading * — as in *Date and *Amount. The asterisk is cosmetic (Xero maps by column position, not header text, at the mapping step), but a header row that reads Date, Amount, Description vs *Date, *Amount, Description can trip up scripts that expect the exact template.

Strip preamble rows before upload. If you author CSVs from a template, keep the asterisked names — they document intent and match Xero's own example file.

Encoding and delimiter: UTF-8, comma-separated, no BOM

Xero expects UTF-8 encoded, comma-separated values. Most exports from modern banking portals get this right. The traps are:

  • Semicolon delimiters from European Excel exports. German, French, Dutch, and Spanish locales default to ; as the list separator. Xero reads the whole line as a single column and the mapping screen shows one huge Description with everything jammed together. Fix: Save As → CSV UTF-8 (comma delimited), or convert with our CSV column mapper which auto-detects the delimiter and normalises.
  • UTF-8 BOM — the three invisible bytes EF BB BF that Excel prepends when saving as CSV UTF-8. Xero's parser sometimes treats the BOM as part of the first column header, so *Date becomes *Date and the mapping fails. Save as plain CSV (comma delimited) from Excel, or strip the BOM in a text editor.
  • Windows-1252 with special characters. Payees with accented characters (Café, Zoë, München) come in as garbled sequences like Café if the file is saved as ANSI/Windows-1252 rather than UTF-8. The rows import, but reconcile suggestions and Bank Rules matching break on the mangled text.
Xero doesn't reject broken files — it maps whatever it can and silently drops or corrupts the rest. The most expensive Xero import is the one that finishes with a green banner.

The seven silent-failure modes

Every issue above throws a visible symptom — an error message, zero transactions, or a garbled column. The genuinely dangerous imports are the ones that show "Statement lines imported: 142" and quietly contain wrong numbers. In order of frequency:

  1. Sign flip on Money-In/Money-Out merges. A script that subtracts one column from the other rather than combining them correctly. Half the rows come in with the wrong sign; the total balances but the debit/credit ledger is inverted.
  2. Decimal comma read as thousands. A €12,50 espresso becomes a €1,250 espresso when the parser assumes anglophone format. Every amount is off by a factor of 100 and reconciliation looks catastrophically wrong.
  3. Date column MM/DD vs DD/MM ambiguity. As above — every row with day ≤ 12 lands in the wrong month.
  4. Truncated Description on long rows. Xero silently truncates the Description at 4000 characters. Some bank exports pack entire counterparty addresses into the memo; the truncation strips the reference number that Bank Rules would match on.
  5. OCR digit misreads on scanned PDFs. A 7 read as 1, a 0 read as O, a 6 read as 5. The row imports cleanly but the amount is wrong. Only a reconciled converter catches this.
  6. Multi-currency amounts on a single-currency account. A statement with mixed EUR and GBP lines mapped to a EUR bank account — Xero imports the GBP numbers as if they were EUR.
  7. Duplicate detection collision.Xero dedupes on Date + Amount + Description. Two identical £4.50 coffees on the same day from the same shop merge into one — and the P&L is missing a row.

The defence against all seven is the same discipline as any other bank import: opening balance + Σ(transactions) must equal the closing balance printed on the statement. This is what auto-reconciliation means — and it's the one check Xero itself cannot perform, because it never sees the statement's opening or closing balance.

Worked example: a UK bank CSV that doesn't import

Here's a shape you'll recognise if you bank with any UK high street bank — Lloyds, Barclays, HSBC, NatWest all emit variants of this:

Transaction Date,Transaction Type,Sort Code,Account Number,Description,Money Out,Money In,Balance
03/04/2026,FPI,30-96-00,12345678,ACME COFFEE LTD,4.50,,1234.56
03/04/2026,DD,30-96-00,12345678,BRITISH GAS,,,1225.06
04/04/2026,BAC,30-96-00,12345678,CUSTOMER INV 2041,,2500.00,3725.06

Four problems in one file, in order of appearance to Xero:

  1. Header column names don't match Xero's expected fields — you'll have to map each one manually every import.
  2. Dates are DD/MM/YYYY. Rows on the 4th of the month parse fine; anything ≤ 12 is ambiguous.
  3. Money Out and Money Inare two separate columns. Xero's mapper only lets you pick one as the Amount, so you either lose all your debits or all your credits.
  4. The second row (British Gas) has both Money Out and Money In empty because of a parsing artefact — the CSV writer emitted a trailing comma for the DD row instead of the amount. That row imports as a zero.

The reshaped file that imports cleanly:

*Date,*Amount,Payee,Description,Reference
2026-04-03,-4.50,ACME COFFEE LTD,Faster Payment,FPI
2026-04-03,-19.94,BRITISH GAS,Direct Debit,DD
2026-04-04,2500.00,CUSTOMER INV 2041,BACS credit,BAC

ISO dates, single signed Amount column, Payee split from Description, no empty rows. The BRITISH GAS amount was recovered from the Balance column delta (1234.56 − 1225.06 = 19.94) — the exact kind of reconstruction our bank CSV transformation checklist walks through end to end.

Where the import button actually lives

Xero's 2026 UI puts manual statement uploads three clicks deep:

  1. Accounting → Bank accounts from the main nav.
  2. Click the tile for the account you're importing into.
  3. On the account page, click Manage account → Import a statement. Not Statements, not Bank statements — the option you want is titled Import a statement.

The next screen accepts .csv, .ofx, .qif, and Xero's own .qbo-adjacent formats. CSV is the one with the column-mapping step; the others read their schema from the file header directly.

OFX skips the whole column-mapping problem

If you can get an OFX (or its close relative QIF) export from your bank, use that over CSV. The format encodes date, amount, sign, and description in explicit fields — no mapping screen, no ambiguity, no locale traps. Our converter emits OFX as an alternative to Xero CSV precisely for this reason.

The pre-upload checklist

Before you click Save on the mapping screen, verify:

  • Row count on screen matches row count in the source file.
  • Date range on screen matches statement period.
  • Sum of the Amount column (positive − negative) matches the statement's net change.
  • Sample three rows: pick a large debit, a large credit, and a mid-month row. Verify the sign and value against the PDF.
  • The date-format dropdown in the mapping screen matches the shape of your data.

Sixty seconds of checking, on the mapping screen, catches every silent failure mode above. This is the discipline that separates a five-minute Xero import from a two-hour retro-cleanup after month-end.

When you shouldn't use manual CSV at all

Manual CSV import is the fallback path. If your bank supports Xero's direct Bank feeds (Open Banking in the UK/EU, Yodlee/Plaid elsewhere), use that instead — the feed pushes transactions in continuously with proper deduplication and no format work. Manual CSV is what you fall back to when:

  • Your bank isn't on Xero's feed list.
  • You're back-filling months of history before the feed connected.
  • The feed has a coverage gap and Xero's support can't backfill it.
  • You're importing a closed account or a currency the feed doesn't support.
  • You only have PDF statements from your accountant or the client.

For the PDF-only case, converting to a Xero-shaped CSV is the whole point of a converter — and it's where getting the format right matters most, because there's no source-of-truth digital export to fall back on if the CSV is wrong.

Further reading

Keep reading

bank-statement-converterxero

Xero CSV import errors decoded: every error message and the actual fix

Every Xero CSV statement-import error decoded into actual cause and fix. The six error messages you'll see ("file is empty", "unrecognised date format", "we couldn't match the columns", "amount must be a number", "already imported", and the polite mapping-screen reject), the BOM / delimiter / preamble traps behind each, plus the four silent failures Xero never warns you about — sign-flipped Money-In/Out merges, decimal-comma read as thousands separator, single transposed digits in OCR'd rows, and multi-currency rows that reconcile the bank balance while corrupting the P&L. Includes the schema reference, the column-mapper warning, the Statement vs Statement Lines deletion trap, and a print-this-and-pin-it mapping table.

Read
bank-statement-converterxero

Xero bank statement import: CSV format that actually works

The exact CSV schema Xero accepts — two required columns plus five optional, the date format rules (ISO recommended), Amount column quirks (no parens, no currency symbols, no Dr/Cr suffix), header preamble traps, encoding (UTF-8) and delimiter (comma) rules, the seven silent-failure modes that import 'successfully' with wrong numbers, manual-vs-bank-feed decision tree, Bank Rules engine design for the Payee column, four multi-currency edge cases, per-region cheatsheet (UK, EU, US, AU, India, LatAm, SG, UAE), the mapping table from Xero's vague errors to the actual cause and fix, where the import button actually lives in Xero's 2026 UI, two worked examples (EUR account and a UK Money-In/Money-Out merge from Lloyds-style source), how Xero's Date+Amount+Description duplicate detection actually works, four strategies for safe re-imports across overlapping periods, the same-day double-charge edge case, the Demo Company test pattern for unfamiliar bank CSVs, the delete-and-replace recovery workflow for bad imports, batch import patterns for multi-client practices, the Analysis Code column and chart-of-accounts tagging, Bank Rules vs Contact suggestions vs Cash coding (when to use which), the Xero edition matrix (Starter/Standard/Premium/Cashbook/Ledger) and what changes per plan, a six-step diagnostic checklist for 'successful' imports that are actually wrong, the Statement Lines vs Bank Statements distinction (the deletable record, the reconciled-lines persistence rule, the bank-feed-to-CSV migration ghost-duplicate trap), the Lock Date + MTD digital-link workflow (split-at-the-boundary vs temporary-rollback, HMRC's manual-transcription rule, EU SDI/Chorus Pro/VeriFactu equivalents, the ~1000-line per-file cap and the half-month split pattern), the conversion-balance vs opening-balance vs first-imported-row trap that breaks new Xero orgs on day one (three-balance audit, retroactive backfill vs adjusting journal), the advanced Bank Rules playbook (AND/OR conditional matching, percentage splits, reference-driven contact matching, priority-order discipline, the Find & Recode + new-rule revenue re-allocation warning), the Find & Recode + Cash Coding post-import cleanup loop (when to use which, the cadence that keeps lines in the Cash Coding grid, the Adviser-menu Find & Recode for retro-fixing reconciled coding errors), the payment-processor playbook for Stripe (gross/fee/net split), PayPal (per-currency CSV split with Balance Affecting column), Wise (FX-conversion transfer pairing) and GoCardless (the two-leg pattern), and a copy-paste CSV template.

Read
bank-statement-converterquickbooks

Import bank statements into QuickBooks Online: a 2026 step-by-step walkthrough

The practical walkthrough: the four routes into QBO (live feed, .qbo, .qfx, CSV), why PDF is never one of them, where Intuit hid the upload button after the 2025 redesign, the Receipts vs Bank-transactions sidebar trap, the six-step PDF → .qbo → upload recipe, a worked Chase Business Checking example (87 transactions, six-minute close), the four pre-upload checks that catch a wrong-but-not-broken import (opening + Σ = closing, transaction count, date range, top-five spot-check), the live-feed vs file-upload decision tree, the CSV fallback and why you almost never want it, three multi-currency traps (mixed-currency statements, sub-currency tokens, home-currency rounding), per-bank quirks for Chase, Wells Fargo, HSBC, AIB, Revolut Business, HDFC/ICICI/SBI, three batch patterns for accountants (sequential pipeline, per-client reconciliation gate, API automation), and the seven-minute monthly-close time budget.

Read