Migrate from Xero
Solid Accounting connects directly to Xero via the standard Xero OAuth 2.0 flow. The migration pulls your chart of accounts, contacts, items, invoices, bills, payments, manual journals, and bank transactions through the Xero API — no CSV juggling, no IIF, no exports to download.
This is one of the cleaner migrations available because Xero has a well-structured public API and a clean accounting model underneath. Most of the data round-trips losslessly.
Before you start
Have ready:
- Your Xero account credentials (the email/password you use to log in to xero.com)
- Admin or Standard user role in the Xero organisation you're migrating — the OAuth flow can only authorize tenants you can see
- Your installed copy of Solid Accounting with your license activated
- A Trial Balance from Xero as of your migration date — Reports → Trial Balance in Xero, save as PDF or copy the totals — for verification at the end
We strongly recommend the migration on a fresh .solid file; you can always retry. Xero data is read-only on import — nothing in your Xero account is modified by Solid Accounting.
Step 1 — Connect via OAuth
In Solid Accounting:
- Open the new (or empty) file you want to import into.
- Welcome screen → Import from other software → Xero. Or use the command palette (⌘K / Ctrl+K) and search for "Import from Xero".
- The OAuth dialog opens your default browser to login.xero.com.
- Sign in with your Xero credentials.
- Authorize Solid Accounting for the scopes it requests:
accounting.transactions.read— invoices, bills, payments, journalsaccounting.contacts.read— customers and vendorsaccounting.settings.read— chart of accounts, organisation infooffline_access— refresh token for long-lived access
- Pick the tenant to import from. If you have access to multiple Xero organisations (a bookkeeping firm with several clients, for example), the next screen lets you pick which one to migrate. Pick carefully — you can only import one tenant per Solid file.
After authorization, you're back in Solid Accounting and the import preview begins to populate.
Step 2 — Review the preview
Solid pulls a summary first — counts of accounts, contacts, items, invoices, bills, payments, etc. — so you can confirm the right tenant before any actual data import.
Tenant: Acme Consulting Pty Ltd
Chart of accounts: 47 accounts
Contacts: 128 customers + 84 vendors + 12 employees
Items: 23
Invoices: 342 (period: Jan 2024 – present)
Bills: 197
Payments: 512
Manual journals: 18
Bank transactions: 1,840
Wrong tenant? Cancel and re-run the OAuth flow; pick a different one at step 1.5.
Step 3 — Account mapping
Xero's chart of accounts uses account codes (numeric or alphanumeric, your choice in Xero settings) plus a Xero account-type code (BANK, CURRENT, INVENTORY, EXPENSE, etc.). Solid maps these:
| Xero type | → Solid type |
|---|---|
BANK | CASH (Cash and Bank) |
CURRENT (Current Asset) | ASSET (Other Current Asset) |
CURRLIAB (Current Liability) | LIABILITY (Other Current Liability) |
FIXED | FIXED_ASSET |
TERMLIAB (Long-term Liability) | LT_LIABILITY |
EQUITY | EQUITY |
REVENUE | INCOME |
OTHERINCOME | INCOME |
EXPENSE | EXPENSE |
OVERHEADS (Overhead Expense) | EXPENSE |
DIRECTCOSTS | COGS |
INVENTORY | ASSET (Other Current Asset) |
PREPAYMENT / RETAINEDEARNINGS / WAGESPAYABLE | mapped to closest Solid type |
Review the mapping screen, fix anything ambiguous, then proceed.
Step 4 — Import
Solid runs through the data in a defined order — the order matters because later entities reference earlier ones:
- Organisation info — base currency, fiscal year settings
- Chart of accounts — accounts created with the type mapping from step 3
- Contacts — customers, vendors, employees with addresses, terms, currency
- Items — service and inventory items with their account mappings
- Bank transactions — RECEIVE/SPEND entries (DR Bank/CR source or DR expense/CR Bank)
- Invoices —
ACCREC(sales) become Solid invoices: DR AR / CR revenue per line - Bills —
ACCPAY(purchases) become Solid bills: DR expense per line / CR AP - Payments —
ACCRECPAYMENTclear AR;ACCPAYPAYMENTclear AP - Manual journals — copied verbatim with line-amount signs determining DR/CR
Progress shows phase-by-phase. A typical migration with a year of activity takes 1–5 minutes; multi-year migrations of large files can run 20+ minutes.
Step 5 — Verify
In Solid: Reports → Trial Balance for the same date as your saved Xero Trial Balance. Compare account by account. Differences usually fall into:
| Difference | Likely cause |
|---|---|
| Off by retained earnings | Xero auto-posts year-end closing entries; Solid expects you to do it explicitly. Post a one-time adjusting entry. |
| One account off by FX revaluation | Xero posts unrealized FX gain/loss on multi-currency holdings; the timing differs slightly. Adjust to match. |
| Tax payable accounts off | GST/VAT/sales-tax accounts have product-specific behavior in Xero (BAS/sales-tax reports) that Solid handles differently. Reconcile manually. |
| Inventory asset off | Xero's inventory module computes value differently from Solid's FIFO/weighted-average. Inventory imports often need a one-time adjustment. |
Compare your Balance Sheet and P&L for the same period too. When all three match, the migration is clean.
What carries over
| Area | Carries over |
|---|---|
| Chart of accounts | All accounts, types, names, codes, descriptions |
| Customers + vendors | Names, addresses, payment terms, default accounts, currency, 1099 flag (if set in Xero) |
| Items | Service and inventory items, sales/purchase prices, account mappings |
| Invoices | All ACCREC invoices with line items, dates, terms, statuses |
| Bills | All ACCPAY invoices with line items |
| Payments | Both AR and AP payments, applied to specific invoices/bills |
| Manual journals | DR/CR balanced as posted in Xero |
| Bank transactions | RECEIVE and SPEND entries with categorization |
| Reconciliation status | Reconciled flag on bank transactions translates to cleared status |
| Tracking categories | If used in Xero, mapped to Solid's dimensions (Pro and Accountant tiers) |
What doesn't carry over
| Area | Why |
|---|---|
| Custom report layouts | Xero-specific |
| Quotes / Purchase Orders | Xero PO flow doesn't map cleanly to Solid's PO module — recreate as estimates / POs |
| Repeating invoices / bills | Xero's recurring schedules don't translate; recreate as Solid recurring entries |
| Employees + Payroll | Xero Payroll is a separate module — use Solid's Payroll API integrations or import payroll CSV |
| Fixed Assets register | Xero's FA module uses different depreciation methods; recreate the register manually |
| Files (attachments) | Documents attached to transactions in Xero stay in Xero; Solid doesn't pull them |
| Custom fields beyond standard ones | Stored as memo text where possible |
OAuth token lifecycle
After the initial OAuth, Solid stores a refresh token that lets it re-pull data without re-authenticating, for up to 60 days of inactivity. If you leave Solid disconnected from Xero for longer than 60 days, the refresh token expires and you'd need to re-authorize.
You can revoke Solid's access at any time from your Xero account: Settings → Connected apps. After revocation, Solid stops being able to pull but your imported data stays intact.
Common gotchas
OAuth fails with "redirect URI mismatch" — Solid registers a localhost redirect URI for OAuth. Some VPNs or corporate firewalls block localhost callbacks. Disconnect any VPN for the duration of the OAuth flow.
"Tenant doesn't have access to that scope" — your Xero user role might not have permission for the requested scopes. The Standard or Adviser role in Xero has all the needed permissions; some restricted roles don't. Either upgrade your role or have an Admin user run the migration.
Multi-currency totals don't match — Xero stores both base-currency and source-currency amounts. Solid imports the base-currency amount directly. Multi-currency files often need an unrealized-FX-gain-loss adjusting entry after import.
An account migrated as the wrong type — go back to the account-mapping step (you can re-run the import if needed), or edit the account type in Solid after import. Type changes are safe as long as the account hasn't had transactions yet — once it has, edits go through the audit trail.
Imported but the demo company shows differently in Xero — Xero has a Demo Company you can play with that doesn't represent any real org. Make sure you connected to your real organisation, not the demo.
Re-running the import creates duplicates — Solid's import is not idempotent against the same Xero tenant. Each import creates new entries. To re-run a migration, start over with a fresh .solid file. Don't import the same Xero data into a file that already has it.
Cross-references
- Migrate from QuickBooks — analogous flow for QB Desktop / QBO
- Migrate from FreshBooks — for FreshBooks users
- Import & Export overview — table of every import path