CSV is the format Xero uses for most of its native import features: invoices, bills, contacts, and bank statements. Xero has a reputation for being fussy about that CSV, and a lot of advice online tells you to match its template character for character. We tested what Xero's importer actually does, against a live Xero organisation, and the reality is more useful: it is fairly forgiving about format, and the real danger is the opposite of a rejected file. It is the import that succeeds while silently getting your data wrong.

This guide covers the CSV format Xero expects for each document type, the things Xero quietly accepts (so you stop wasting time on them), the errors that get your file rejected, and the silent errors Xero never warns you about. It is based on hands-on testing of Xero's live importer in June 2026.

Xero's CSV format for invoices and bills

Invoices and bills use the same import format in Xero, with a few field differences.

Required columns

Every invoice and bill row needs these columns:

  • ContactName (the customer or supplier name)
  • InvoiceNumber (your invoice or bill reference)
  • InvoiceDate
  • DueDate
  • Description (line item description)
  • Quantity (a number, typically 1 for a simple line)
  • UnitAmount (the line amount, excluding tax)
  • AccountCode (must match a code in your chart of accounts)

Xero's downloadable templates show these names with a leading star (*ContactName, *InvoiceNumber, and so on). The star is optional: ContactName imports exactly the same as *ContactName. What does matter is the spelling, which is case-sensitive and space-sensitive. "Contact Name" with a space and "contactname" in lower case both fail; the column is treated as missing and you get a "cannot be empty" error on every row.

Optional but commonly needed columns

  • TaxType (the tax rate name). This column is optional: leave it out and Xero applies a default tax rate. If you do include it, fill in every cell - a blank one imports untaxed rather than defaulted (see the silent errors below).
  • Currency (three-letter code, e.g. GBP, AUD, USD)
  • Reference (an additional reference field)
  • Discount (percentage discount on the line)

Multi-line invoices

If an invoice has several line items, each line is its own row, and you repeat the InvoiceNumber on every row that belongs to that invoice. Xero groups rows into one invoice by matching InvoiceNumber, and it does this regardless of row order, so scattered rows still merge correctly.

There is a trap here, though. If the rows of one invoice disagree on the ContactName (or the dates), Xero does not reject the file. It keeps the value from the first row and silently discards the rest, so the whole invoice can quietly land on the wrong customer. Keep ContactName and the dates identical across every row of an invoice.

Xero's CSV format for bank statements

Bank statements use a completely different import flow from invoices: a column-mapping wizard. After you upload the file, Xero asks you to point each of your columns at one of its fields (Transaction Date, Transaction Amount, Payee, Description, Reference, and so on). Because of that mapping step, the header names in your file do not have to match anything; you can call the columns whatever you like.

One signed amount, not Debit and Credit

Xero's bank import has a single Transaction Amount field, not a Debit/Credit pair. The sign carries the direction: a positive amount is money received, a negative amount is money spent. So the clean shape is three columns: a date, a description, and one signed amount.

If your statement has separate Debit and Credit columns, Xero cannot use them as-is. It maps only one of the two and silently drops the other, and because it reads the raw number it can book a payment out as money in. A Debit/Credit statement needs combining into a single signed amount column before you import it. That conversion is one of the things EntryRocket handles for you.

Date format

Unlike the invoice importer, the bank wizard handles dates carefully. It reads an unambiguous date (such as ISO 2026-03-15) straight away, and when a date is ambiguous (every day is 12 or below, so it could be read either way) it stops and asks you to choose dd/mm/yyyy or mm/dd/yyyy before it will preview or import. So the bank importer will not silently misread a date the way the invoice importer can; just make sure you pick the format your statement is actually in.

Xero's CSV format for contacts

Contact imports require Name as the only mandatory field. Optional fields include EmailAddress, FirstName, LastName, AccountNumber, BankAccountName, BankAccountNumber, BankAccountParticulars, TaxNumber, PhoneNumber, and address fields (AddressLine1 through AddressLine4, City, Region, PostalCode, Country).

What Xero quietly accepts (stop fixing these)

A lot of CSV cleanup advice has you fixing things Xero handles on its own. In our testing, the invoice importer accepted all of the following without complaint, so they are not worth your time:

  • Headers with or without the leading star
  • A missing TaxType column (Xero applies a default rate)
  • ISO dates (2026-03-15) and named-month dates (15-Mar-2026)
  • Dates with a time of day attached (the time is ignored)
  • Different date separators, including a mix of /, - and . in the same file
  • Thousands separators in amounts, whether commas (1,000.50) or spaces (1 234.56)
  • A UTF-8 byte order mark (BOM) at the start of the file
  • Windows-1252 / Latin-1 encoding (accented characters like Café import correctly)
  • Blank rows and a stray trailing empty column

None of these will reject your file. Spend your attention on the two lists below instead.

Silent errors: imports that succeed but get the data wrong

These are the dangerous ones, because Xero gives no error. The file imports, the numbers look plausible, and the data is wrong.

1. An ambiguous date read in the wrong region

The invoice importer has no date-format picker. It assumes your Xero organisation's region and applies it silently. When every date in the file has a day of 12 or below (for example 06/03/2026), it could be read as either DD/MM or MM/DD, and Xero just uses whichever your region is set to. If your org is US but the dates are really DD/MM, every date imports on the wrong day with no warning. (Xero only catches a wrong-region date when a day above 12 makes the reading impossible.)

