Xero is the most popular cloud accounting platform in Australia, and for good reason โ it's simple, it integrates with everything, and every accountant knows it. But Xero is accounting software, not an ERP. When your business needs inventory, manufacturing, CRM, project management, or custom workflows in one connected system, Odoo is the natural upgrade.
This guide covers exactly how to migrate from Xero to Odoo, step by step, with a focus on the Australian-specific details that matter.
Why businesses outgrow Xero
The trigger is usually one of these:
- You're paying for 5+ Xero add-ons (inventory, CRM, project, time tracking) and they don't talk to each other properly
- You need proper inventory management with warehouses, lot tracking, or barcode scanning
- You want manufacturing or bill-of-materials functionality
- You need one system for your whole business, not a patchwork of tools
Step 1: Export your Xero data
Xero makes data export relatively straightforward. Go to Accounting โ Reports and export:
- Chart of Accounts โ Settings โ Chart of Accounts โ Export
- Contacts โ Contacts โ Export (customers and suppliers)
- Invoices and Bills โ Business โ Invoices/Bills โ Export
- Bank Transactions โ Accounting โ Bank Accounts โ Account Transactions โ Export
- Manual Journals โ Accounting โ Manual Journals โ Export
- Fixed Assets โ Accounting โ Fixed Assets โ Export
- Trial Balance โ Run as of your cutover date and save as PDF/CSV for reference
Use the Xero API or a tool like Export My Data (available in the Xero app marketplace) for bulk exports. The built-in CSV export has limits on how far back it goes.
Step 2: Choose your cutover date
The best cutover dates for Australian businesses are:
- 1 July โ Start of the financial year. Cleanest option. Your opening balance is simply last year's closing balance.
- Start of a BAS quarter โ 1 October, 1 January, or 1 April. Avoids splitting a BAS period across two systems.
- Start of a month โ Acceptable for monthly BAS reporters.
Step 3: Set up Odoo's Australian accounting
Install the Australian โ Accounting module. This gives you:
- A default chart of accounts based on Australian standards
- GST tax codes (10% GST, GST-free, Input Taxed, BAS Excluded)
- BAS report configuration
- AUD as default currency
Map your Xero chart of accounts to Odoo's. Xero uses account codes like 200, 400, 600. Odoo uses a similar structure. Create a mapping spreadsheet: Xero code โ Odoo code โ Account name.
Step 4: Import contacts
Import your Xero contacts into Odoo via Contacts โ Import. Key mappings:
- Xero "Name" โ Odoo "Company Name" or "Contact Name"
- Xero "ABN" โ Odoo "Tax ID"
- Xero "Email" โ Odoo "Email"
- Xero "Phone" โ Odoo "Phone"
- Xero "Billing Address" โ Odoo "Address" fields
- Set is_customer / is_vendor flags based on Xero contact type
Step 5: Import open invoices and bills
Export all unpaid invoices and bills from Xero. For each one, you need: invoice number, customer/supplier, date, due date, line items with GST, and amount due.
Import these into Odoo as draft invoices, then validate them. This ensures your aged receivables and payables reports are accurate from day one.
Don't import already-paid invoices as open invoices โ this will double your receivables/payables. Only import invoices that are genuinely outstanding on the cutover date.
Step 6: Create opening balances
Run a Trial Balance in Xero as of the day before your cutover date (e.g., 30 June if going live on 1 July). Create an opening balance journal entry in Odoo that matches every account.
Important accounts to verify:
- Bank accounts โ reconcile to actual bank statements
- GST Collected and GST Paid โ should match your latest BAS
- Accounts Receivable โ should match your imported open invoices
- Accounts Payable โ should match your imported open bills
- PAYG Withholding โ if you lodge BAS with PAYG
- Retained Earnings โ this is your balancing figure
Step 7: Set up bank feeds
Xero is known for excellent bank feeds. The good news is Odoo now supports bank feeds in Australia through Basiq (CDR), Yodlee, and SaltEdge.
Set up your bank feed connection in Odoo and verify transactions are coming through. It may take 24โ48 hours for the initial sync. You'll likely need to enable Consumer Data Right (CDR) sharing with your bank if using Basiq.
Step 8: Xero-specific gotchas
Things that catch people out when moving from Xero:
- Tracking categories โ Xero's tracking categories map to Odoo's analytic accounts. Set these up before importing transactions.
- Repeating invoices โ Xero's repeating invoices don't export. Recreate them as Odoo recurring invoices manually.
- Multi-currency โ If you use multi-currency in Xero, verify Odoo's exchange rate source matches and that unrealised gains/losses are handled correctly.
- Xero Projects โ These map to Odoo's Project module. You'll need to recreate active projects and migrate any unbilled time entries.
- Connected apps โ Any Xero-connected apps (Stripe, PayPal, Shopify, etc.) will need their Odoo equivalents configured.
Step 9: Test and go live
- Create a test invoice with GST and verify it calculates correctly
- Process a test bank reconciliation
- Run a BAS report preview and check the numbers
- Verify aged receivables/payables match Xero
- On cutover day: lock Xero, verify opening balances match, start working in Odoo
- Keep Xero active (read-only) for at least 12 months for reference and to meet ATO record-keeping requirements
Migration timeline
- Simple (accounting only) โ 1โ2 weeks
- Standard (accounting + inventory + CRM) โ 2โ4 weeks
- Complex (multi-entity, multi-currency, payroll) โ 4โ8 weeks
The actual data migration is usually quick (days, not weeks). The time goes into setup, testing, and training your team to use Odoo instead of Xero.