DataNinja

Why a Xero spreadsheet import fails

Six things that break an invoice or bill import from a spreadsheet. The first one is the worst, because the import succeeds.

1. An account code that isn't in your chart

This is the one to know about. Put a code in the file that doesn't exist in your chart of accounts and Xero does not reject it. The import reports success, every line comes in, and the account field is blank on all of them.

Confirmed in a Xero Demo Company on 7 August 2026: code 210 doesn't exist there, the import succeeded, and every line arrived with no account. The totals were right, the grouping was right, and the bills couldn't be approved.

What to do: check the code against your own chart before you import, not after. In Xero it's Accounting → Chart of accounts → Export. The page's own breadcrumb says Settings, but that isn't how anyone actually navigates there.

2. The template is per document type, not per vendor

"A bill is an invoice with the direction flipped" is the assumption everybody makes, and it produces a file Xero rejects outright. The bill template is 24 columns to the sales invoice's 27. No Reference, no Discount, no BrandingTheme, and Description loses its asterisk.

What to do: download the blank template for the exact document you're importing, from that import screen, and match its header row. Not last year's, and not the other one.

3. A blank description on the sales template

Xero stars *Description on the sales invoice template, which means a line with an empty one fails. Plenty of perfectly good spreadsheets have no description column at all — a list of amounts against dates and customers is a normal way to keep books.

What to do: put something in every line. A single stand-in word repeated down the column is fine and makes no claim about your data; a blank is what stops the import.

4. Tax inclusive or exclusive is set on the import screen

It isn't in the file. It's a dropdown on Xero's own import screen, and nothing in your spreadsheet influences it. Get it wrong and every total moves by the GST — the import still succeeds, and the numbers are all wrong by a consistent 10%.

What to do: look at the dropdown deliberately rather than accepting what it happens to be set to. Then check one invoice against the spreadsheet before you approve the batch.

5. Excel already changed your file

Opening a CSV in Excel and saving it is enough. Two things happen routinely and neither is announced:

Leading zeros disappear Invoice 0012 becomes 12. So does a 0800 postcode and an 0412 mobile prefix. Excel reads a padded number as a number, and a number doesn't have a leading zero. What that costs, and what survives it.
Cents get dropped from the display A column formatted to zero decimal places shows 730 where the value is 730.40. Save it out as CSV and the rounding can become real.

What to do: if you can, export from the source system straight to the file you import, without opening it in between. If you must open it, use Excel's Text Import so you can set the code columns to Text, and check a padded reference at the bottom of the file as well as the top.

6. One invoice, or one per line?

A line-item export writes the customer, date and order number once and leaves them blank on the continuation rows. Import that as-is and you either get one invoice per line, or rows that fail for having no customer.

Xero groups lines onto one invoice by invoice number. If your file has an order or reference number, that's your grouping column and it needs to be filled in on every row, not just the first of each group.

Two things that are not problems

Everything arrives as a draft. Nothing posts to your ledger until you approve it, so an import you're unsure about is safe to look at and delete.

Xero warns you about duplicates. Re-importing the same file raises its own warning. That's Xero doing its job, not a sign you've broken something.

What we do about all this

This site's Convert tab turns a spreadsheet into Xero's own template — sales invoices or supplier bills — and checks the things above rather than assuming them. Attach your exported chart of accounts and it names the account back to you as 429 — General Expenses rather than reading 429 back at you, and it refuses to build the file at all if the code isn't in your chart. Padded references stay padded. Every row becomes a line or a named rejection, and the money in the file plus the money left out equals the column it came from.

It's free, nothing is stored, and the file never leaves Australia. Convert a spreadsheet for Xero.