Sage Intacct to Xero requires compressing 8+ dimensions into 2 tracking categories, splitting entities into separate Xero orgs, and batching writes within Xero's 5,000 daily API limit.
Moving from Sage Intacct to Xero is not an upgrade — it is a structural simplification. You are compressing an enterprise-grade, multi-dimensional ERP into an SMB accounting platform with hard architectural limits. Sage Intacct supports 8+ built-in dimensions (location, department, project, customer, vendor, employee, item, class) plus unlimited custom dimensions. Xero allows only 2 active tracking categories with 100 options each — a fundamental compression problem. Every migration requires splitting multi-entity structures into separate Xero organizations, batching writes within Xero's 5,000 daily API call limit, and accepting reduced reporting granularity for dimensions that cannot survive the transition.
Read this first
Pair-specific gotchas that catch teams out. Each one has cost somebody a weekend.
Do not try to overload Xero's 2 tracking categories by concatenating dimension values
Do not try to overload Xero's 2 tracking categories by concatenating dimension values (e.g., "NYC-Engineering"). This breaks downstream reporting and makes every future filter operation painful. Pick two clean dimensions and accept the trade-off. Also, do not use Xero's Contact Groups as a pseudo-dimension — Contact Groups apply at the customer/vendor level, not the transaction line-item level.
Set your conversion date to the start of the current fiscal year (or the earliest period
Set your conversion date to the start of the current fiscal year (or the earliest period you're migrating at transaction level). Enter your Intacct trial balance as of that date into Xero's Conversion Balances screen. Then import detailed transactions only from that date forward. This dramatically reduces API consumption and keeps Xero clean.
Watch for private entity query gaps
In a multi-entity Intacct company, top-level queries do not access private entities by default. If you don't explicitly include private data or pull entity by entity, you can reconcile at group level while still silently dropping subsidiary detail. (developer.intacct.com)
The silver lining of the multi-entity split
each Xero organization gets its own API rate limits. If you're migrating 4 entities, you effectively get 4× the daily API budget (5,000 calls × 4 = 20,000 calls/day across all orgs). Run one entity end-to-end first — it exposes tax-code drift, shared-master collisions, and FX edge cases before you scale the runbook across every subsidiary.
As of March 2026, Xero introduced a new usage-based pricing model for its developer
As of March 2026, Xero introduced a new usage-based pricing model for its developer platform, charging based on connections and data egress volume. If you're using a custom OAuth app for the migration, be aware that Xero's new API pricing charges $2.40 AUD per GB of data egress. For a one-time migration, this cost is typically minimal, but it's worth factoring in.
Build a "rebuild checklist" that covers recurring transactions, custom reports, and user
Build a "rebuild checklist" that covers recurring transactions, custom reports, and user permissions alongside your data migration plan. These manual setup tasks often take longer than expected and are easy to overlook until someone asks "where did my monthly accrual template go?" on day one.
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 Sage Intacct
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 Xero 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.
Sage Intacct → Xero specifics
- Cost reduction
- Sage Intacct licensing runs significantly higher than Xero, especially when you factor in the Web Services Developer License, Performance Tier upgrades, and per-seat costs. For a mid-market company that has simplified its operations, Xero's transparent pricing removes that overhead.
- Business unit spin-offs
- A parent company keeps Intacct for consolidated reporting while a divested subsidiary moves to Xero for independent operations.
- System simplification
- Teams that don't use Intacct's multi-entity consolidation, revenue recognition, or project accounting are paying for complexity they don't need.
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 Sage Intacct 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 Sage Intacct: migrating an out-of-balance ledger makes the break permanently unattributable.
Data Profiler Profile the Sage Intacct 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 Intacct's audit logs
before decommissioning. Include user stamps, timestamps, approval chains, and modification history.
Sage Intacct → Xero specifics
- Store the audit archive
- in a durable, searchable format (structured CSV or database export) alongside your Intacct data backup.
- No relational integrity
- CSV exports are flat — you lose the link between an invoice and its payment, or between a bill and its line-item dimensions. You'll have to manually reconstruct these relationships.
- No automation
- If you need to re-run or do delta syncs during cutover, you're starting from scratch.
- Error-prone at scale
- A single misaligned column in a 5,000-row CSV will silently corrupt data.
- Xero CSV import limitations
- Xero's built-in import doesn't support all fields — you can't import payments or set historical exchange rates via CSV.
Don't move on until
- Trial balance in Sage Intacct 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 Sage Intacct → Xero field pair -
Map dimensions, cost centres and analysis codes
ERPs differ structurally here: segments, dimensions, tracking categories and classes are not interchangeable. Confirm how Xero 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.
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 Xero 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 Xero, 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 Sage Intacct 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.
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 Xero, transacting resumed, and a signed post-load trial balance.
Keep these open
-
Close the final period in Sage Intacct 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 Xero 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 Xero 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 Xero for posting, and reconcile daily for the first two weeks with finance support on hand. Keep Sage Intacct read-only for statutory retention — this is an audit requirement, not a preference.
-
Document the cutover date
clearly so auditors know which system holds the authoritative trail for any given period.
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 Sage Intacct and Xero record-for-record -
Reproduce the financial statements
Generate balance sheet, P&L and cash flow in Xero 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 Xero 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 Xero, 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 Xero. 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 Sage Intacct read-only for the full statutory retention period. Diarise the retention expiry rather than the contract renewal.
Don't move on until
- Financial statements match the pre-migration position
- First period-end close completed and reviewed in Xero
- 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.
How Handle the Compression
| Sage Intacct field | Xero field | Notes |
|---|---|---|
| Department | Tracking Category 1 | Direct map, up to 100 options |
| Location | Tracking Category 2 | Direct map, up to 100 options |
| Project | Contact Groups or Account Codes | Lossy — no native project tracking |
| Class | Prefixed Account Codes | Encode in the CoA structure |
| Customer | Contacts | Native Xero object |
| Vendor | Contacts | Merged with customers in Xero |
| Employee | N/A | Use payroll or external HR tool |
| Item | Items | Direct map |
Object Endpoint
| Sage Intacct field | Xero field | Notes |
|---|---|---|
| CUSTOMER | POST /Contacts | Xero merges customers and vendors into a single Contacts object. Set IsCustomer: true. |
| VENDOR | POST /Contacts | Set IsSupplier: true. Watch for name collisions with customers. |
| GLACCOUNT | POST /Accounts | Map Intacct account types to Xero account class types (ASSET, EQUITY, EXPENSE, LIABILITY, REVENUE). Flatten nested hierarchies. |
| ARINVOICE | POST /Invoices (Type: ACCREC) | Accounts Receivable invoices. Map line items from ARINVOICEITEM. |
| APBILL | POST /Invoices (Type: ACCPAY) | AP bills become Xero bills. Map line items from APBILLITEM. |
| ARPAYMENT | POST /Payments | Apply to the corresponding Xero invoice by InvoiceID. Load only after target invoices exist. |
| APPAYMENT | POST /Payments | Apply to the corresponding Xero bill by InvoiceID. Same dependency on target IDs. |
| GLBATCH / GLENTRY | POST /ManualJournals | Historical GL entries. Note: Xero's /Journals endpoint is read-only. You must use /ManualJournals for writes. |
| ITEM | POST /Items | Inventory items. Map ITEMID, description, and purchase/sale pricing. |
| CREDITNOTE (AR) | POST /CreditNotes (Type: ACCREC) | Map from AR adjustments. |
| APADJUSTMENT | POST /CreditNotes (Type: ACCPAY) | Supplier credit notes. See credit note handling below. |
Sage Intacct Xero
| Sage Intacct field | Xero field | Notes |
|---|---|---|
| DEPARTMENTID | Tracking.TrackingCategoryID (Cat 1) | Must pre-create tracking category and options |
| LOCATIONID | Tracking.TrackingCategoryID (Cat 2) | Only 2 categories available |
| PROJECTID | No direct equivalent | Encode in line item description or use account codes |
| CLASSID | No direct equivalent | Encode in account code prefix |
Risk matrix
Per-object risk for this pair. Plan extra validation around anything marked high.
| Object | Risk | Notes |
|---|---|---|
| Tracking Categories/Dimensions | high | Only 2 of 8+ dimensions survive natively; remaining require alternative mapping or archival |
| Multi-Entity Structure | high | No native Xero consolidation; each entity becomes a separate organization |
| Payments (AR/AP) | high | Must load after invoices exist; CSV import does not support payment relationships |
| Credit Notes (Applied) | high | Partially applied credits require explicit allocation API calls to link correctly |
| Multi-Currency Transactions | high | Exchange rates must be explicitly passed; omission causes reconciliation mismatches |
| Intercompany Transactions | high | Native eliminations don't carry over; must recreate balancing entries per entity |
| AR Invoices | medium | Batch import supported (50/call) but requires pre-cached Contact and tracking GUIDs |
| AP Bills | medium | Same batch constraints as invoices; line-item dimension data may be lost |
| GL Journal Entries | medium | Must use ManualJournals endpoint — the Journals endpoint is read-only |
| Attachments (>20K files) | medium | One API call per file against 5,000/day limit makes large volumes multi-day operations |
The hard parts
What makes this specific migration difficult, beyond the mechanics.
Dimension Compression
8+ Intacct dimensions must be compressed into Xero's 2 tracking categories with 100 options each — the rest must be archived or encoded elsewhere.
Multi-Entity Splitting
Each Intacct entity becomes a separate Xero organization with no native consolidation; intercompany eliminations must be manually recreated.
Daily API Ceiling
Xero's 5,000 calls/day limit requires aggressive batching (50 items per request) and pre-cached Contact GUIDs to move meaningful volume.
Credit Note Allocation
Partially applied credits require a 3-step process (create credit, create invoice, allocate) to avoid inflating AP aging reports.
Multi-Currency Constraints
Each Xero Contact supports only one default currency; vendors billing in multiple currencies need split contacts or per-invoice overrides.
Tools used in this playbook
All free, all run entirely in your browser — nothing is uploaded.
FAQ
How many tracking categories does Xero support compared to Sage Intacct dimensions?
Xero allows only 2 active tracking categories per organization, each with up to 100 options. Sage Intacct supports 8 built-in dimensions (location, department, project, customer, vendor, employee, item, class) plus unlimited custom dimensions. This is the biggest structural challenge in the migration — you must choose which 2 dimensions to preserve and find alternative mappings for the rest.
What are the Xero API rate limits for data migration?
Xero enforces 60 API calls per minute, 5,000 calls per day, and 5 concurrent requests — all per organization per app. By batching up to 50 invoices per POST request (within the 3.5MB payload limit), you can import several thousand invoices per day instead of the ~833 limit you'd hit with single-invoice calls.
Can I migrate multi-entity data from Sage Intacct to a single Xero account?
No. Xero does not support native multi-entity management. Each Sage Intacct entity must be migrated to a separate Xero organization. For consolidated reporting across Xero orgs, you'll need a third-party tool like Syft Analytics or Fathom.
Does Sage Intacct charge for API usage during a data export?
Yes. Sage Intacct's default Performance Tier 1 includes 100,000 API transactions per month. Every query, create, update, or delete counts as a transaction, and paginated queries (limited to 2,000 results per call) each count separately. Overages are billed in packs of ten transactions. Sage does not block calls that exceed the limit — they just charge you.
Can I migrate all Sage Intacct data to Xero with CSV files?
Not for most real-world migrations. Xero's DIY conversion templates cover chart of accounts, invoices, bills, contacts, and fixed assets. Payments, applied credit notes, entity splits, and complex multi-currency relationships require API work or a managed migration approach.