Xero to Wave is a lossy migration. You gain zero-cost accounting but lose purchase orders, tracking categories, and multi-currency. Plan the structural compression carefully or use a managed service.
Migrating from Xero to Wave is a lossy structural compression. You gain zero-cost core accounting but lose purchase orders, tracking categories, multi-currency support, fixed assets, and credit notes as distinct objects. There is no native migration path between the two platforms. Xero's data model is relatively rich — unified contacts, two tracking categories for dimensional reporting, and a deep chart of accounts with custom codes. Wave is deliberately simpler: separate Customer and Vendor entities, no dimensional reporting, and a strict CSV importer that silently fails on files over 100 rows. Every migration requires splitting Xero's unified contacts, remapping account codes, flattening tracking categories, handling CSV formatting constraints, and reconciling trial balances across both platforms to ensure financial integrity.
Read this first
Pair-specific gotchas that catch teams out. Each one has cost somebody a weekend.
Wave is not a drop-in replacement for Xero
Wave is only available to US and Canadian businesses, and the business currency is locked at setup to USD or CAD. If you rely on purchase orders, multi-currency transactions, inventory tracking, or tracking categories, Wave cannot replicate these. Evaluate the feature gap before committing.
Wave's CSV import has a practical row limit
Community reports indicate files with more than 100 rows tend to fail silently. Break large exports into batches of 50–100 rows per file. Always use ISO date format (YYYY-MM-DD) or MM/DD/YYYY. Wave also requires dot (.) decimal separators — files using commas for decimals (common in European exports) will fail to import entirely.
As of March 2, 2026, Xero introduced tiered API pricing with data egress charges
The new model charges $2.40 AUD per extra gigabyte of data downloaded from its APIs. Inefficient, polling-heavy extractions are now directly expensive. Use If-Modified-Since headers, request only the fields you need, and batch where possible.
Xero's Journals API endpoint requires the Advanced tier under the 2026 pricing model and
Xero's Journals API endpoint requires the Advanced tier under the 2026 pricing model and needs a security assessment. For most one-time migrations, exporting reports as CSV is more practical than paying for Advanced API access.
Do not connect Wave's bank feed until after all CSV and Wave Connect imports are complete
Connecting a bank feed before imports are done creates duplicate transactions that require manual cleanup.
The runbook
Work top to bottom. Tick steps as you go — your progress is saved in this browser.
01 Discovery Scope the ledger, the subledgers and the audit obligations.
Objective Agreed scope across master data, open transactions and historical balances, with finance and audit signed up.
Keep these open
-
Inventory master data and transaction volumes in Xero
Count GL accounts, customers, vendors, items, fixed assets, open AR and AP, and transaction lines by year. Transaction line volume, not header count, is what determines your load time.
Data Profiler Get real record counts instead of estimating from memory -
Decide the history strategy with finance and audit
Choose between opening balances only, open items plus balances, or full transactional history. This is the single biggest scope decision in an ERP migration: full history multiplies effort many times over, and most organisations land on balances plus open items plus a read-only archive.
Full transactional history is rarely worth the cost. Confirm what your auditor actually requires before assuming you need it.
Vendor Evaluator Score Wave against alternatives on weighted criteria -
Consult the external auditor early
The auditor has views on cut-over timing, audit-trail retention and how you evidence that balances carried across correctly. Finding this out after go-live can mean a qualified opinion, so get it in writing now.
-
Review the chart of accounts and decide whether to redesign
A migration is the natural moment to restructure the COA, and also the riskiest one. If you redesign, you need a mapping from old to new for every historical balance, plus a plan to restate comparatives.
Redesigning the chart of accounts mid-migration doubles the reconciliation burden. Treat it as a separate, sequenced project if you can.
-
Catalogue integrations and statutory reporting
List banking feeds, payment gateways, tax filing, payroll, CRM, e-commerce, warehouse and BI. Then list every statutory and tax filing obligation with its deadline — those deadlines constrain your window absolutely.
-
Pick a period-aligned go-live date
ERP cutovers align to a period boundary — ideally the start of a fiscal year, otherwise the start of a clean month. Mid-period cutover means split-period reporting for the rest of the year.
-
Define your scope
Decide if you are migrating all historical data or just open AR/AP and trial balances for the current fiscal year. Financial migrations should almost always use a "Big Bang" cutover executed at month-end to ensure clean reconciliation.
COI & ROI Calculator Build the 36-month business case you will need for sign-off
Xero → Wave specifics
- Freelancers and solopreneurs
- outgrowing the value of Xero's feature set relative to its price.
- Micro-businesses
- that never used tracking categories, purchase orders, or Xero's app marketplace.
- Cost-conscious startups
- consolidating to a simpler stack after their initial growth phase.
- Accountants managing multiple clients
- where some clients' needs are better served by a zero-cost tool.
- Freelancer, < 1 year of data
- CSV export/import. Do it yourself in an afternoon.
Don't move on until
- Chart of accounts and master-data counts confirmed
- History strategy agreed: balances, open items, or full transactional detail
- External auditor consulted on the migration approach
02 Data Audit Reconcile the source before you migrate it — you cannot fix a ledger later.
Objective A source ledger that balances, with master data cleansed and every open item agreed.
Keep these open
-
Produce and sign off a source trial balance
Run the trial balance in Xero and have the controller sign it. This is your migration baseline: without a signed pre-migration position you have nothing to reconcile the target against, and any later discrepancy is unarguable.
Without a signed, dated source trial balance you cannot prove the migration preserved the ledger. Do this before anything else.
-
Reconcile subledgers to the general ledger
Confirm AR, AP, inventory and fixed-asset subledgers tie to their GL control accounts. Pre-existing breaks must be resolved in Xero: migrating an out-of-balance ledger makes the break permanently unattributable.
Data Profiler Profile the Xero export for nulls, outliers and type drift -
Clean and deduplicate master data
Deduplicate customers, vendors and items, and identify records that should not carry forward. Duplicate vendors are also a fraud-control weakness, so this has value beyond the migration.
Data Cleaner Strip empty rows, stray whitespace and dead columns -
Agree open AR and AP item by item
Every open invoice, credit note and payment on account needs an owner and an agreed amount, including partially-paid items and foreign-currency balances. Open items are what customers and vendors will dispute in week one.
-
Validate export structure, encoding and precision
Check numeric precision and rounding on the export, and confirm dates and currency codes are unambiguous. Precision loss on amounts is silent, cumulative and produces penny differences that take days to trace.
Amounts exported at reduced precision will not re-total. Verify decimal places before you accept the export.
CSV Validator Catch broken headers and ragged rows in the raw export -
Scan for regulated data and produce masked test data
ERP data holds bank details, tax IDs and payroll information. Scan it, restrict who can see it, and generate a masked copy for the sandbox and for any implementation partner.
PII & Compliance Scanner Find regulated fields before they land in a new system -
Export Xero Trial Balance
This is your source of truth. Export as of your chosen cutover date.
-
Inventory all Xero objects
Count contacts, invoices, bills, credit notes, manual journals, bank accounts, tracking categories.
-
Identify what Wave cannot accept
Purchase orders, fixed assets, tracking categories, credit notes (as a distinct object), multi-currency transactions.
Xero → Wave specifics
- Chart of Accounts
- Accounting → Advanced → Chart of Accounts → Export
- Invoices
- Business → Sales Overview → select invoices → Export
- Bank Transactions
- Reports → Account Transactions → filter by account → Export CSV
- Contacts
- → CSV (flag each as Customer, Supplier, or Both)
- Manual Journals
- → API only (the Journals endpoint is read-only; use ManualJournals for writable entries)
Don't move on until
- Trial balance in Xero balances and is signed by the controller
- AR and AP subledgers reconcile to the GL control accounts
- Master data deduplicated and inactive records identified
03 Field Mapping Map the COA, the dimensions and the subledger structures.
Objective A signed mapping covering the chart of accounts, dimensions, tax codes and currency handling.
Keep these open
-
Map the chart of accounts account by account
Every source account maps to exactly one target account, or to a documented split with agreed proportions. The controller reviews and signs this line by line — an unreviewed COA map is how a balance sheet stops balancing.
Schema Mapper Opens pre-loaded with the Xero → Wave field pair -
Map dimensions, cost centres and analysis codes
ERPs differ structurally here: segments, dimensions, tracking categories and classes are not interchangeable. Confirm how Wave models analysis and whether your existing reporting hierarchy survives the translation.
-
Map tax codes, rates and jurisdictions
Map every tax code with its rate, jurisdiction and reporting treatment, then verify the mapping reproduces your last filed return. Tax errors are statutory exposure, not reporting inconvenience.
A tax-code mapping that has not been tested against a previously filed return is untested. Reproduce a real filing before sign-off.
-
Decide multi-currency and exchange-rate handling
Confirm functional and reporting currencies, and how historical rates are stored. Revaluing historical transactions at current rates rewrites reported results and will not tie to filed accounts.
Historical transactions must retain their original transaction-date rates, or your comparatives will not match filed statements.
-
Map master data and subledger structures
Map customer and vendor records with their payment terms, credit limits and tax registrations, and item records with units of measure and costing method. Costing-method differences change inventory valuation, which changes the balance sheet.
-
Set load order and freeze the spec
COA, then dimensions, then master data, then opening balances, then open items, then any historical detail. Version and sign off the spec with the controller before the pilot.
-
Contact splitting
Any Xero contact flagged as both Customer and Supplier must be duplicated — one record in Wave's Customer list, one in Wave's Vendor list. Check the IsCustomer and IsSupplier boolean flags on the Contact object. If both are true, append a suffix (e.g., "- Vendor") to the vendor name to prevent naming collisions.
Xero → Wave specifics
- Account code remapping
- Wave uses its own internal account numbering. Xero's account codes (e.g., 200 – Sales) must be mapped to Wave's equivalent by type. Xero's broad Type values need translation to Wave's specific AccountSubtype enum (e.g., Xero's DIRECTCOSTS becomes Wave's CostOfGoodsSold).
- Decimal formatting
- Wave requires dot (.) decimal separators. Files using commas fail.
- Date formatting
- Use YYYY-MM-DD or MM/DD/YYYY. Other formats cause silent errors.
- Currency isolation
- If you had multi-currency transactions in Xero, each currency must be exported and imported separately. Wave does not support multi-currency natively.
- Tracking category flattening
- Append the category value to the account name or transaction description.
Don't move on until
- Account-by-account COA mapping reviewed by the controller
- Tax codes and jurisdictions mapped and verified against filings
- Multi-currency and rate handling agreed with finance
04 Test Migration Prove the ledger balances in the target before you trust it.
Objective A sandbox load whose trial balance matches the signed source position to the penny.
Keep these open
-
Configure the Wave sandbox with the agreed structures
Build the COA, dimensions, tax codes, currencies, fiscal calendar and posting rules before loading anything. Every one of these affects how a posted transaction lands, so an unconfigured sandbox produces meaningless results.
-
Load master data and validate it
Load customers, vendors and items first and verify counts, payment terms, tax registrations and costing methods. Transactions cannot post correctly against wrong master data, so this gate comes before any balance work.
Migration Validation Tool Diff the pilot batch against source before scaling up -
Load opening balances and prove the trial balance ties
Load opening balances and run a trial balance in Wave, comparing to the signed source position. It must match exactly — a rounding difference here is a mapping defect, not a rounding difference.
Any variance at all between source and target trial balance must be explained line by line. "Close enough" is never acceptable in a ledger.
-
Load open items and reconcile the subledgers
Load open AR and AP with their ageing intact, then confirm subledger totals tie to GL control accounts and that ageing buckets match. Ageing that shifts means transaction dates mapped wrongly.
-
Run a full period-end close in the sandbox
Execute the whole close: revaluation, accruals, depreciation, tax calculation, and financial statement generation. Compare every statement to Xero for the same period. The close is where structural mapping errors finally become visible.
-
Test transactions end to end and reproduce a tax filing
Post a sales order to cash and a purchase order to payment, then generate the tax return for a previously filed period and compare it to what you filed. If both reconcile, the configuration is sound.
-
Compare Trial Balances
Export Wave's Trial Balance and compare line-by-line against Xero's export from Phase 1. The debits and credits must match to the penny.
-
Test invoice workflow
Send a test invoice in Wave to confirm payment processing and email templates work.
Xero → Wave specifics
- Trial Balance
- Reports → Trial Balance → Export CSV (for validation)
Don't move on until
- Target trial balance matches the signed source trial balance exactly
- Subledgers reconcile to control accounts in the target
- A full period-end close has been run in the sandbox
05 Cutover Switch the ledger on a period boundary, with balances proven.
Objective Balances and open items live in Wave, transacting resumed, and a signed post-load trial balance.
Keep these open
-
Close the final period in Xero and freeze posting
Complete the period-end close, then lock posting entirely. An ERP freeze is absolute: a single journal posted to the old system after the final export leaves the two ledgers permanently divergent.
One journal posted in the old ERP after the final export breaks the reconciliation permanently. Lock posting at the system level, not by asking people nicely.
-
Publish the cutover runbook with the abort point
A timed, owner-named sequence for load, balance verification, integration switch and go/no-go, with an explicit abort criterion. The trial-balance check is the gate — nothing proceeds until it ties.
-
Load balances and open items into production
Load the final opening balances and open AR/AP into Wave production, following the pilot-proven sequence. Do not improvise the order under time pressure.
-
Reconcile and sign the post-load trial balance
Run the trial balance in Wave and reconcile it to the signed source position, then have the controller sign the result. This signature is your evidence for the auditor and your go/no-go gate.
Migration Validation Tool Confirm the final delta landed before you reopen -
Repoint banking, payment and tax integrations
Switch bank feeds, payment gateways, tax filing connections, payroll and BI, then process one real low-value payment and one bank reconciliation end to end. Banking errors move real money, so verify with live traffic.
Payment integrations left connected to the old ERP can duplicate real payments. Disable them before switching, not after.
-
Go/no-go, then open for transacting with daily reconciliation
Call the decision on the signed trial balance, open Wave for posting, and reconcile daily for the first two weeks with finance support on hand. Keep Xero read-only for statutory retention — this is an audit requirement, not a preference.
Don't move on until
- Post-load trial balance signed by the controller
- Banking, tax and payment integrations verified live
- Users transacting and the first daily reconciliation clean
06 Validation Prove the statements, the tax position and the audit trail.
Objective Financial statements reproducing the source position, a clean tax filing, and auditor acceptance.
Keep these open
-
Reconcile the full ledger and all subledgers
Reconcile trial balance, AR, AP, inventory, fixed assets and bank against the signed source position. Produce a single reconciliation pack that goes to the auditor.
Migration Validation Tool Reconcile Xero and Wave record-for-record -
Reproduce the financial statements
Generate balance sheet, P&L and cash flow in Wave and compare to the pre-migration statements. Every variance needs a documented explanation traced to a specific mapping decision.
-
Complete and review the first period-end close
Run the first real close in Wave with extra review at every step. Compare its duration and outcome to your historical close, and treat anything unexpected as a live finding.
Data Profiler Prove field completeness held up through the load -
Verify the tax position and file
Generate and review the first tax filing from Wave, reconciling it to the underlying transactions before submission. Have the tax lead review it independently.
The first statutory filing out of a new ERP should be reconciled manually to source transactions before submission.
-
Confirm controls, segregation of duties and audit trail
Verify user permissions, approval limits, segregation of duties and audit logging in Wave. Controls do not migrate, and a control gap found by an auditor is far more expensive than one you find yourself.
PII & Compliance Scanner Produce the compliance evidence your auditor will ask for -
Obtain auditor acceptance and retain the archive
Walk the auditor through the reconciliation pack, get written acceptance, and retain Xero read-only for the full statutory retention period. Diarise the retention expiry rather than the contract renewal.
-
Record count check
Total customers, vendors, invoices, and transactions should match expected counts.
-
Verify bank connections
Do not connect Wave's bank feed until after imports are complete.
-
Lock Xero
Set a lock date in Xero to prevent team members from adding new data to the old system. Keep Xero active for 30–90 days post-cutover as a read-only reference.
Xero → Wave specifics
- Spot-check 10% of transactions
- Verify amounts, dates, and account categorization. Focus on complex invoices (multi-line, multi-tax) to ensure tax rates and totals calculated correctly.
- Connect bank feeds
- Re-authenticate bank feeds in Wave. Be extremely careful with the "import start date" to avoid duplicating transactions you just migrated. Wave's docs specifically advise turning off auto-imports if switching to manual uploads or Wave Connect. (support.waveapps.com)
- Train your team
- Wave's UI differs from Xero's. The transaction categorization workflow is account-based rather than rule-based.
Don't move on until
- Financial statements match the pre-migration position
- First period-end close completed and reviewed in Wave
- Auditor satisfied and archive retained for the statutory period
Field mapping reference
The field-by-field mapping for each object. Use this as the starting point for your mapping spec.
Object Equivalent
| Xero field | Wave field | Notes |
|---|---|---|
| Contacts (Customer) | Customers | Direct map; split by IsCustomer flag |
| Contacts (Supplier) | Vendors | Must split Xero's unified contact; dual-role contacts become two records |
| Invoices (AR) | Invoices | Line items, tax, status map cleanly |
| Bills (AP) | Bills | UI supports bills; public API write coverage for bills is limited |
| Credit Notes | No direct equivalent | Must record as journal entries or negative invoices |
| Purchase Orders | Not supported | Data lost; archive as PDF |
| Tracking Categories | Not supported | Flatten into account names, descriptions, or external archive |
| Quotes | Estimates | Similar structure; status mapping needed |
| Manual Journals | Journal Transactions | Map directly |
| Bank Transactions | Transactions | Import per-account via CSV |
| Fixed Assets | Not supported | Record as manual journal entries for depreciation |
| Products/Services | Products/Services | Wave links each to one income or expense account |
| Chart of Accounts | Chart of Accounts | Wave uses preset account types; custom codes differ |
| Repeating Invoices | Recurring Invoices (Pro) | Only available on Wave's Pro plan |
| Inventory Items | Products + manual value tracking | Wave tracks inventory by monetary value, not unit quantities |
Risk matrix
Per-object risk for this pair. Plan extra validation around anything marked high.
| Object | Risk | Notes |
|---|---|---|
| Contacts (Customers & Vendors) | medium | Xero's unified contacts must be split by IsCustomer/IsSupplier flags. Dual-role contacts become two records. Never map by name alone — use ContactID. |
| Invoices (AR) | medium | Line items, tax, and status map cleanly, but invoices must reference pre-created Wave Customer IDs. API requires Pro Plan subscription. |
| Bills (AP) | high | Wave's public API has limited documented bill write mutations. Manual entry or Wave Connect may be required for historical bills. |
| Credit Notes | high | Wave has no dedicated credit note object. Must be recorded as negative journal entries or negative-amount transactions, breaking the audit trail. |
| Purchase Orders | high | Wave does not support purchase orders. This data is permanently lost and must be archived as PDF before migration. |
| Tracking Categories | high | No Wave equivalent exists. Values must be flattened into account names or descriptions, degrading reporting capability. |
| Multi-Currency Transactions | high | Wave does not support multi-currency. Each currency must be manually converted, and historical exchange rate accuracy is lost. |
| Fixed Assets | medium | Wave has no fixed asset register. Depreciation must be tracked manually via journal entries. |
| Bank Transactions | medium | Importable via CSV per account, but files must stay under 100 rows with strict formatting. Credit card sign flipping is a known issue. |
| Repeating Invoices & Bank Rules | medium | Xero automation rules do not export. Recurring invoices require Wave Pro Plan and must be rebuilt manually. |
The hard parts
What makes this specific migration difficult, beyond the mechanics.
Contact Model Splitting
Xero's unified contacts must be split into separate Wave Customer and Vendor records. Dual-role contacts require duplication with naming suffixes to prevent collisions.
CSV Import Fragility
Wave's CSV parser requires dot decimal separators, specific date formats, no special characters, and silently fails on files over 100 rows.
Tracking Category Loss
Xero supports two tracking categories for dimensional reporting. Wave has no equivalent — category values must be flattened into account names or transaction descriptions.
Incomplete API Write Surface
Wave's GraphQL API lacks clearly documented vendor and bill write mutations. Vendor and bill imports may require hybrid API plus Wave Connect loading.
Xero API Egress Costs
As of March 2026, Xero charges $2.40 AUD per extra gigabyte of data downloaded from its APIs, making inefficient extractions directly expensive.
Tools used in this playbook
All free, all run entirely in your browser — nothing is uploaded.
FAQ
Can I export all my data from Xero at once?
No. Xero does not offer a single 'export all' button. You must export contacts, invoices, bills, bank transactions, chart of accounts, and reports separately as CSV or PDF files. Invoice and bill CSV exports are capped at 500 records per batch.
Does Wave have an API for importing data?
Yes. Wave exposes a GraphQL API at gql.waveapps.com/graphql/public with mutations for creating customers, invoices, and accounts. However, OAuth-based API access requires the business to have an active Wave Pro or Wave Advisor subscription. Vendor and bill write mutations are not clearly documented in the public schema.
What Xero data does not migrate to Wave?
Wave does not support purchase orders, tracking categories, multi-currency transactions, fixed assets, or credit notes as distinct objects. These must be archived separately, flattened into journal entries, or accepted as data loss.
Can Zapier migrate historical data from Xero to Wave?
No. Zapier is trigger-based and only acts on new events. It cannot backfill years of historical transactions, contacts, or journal entries. It is only useful for forward sync during a parallel-run transition period, not for migration.
Why do CSV imports fail in Wave?
Wave's CSV import is strict about formatting. It requires dot (.) decimal separators, ISO or MM/DD/YYYY date formats, and no special characters like #, &, or *. Files over 100 rows tend to fail silently. Each file must match the target account's currency.