Migrate from FreshBooks
Solid Accounting connects to FreshBooks via the standard FreshBooks OAuth 2.0 flow and pulls accounts, clients, items, invoices, expenses, payments, and journal entries through the FreshBooks New (FBNC) Accounting API.
A note on FreshBooks history: the classic FreshBooks API (pre-2017) didn't model double-entry properly — it was an invoicing tool that grew. The New version (also called FBNC, available in your account if you're on the modern UI) has a proper Accounting module that maps cleanly to a real general ledger. Solid integrates with FBNC; if you're still on classic FreshBooks, see the "Classic FreshBooks" section below.
Before you start
Have ready:
- Your FreshBooks login (email/password or SSO)
- Owner or Admin role in the FreshBooks business you're migrating
- Your installed copy of Solid Accounting with your license activated
- A Trial Balance from FreshBooks as of your migration date — Reports → Accounting → Trial Balance — for verification
Run the migration on a fresh .solid file. FreshBooks data is read-only on import; nothing in your FB account is modified.
Step 1 — Connect via OAuth
In Solid Accounting:
- Open the new file you want to import into.
- Welcome screen → Import from other software → FreshBooks. Or use the command palette (⌘K / Ctrl+K) and search for "Import from FreshBooks".
- The OAuth dialog opens my.freshbooks.com in your browser.
- Sign in with your FreshBooks credentials.
- Authorize Solid Accounting for the scopes:
- Read access to invoices, expenses, payments, journal entries
- Read access to clients, items, accounts, business info
- Pick the business to import. If your FreshBooks login has access to multiple businesses (an accountant managing multiple clients, for instance), choose which one to migrate.
After authorization, Solid Accounting begins fetching the import preview.
Step 2 — Review the preview
Business: Acme Consulting
Chart of accounts: 34 accounts
Clients: 89 clients
Items: 14
Invoices: 287
Expenses: 156
Payments: 312
Journal entries: 22
Wrong business? Cancel and re-run; pick a different business at step 1.6.
Step 3 — Account mapping
FreshBooks's chart of accounts uses simple type codes. Solid maps them to its own account types:
| FreshBooks type | → Solid type |
|---|---|
bank | CASH |
accounts_receivable | RECEIVABLE |
current_asset | ASSET |
fixed_asset | FIXED_ASSET |
accounts_payable | PAYABLE |
current_liability | LIABILITY |
long_term_liability | LT_LIABILITY |
equity | EQUITY |
revenue / income | INCOME |
cost_of_goods_sold | COGS |
expense | EXPENSE |
Review the mapping screen; everything ambiguous is flagged in amber so you can fix it before proceeding.
Step 4 — Import
The phased import (in order):
- Business / settings
- Chart of accounts
- Clients → Solid contacts (
customertype) - Items with their default income/expense accounts
- Invoices — DR AR / CR revenue per line
- Expenses (FreshBooks's "expense" entries) → Solid bills: DR expense / CR AP
- Payments — both received (clears AR) and made (clears AP)
- Journal entries — manual journals copied verbatim
Progress shows phase-by-phase. Smaller files (typical FreshBooks user) finish in 1–3 minutes.
Step 5 — Verify
In Solid: Reports → Trial Balance for the same date as your saved FreshBooks Trial Balance. They should match account by account.
If they don't, the most common causes:
- Off by retained earnings — FreshBooks closes prior years automatically; post a one-time adjusting entry to Retained Earnings
- Tax-payable accounts off — sales tax handling can differ; reconcile manually if you've used FreshBooks's tax features
- One-off mappings — an account mapped to the wrong type. Edit the account in Solid; if no transactions have hit it yet, the type change is clean
Compare the Balance Sheet and P&L too. Three matching reports = clean migration.
What carries over
| Area | Carries over |
|---|---|
| Chart of accounts | All accounts with type, name, description |
| Clients | Name, address, email, terms, currency, default account |
| Items | Service items with sales price + revenue account |
| Invoices | All invoices with line items, statuses, dates, terms |
| Expenses (bills) | All expense entries with categorization |
| Payments | Both customer payments (AR) and bill payments (AP), applied |
| Journal entries | Manual journal entries with DR/CR balanced |
| Reconciliation status | Where present in FreshBooks, mapped to cleared status |
| Tax codes (modern FBNC) | Per-line tax assignments where the API exposes them |
What doesn't carry over
| Area | Why |
|---|---|
| Time tracking | FreshBooks Time isn't accounting data — it's billable-time tracking. If you've billed through FB Time, those bills come over as invoices; the time entries themselves don't. |
| Projects | FreshBooks Projects map loosely to Solid's projects/dimensions; manual setup recommended for active projects |
| Estimates / Proposals | FreshBooks has both; Solid imports estimates. Proposals (more elaborate, sales-pipeline data) don't map cleanly — recreate as estimates if needed |
| Recurring invoices | FB recurring schedules don't translate; recreate as Solid recurring entries |
| Files attached to invoices/expenses | Stay in FreshBooks; Solid doesn't pull them |
| Client portal logins | Your clients' FB portal access stays with FB; Solid's invoice delivery is separate |
Classic FreshBooks (pre-2017)
If your business is on Classic FreshBooks (the old UI, sometimes labeled "FreshBooks Classic"), the OAuth integration won't work — classic uses a different API. Two options:
- Migrate to FreshBooks New first, then run the OAuth import. FreshBooks has had a self-service migration path from Classic to New for years.
- Export to CSV from Classic and import via Solid's CSV import. You lose more structure (no proper invoice → AR posting, etc.) but it works.
Option 1 is cleaner if you're going to keep using FreshBooks alongside Solid for any period. If you're cutting over completely, option 2 is fine — you only need history, not ongoing structure.
OAuth token lifecycle
FreshBooks's OAuth refresh tokens last ~12 hours of inactivity. After that, Solid prompts to re-authorize. This is more aggressive than Xero or QuickBooks; in practice, if you're actively using Solid you'll never see it, but a long lapse triggers re-auth.
Revoke Solid's access at any time from FreshBooks: Settings → Apps & Integrations. After revocation, Solid stops being able to pull but imported data stays intact.
Common gotchas
OAuth fails on the consent screen — FreshBooks requires the connecting user to be the business owner OR have a specific role with API access. Standard users don't have it. Either log in as the owner or grant your user the necessary role.
"This API is not available for classic accounts" — your business is still on Classic FreshBooks. Migrate to FreshBooks New first (FB has a self-service migration path).
Tax totals look off — FreshBooks's tax handling has changed across product versions. The current FBNC tax model maps to Solid's tax codes; if you're using older tax-on-invoice patterns, totals may need adjusting entries.
Imported clients have weird names — FreshBooks lets you record either a company name or a person name as the primary contact identifier. Solid imports both fields; if the display name looks wrong, edit the contact in Solid after import.
Re-import creates duplicates — same as the Xero migration; Solid's FreshBooks import isn't idempotent. Re-runs need a fresh .solid file.
Cross-references
- Migrate from QuickBooks — for QuickBooks Desktop or Online users
- Migrate from Xero — for Xero users (similar OAuth flow)
- Import & Export overview — table of every import path