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:

  1. Open the new (or empty) file you want to import into.
  2. Welcome screen → Import from other software → Xero. Or use the command palette (⌘K / Ctrl+K) and search for "Import from Xero".
  3. The OAuth dialog opens your default browser to login.xero.com.
  4. Sign in with your Xero credentials.
  5. Authorize Solid Accounting for the scopes it requests:
    • accounting.transactions.read — invoices, bills, payments, journals
    • accounting.contacts.read — customers and vendors
    • accounting.settings.read — chart of accounts, organisation info
    • offline_access — refresh token for long-lived access
  6. 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
BANKCASH (Cash and Bank)
CURRENT (Current Asset)ASSET (Other Current Asset)
CURRLIAB (Current Liability)LIABILITY (Other Current Liability)
FIXEDFIXED_ASSET
TERMLIAB (Long-term Liability)LT_LIABILITY
EQUITYEQUITY
REVENUEINCOME
OTHERINCOMEINCOME
EXPENSEEXPENSE
OVERHEADS (Overhead Expense)EXPENSE
DIRECTCOSTSCOGS
INVENTORYASSET (Other Current Asset)
PREPAYMENT / RETAINEDEARNINGS / WAGESPAYABLEmapped 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:

  1. Organisation info — base currency, fiscal year settings
  2. Chart of accounts — accounts created with the type mapping from step 3
  3. Contacts — customers, vendors, employees with addresses, terms, currency
  4. Items — service and inventory items with their account mappings
  5. Bank transactions — RECEIVE/SPEND entries (DR Bank/CR source or DR expense/CR Bank)
  6. InvoicesACCREC (sales) become Solid invoices: DR AR / CR revenue per line
  7. BillsACCPAY (purchases) become Solid bills: DR expense per line / CR AP
  8. PaymentsACCRECPAYMENT clear AR; ACCPAYPAYMENT clear AP
  9. 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:

DifferenceLikely cause
Off by retained earningsXero auto-posts year-end closing entries; Solid expects you to do it explicitly. Post a one-time adjusting entry.
One account off by FX revaluationXero posts unrealized FX gain/loss on multi-currency holdings; the timing differs slightly. Adjust to match.
Tax payable accounts offGST/VAT/sales-tax accounts have product-specific behavior in Xero (BAS/sales-tax reports) that Solid handles differently. Reconcile manually.
Inventory asset offXero'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

AreaCarries over
Chart of accountsAll accounts, types, names, codes, descriptions
Customers + vendorsNames, addresses, payment terms, default accounts, currency, 1099 flag (if set in Xero)
ItemsService and inventory items, sales/purchase prices, account mappings
InvoicesAll ACCREC invoices with line items, dates, terms, statuses
BillsAll ACCPAY invoices with line items
PaymentsBoth AR and AP payments, applied to specific invoices/bills
Manual journalsDR/CR balanced as posted in Xero
Bank transactionsRECEIVE and SPEND entries with categorization
Reconciliation statusReconciled flag on bank transactions translates to cleared status
Tracking categoriesIf used in Xero, mapped to Solid's dimensions (Pro and Accountant tiers)

What doesn't carry over

AreaWhy
Custom report layoutsXero-specific
Quotes / Purchase OrdersXero PO flow doesn't map cleanly to Solid's PO module — recreate as estimates / POs
Repeating invoices / billsXero's recurring schedules don't translate; recreate as Solid recurring entries
Employees + PayrollXero Payroll is a separate module — use Solid's Payroll API integrations or import payroll CSV
Fixed Assets registerXero'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 onesStored 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