Fix: check your region under Settings > General Settings and make sure the file's dates are in that format. Our validator flags a file where every date is ambiguous and asks you to confirm the region.

2. Amounts Xero misreads: comma decimals and parentheses

Xero reads an amount by stripping the symbols it recognises (commas, spaces, brackets) and keeping the digits and the dot. Two common European and accounting conventions break that quietly:

  • A comma used as the decimal separator: 1234,56 becomes 123456, an amount one hundred times too big.
  • Parentheses for a negative: (45.00) is read as +45, not -45, so the sign is lost.

Fix: use a dot for the decimal point and a leading minus sign for negatives. A currency symbol in the amount (like £500.00) is the related problem that does get rejected, with "could not be converted to a number".

3. An empty quantity, amount, or tax cell

A blank value in a required column does not always stop the import. An empty Quantity, for instance, imports as a zero, so you get a silent £0 line rather than an error.

A blank TaxType cell behaves the same way, and it is the one that catches people out. Leaving the whole column off applies your default tax rate, but leaving a single cell blank while the column is present imports that line with no tax at all, even on an invoice whose other lines are taxed. The amount lands and the tax silently does not.

Fix: make sure every line has a quantity and a unit amount, and if you include a TaxType column, give every line an explicit rate. For lines that genuinely carry no tax, use a zero-rate name (such as "No VAT" or "Zero Rated") rather than leaving the cell blank.

4. Excel quietly reformatted your CSV

You opened the CSV in Excel to check it, and Excel reformatted dates, turned them into its internal serial numbers (so a date shows up as something like 45992), or stripped leading zeros from account codes and references. The file still imports, but the data is no longer what you meant.

Fix: avoid opening CSVs in Excel before import. If you must edit one, use a plain text editor or Google Sheets, which is less aggressive about reformatting.

Errors Xero rejects outright

These get your file, or a row, refused, usually with a clearer message than the silent ones above.

5. Contact name doesn't match

Xero matches contacts by exact name. If your CSV says "Acme Ltd" but Xero has "Acme Ltd." with a period, or "ACME LTD" in different case, the match fails.

Fix: export your Xero contact list and cross-reference the exact names against your import file.

6. Tax rate name doesn't match

Your CSV uses "GST" but Xero expects "GST on Income" or "GST on Expenses". When you include a TaxType column, the rate names must match your Xero configuration exactly. (If you leave the column out, Xero applies a default rate instead.)

Fix: go to Accounting > Advanced > Tax Rates in Xero and use the exact names shown there.

7. Account code doesn't exist

The AccountCode in your CSV doesn't match any account in your chart of accounts, so Xero rejects the row.

Fix: check your chart of accounts and make sure the codes match exactly, including any leading zeros.

8. The wrong delimiter or encoding

Two file-level problems reliably fail an import. The first is the wrong delimiter: Xero splits only on commas, so a semicolon-separated file (common from European Excel) or a tab-separated one parses as a single column and every field comes out empty. The second is UTF-16 encoding, which some bank portals and older tools produce; its null bytes break the header match. Ordinary single-byte encodings like Windows-1252 are fine despite the common advice; it is specifically UTF-16 that fails.

Fix: save the file as comma-separated CSV with UTF-8 encoding. In Excel, choose "CSV UTF-8" in the Save As dialog. Duplicate column headers also cause a reject, so make sure each header name is unique.

9. Too many invoices in one file

There is no clean published row limit, but large invoice imports fail in practice. Xero's importer slows down as the file grows and then crashes partway through with a generic server error, so a big file can import only the first few hundred invoices and silently stop. In our testing it died at around 600 invoices.

What matters is the number of invoices, not the number of rows. Xero groups rows into invoices by InvoiceNumber, so a 2,000-row file that is 400 multi-line invoices is fine, while 1,500 single-line invoices is not.

Fix: keep each file to 500 invoices or fewer, counting distinct invoice numbers rather than rows, and keep all rows of one invoice together in the same file. Our validator counts the invoices for you and can split an over-size file into batches automatically. If you are regularly bumping into this, it is a sign you have outgrown the native CSV path.

When the CSV approach becomes impractical

Xero's CSV import is designed for straightforward, occasional imports. It works well when your data is already close to the right format and the volume is small.

It becomes impractical when:

  • Your source data is in Excel, PDF, or XML rather than CSV (requiring conversion before every import)
  • Your files come from multiple sources with different layouts (requiring different reformatting steps each time)
  • You're doing this weekly or daily rather than occasionally
  • Your files are large and need splitting
  • The data needs transformation beyond simple column mapping (splitting costs, applying fees, converting currencies)

In these situations, the time spent preparing data for Xero's CSV format becomes the bottleneck.

The alternative: skip the CSV step entirely

EntryRocket accepts whatever file your system exports (CSV, Excel, PDF, XML, JSON) and imports the data directly into Xero. No reformatting, no column renaming, no date conversion, no file splitting.

A custom reader handles the mapping between your source format and what Xero needs. It's built once around your specific files and works automatically from that point forward.

If you're spending recurring time wrestling with Xero's CSV format requirements, the time savings from automated import are usually measured in hours per week rather than minutes.

Want to check your own CSV first? Use our free CSV validator - it runs in your browser and checks the format rules from this guide, row by row.