Migrate from QuickBooks Online
QuickBooks Online doesn't export company files. There's no .QBW, no IIF download, no clean offline backup. The only path off QBO is through the Intuit API, and Solid Accounting connects directly via OAuth 2.0 — no intermediate CSV juggling, no third-party migration tool, no fees.
The migration pulls your chart of accounts, customers, vendors, items, invoices, bills, payments, deposits, journal entries, and purchases through the Intuit Accounting API.
For QuickBooks Desktop users, see Migrate from QuickBooks Desktop — the path is different (uses a .qbextract file produced by a separate migration tool).
Before you start
Have ready:
- Your QuickBooks Online account credentials (the email/password you use at qbo.intuit.com or via Intuit SSO)
- Admin or Standard user role in the company you're migrating
- Your installed copy of Solid Accounting with your license activated
- A Trial Balance from QBO as of your migration date — Reports → For my accountant → Trial Balance — for verification
We strongly recommend running on a fresh .solid file. QBO data is read-only on import; nothing in your Intuit account is modified by Solid Accounting.
Step 1 — Connect via OAuth
In Solid Accounting:
- Open the new file you want to import into.
- Welcome screen → Import from other software → QuickBooks Online. Or use the command palette (⌘K / Ctrl+K) and search for "Import from QuickBooks Online".
- The OAuth dialog opens appcenter.intuit.com in your browser.
- Sign in with your QuickBooks Online (Intuit) credentials.
- Authorize Solid Accounting for the scope
com.intuit.quickbooks.accounting— this grants read access to your accounting data. - Pick the company to import. Intuit's
realmId(a company identifier) arrives back in the redirect; if your login has access to multiple companies (a bookkeeping firm with several clients, an owner with a personal and business account), the next screen lets you pick which to migrate.
After authorization, Solid Accounting begins fetching the import preview from the QBO API.
Step 2 — Review the preview
Company: Acme Consulting LLC
Realm ID: 9341054320013478
Chart of accounts: 47 accounts
Customers: 128
Vendors: 84
Employees: 12
Items: 23
Invoices: 342 (period: Jan 2024 – present)
Bills: 197
Payments: 512 (262 customer payments, 250 bill payments)
Bill payments: 197
Deposits: 88
Journal entries: 18
Purchases: 425 (cash + credit-card spending)
Wrong company? Cancel and re-run; pick a different realmId at step 1.6.
Step 3 — Account mapping
QuickBooks Online uses an account AccountType + AccountSubType combination. Solid maps these to its own 11 account types:
| QBO type | → Solid type |
|---|---|
Bank | CASH |
Accounts Receivable | RECEIVABLE |
Other Current Asset | ASSET |
Fixed Asset | FIXED_ASSET |
Other Asset | ASSET |
Accounts Payable | PAYABLE |
Credit Card | LIABILITY |
Other Current Liability | LIABILITY |
Long Term Liability | LT_LIABILITY |
Equity | EQUITY |
Income | INCOME |
Other Income | INCOME |
Cost of Goods Sold | COGS |
Expense | EXPENSE |
Other Expense | EXPENSE |
Review the mapping screen, fix anything ambiguous, then proceed.
Step 4 — Import
QBO's API exposes its accounting data as well-defined entity types. Solid's importer pulls them in dependency order:
- CompanyInfo — base currency, fiscal year start
- Account — chart of accounts created with the type mapping
- Customer — customers imported as
customer-type contacts - Vendor — vendors imported as
vendor-type contacts - Employee — imported as
employee-type contacts (no payroll data — that's a separate Intuit Payroll product) - Item — service and inventory items
- JournalEntry — manual journals (rebuilt verbatim with QBO's debit/credit lines)
- Invoice — sales invoices: DR AR / CR revenue per line, with sales-tax payable as a separate line where applicable
- Bill — vendor bills: DR expense per line / CR AP
- Payment — customer payments: DR Bank or Undeposited / CR AR, applied to specific invoices
- BillPayment — vendor payments: DR AP / CR Bank or Credit Card, applied to specific bills
- Deposit — bank deposits with multi-line splits
- Purchase — cash and credit-card spending: DR expense per line / CR Bank or Credit Card
Progress shows phase-by-phase. A typical migration with a year of activity finishes in 3–10 minutes; multi-year migrations of large files can take 30+ minutes (Intuit's API rate-limits at 500 requests/minute per realmId).
Step 5 — Verify
In Solid: Reports → Trial Balance for the same date as your saved QBO Trial Balance. Compare account by account.
Common differences:
| Difference | Likely cause |
|---|---|
| Off by retained earnings | QBO posts year-end closing entries automatically; Solid expects explicit closing. Post one adjusting entry to Retained Earnings. |
| Sales tax accounts off | QBO has its own sales-tax handling that aggregates differently from Solid's tax codes. Reconcile via Sales Tax Liability report comparison. |
| Inventory off | QBO uses FIFO; Solid imports the per-item FIFO state at the cutover date. Run a quick inventory valuation to confirm. |
| Multi-currency adjustments | QBO stores both base and foreign-currency amounts; Solid imports the base-currency amount. Re-run revaluation if you have meaningful FX gain/loss. |
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 with type, name, account number, description, parent hierarchy |
| Customers | Name, billing address, terms, default account, currency, balance, custom fields (as memo) |
| Vendors | Name, address, terms, 1099 flag (QBO's "Track payments for 1099"), TIN |
| Items | Service and inventory items with sales/purchase price, account mappings |
| Invoices | All invoices with line items, statuses, tax, dates, payment terms |
| Bills | All bills with line items |
| Payments + BillPayments | Both AR and AP payments, applied to specific invoices/bills |
| Deposits | Multi-line bank deposits |
| Journal entries | DR/CR balanced entries copied verbatim |
| Purchases | Cash + credit-card spending |
| Sales tax | Tax codes mapped to Solid's tax-code system where 1:1; QBO Automated Sales Tax requires manual setup in Solid |
What doesn't carry over
| Area | Why |
|---|---|
| QuickBooks Payroll | Separate Intuit product with its own data model; doesn't expose via the Accounting API. Re-import via Solid's payroll CSV path or set up Gusto/OnPay/ADP integration. |
| QuickBooks Time (formerly TSheets) | Time-tracking, not accounting data |
| Reconciliation history | QBO's reconciliation reports rebuild from cleared status, which Solid imports — but the historical reconciliation records (the snapshots) don't transfer |
| Memorized / recurring transactions | QBO recurring schedules don't translate; recreate as Solid recurring transactions |
| Custom report layouts | QBO-specific |
| Banking rules | QBO's auto-categorization rules are tied to QBO's bank-feed system |
| Attached documents | QBO Attachments stay in QBO; Solid doesn't pull them |
| Estimates (from older QBO accounts) | The Estimate entity is exposed but not always reliably; if estimates don't import cleanly, recreate manually |
OAuth token lifecycle
- Access token — expires after 1 hour. Solid auto-refreshes silently.
- Refresh token — expires after 100 days of inactivity. After that, Solid re-prompts for OAuth consent.
The refresh token is stored in Solid's local secret store on the connecting machine. It never leaves that machine. You can revoke Solid's access at any time from your Intuit account: My Apps → Solid Accounting → Disconnect. After revocation, Solid stops being able to pull but your imported data stays intact.
Sandbox vs Production
QBO has separate sandbox and production environments. By default Solid connects to production (your real QBO data). For testing, set QBO_ENVIRONMENT=sandbox in your environment before launching Solid. The OAuth endpoints and API base URL switch to Intuit's sandbox.
Common gotchas
OAuth fails with "redirect URI mismatch" — Solid registers a localhost redirect URI. Some VPNs and corporate firewalls block localhost callbacks. Disconnect any VPN for the duration of the OAuth flow.
"403 Forbidden — Access denied to this realm" — your QBO user role doesn't have API access. The Master Admin or Company Admin role in QBO has all needed permissions; some sub-admin roles don't. Either upgrade your role or have a Master Admin run the migration.
Migration stalls midway — usually Intuit rate-limiting. Solid retries with exponential backoff and resumes from where it stopped. Watch the progress dialog; if it sits silent for 5+ minutes with no movement, restart the import (it picks up from the next entity).
Sales tax appears as a separate line on every invoice — correct. QBO collapses sales tax into invoice totals visually but posts it as a distinct GL line; Solid preserves that line. Your trial balance reconciles either way.
Customer balances don't match QBO's Customer Detail report — usually a payment that was applied differently in QBO vs how it imported. Check the customer's transaction history; the offending payment is usually identifiable.
"Realm ID not authorized" — happens if you authorize one company but try to fetch data for another. Ensure the OAuth flow's realmId matches the company you intended to migrate.
Re-running the import creates duplicates — same as Xero and FreshBooks: not idempotent. Re-runs need a fresh .solid file.
Cross-references
- Migrate from QuickBooks Desktop — for users on
.QBWfiles - Migrate from Xero — analogous OAuth flow
- Migrate from FreshBooks — analogous OAuth flow
- Import & Export overview — full table of import paths