What Xero's importer expects
Xero imports bulk data through CSV templates — one per record type. The importer is strict, and that's the good news: if your file matches the template, it goes in cleanly. Three things matter most:
- Exact headers. Column names must match the template; required fields must be present and populated on every row.
- Consistent formats. Dates must match the organisation's date settings; amounts must be plain numbers without symbols or separators.
- Clean rows. No duplicates of records already in Xero, no stray line breaks inside cells, no trailing empty rows.
Prepare your CSV: the checklist
- Start from Xero's own template. Download the import template for the record type you're importing (contacts, invoices, and so on) from inside Xero. The template's headers are the contract — your file must match them, not the other way round.
- Map your source columns to the template's headers. Rename and reorder your columns to the template's exact names. Fields the template marks as required must be present and filled on every row.
- Fix the dates to match the organisation's format. Xero validates dates against the organisation's date settings. Convert every date column to one consistent, matching format before importing — mixed formats are a top rejection cause.
- Clean the values the importer chokes on. Strip currency symbols and thousands separators from amount fields, remove stray line breaks inside cells, standardise names and codes, and delete fully empty rows at the bottom of the file.
- De-duplicate against what's already in Xero. Importing contacts or invoices that already exist creates duplicates or errors. Export the existing records first and remove overlaps from your import file.
- Test with a small batch first. Import five rows before five thousand. Xero reports what failed and why on the small batch, and fixing the pattern once beats untangling a half-imported dataset.
Automate the preparation
If you import into Xero more than once — new clients, monthly loads, migrations — the preparation is the same rule-shaped work every time. With Morph you build the source-to-Xero mapping once as no-code rules: header renames, date normalisation, amount cleanup, de-duplication. Feed it any system's export (CSV upload works with everything) and out comes a Xero-ready file, identical in shape every run — or skip the file entirely and let the rule write the cleaned records straight into Xero.
Coming out of Xero instead? See How to clean up a messy Xero export.
Why does Xero keep rejecting my file?
Work through the rejections in this order: headers → required fields → date format → amount format → duplicates. Xero's error messages name the row and the field; fix the pattern in your source (or your rule), re-export, and re-test with a small batch rather than hand-editing individual rows.