Stage 3 of 5

Available

Migrate

Migration is the stage that fails, and it fails for one reason: data goes in before the structure that gives it meaning is settled.

Length
2–6 weeks
Riskiest step
Opening balances
Rule
Structure → balances → history
Proof
A trial balance that ties

The order

Settle the structure

Chart of accounts, dimensions, pipeline stages, project shape, part numbering. Nothing goes in until these stop changing. This is the step people rush and the step that determines whether the migration is done once or twice.

Pick a cutover date

The first day of a period, never mid-month. Everything before it is history; everything after it is live.

Load opening balances

One journal entry as at the day before cutover, taken from the old system's trial balance. This is the number everything else will be checked against.

Load open items

Unpaid invoices, unpaid bills, open deals, live projects. These are the things people will touch in week one, so they matter more than history.

Load transactional history last

Prior-period detail is for reporting, not for operating. Bringing it in last means a delay here does not delay going live.

Reconcile and sign off

A trial balance in erp.io that ties to the old system, agreed by whoever signs your accounts.

Never migrate into an open period you intend to keep posting to

If the cutover date is inside a period that is still being posted to in the old system, you get two partial truths and no way to reconcile them. Close the old period, then migrate, then post forward only in the new system.

What to bring, and what to leave

DataBring it?Why
Chart of accountsYes — firstEverything else references it.
Opening balancesYesThe anchor for every later check.
Open AR and APYesPeople will chase and pay these in week one.
Customers and vendorsYesCheap to bring, painful to type again.
Prior-year detailUsuallyUseful for comparatives. Not urgent — load it after go-live.
Five years of detailRarelyKeep the old system read-only instead. Cheaper and more accurate.
Closed deals from the old CRMSummary onlyFull history of dead deals adds noise to every pipeline report.
Attachments and documentsSelectivelyBulk file migration is slow and most of it is never opened again.
Keeping the old system read-only is a legitimate migration strategy

It is often the right one. You need history to be *available*, not to be *in the new system*. One archived export plus read-only access satisfies most auditors and saves weeks.

How to prove it worked

  1. Trial balance ties. Run Trial Balance as at cutover and compare it line for line with the old system. Not a total — line for line.
  2. AR and AP agings tie. Totals and the bucket splits. A total that matches with different buckets means dates came across wrong.
  3. Bank balances tie to statements. Not to the old system — to the bank. If the old system was wrong, do not import the error.
  4. Spot-check twenty transactions. Chosen by somebody who did not do the migration.
  5. One person signs it off in writing. Whoever signs your accounts.
app.erp.io/accounting/reports/trial-balance
Trial Balance

As at 31 March 2026 · GBP

ExportPrint
AccountCodeDebitCredit
Bank — current101084,210.55
Accounts receivable110046,980.00
Accounts payable210031,405.20
Share capital300010,000.00
Retained earnings310089,785.35
Total131,190.55131,190.55
A trial balance after migration. The check is that every line matches the old system, not just the total.

What this does not do

No self-serve import wizard

There is no screen that takes a QuickBooks or Xero export and loads it. Migrations run through the API or through us.

No automatic reconciliation to the old system

Nothing compares the two systems for you. The tie-out is a person with two reports.

No partial rollback

If a load goes in wrong, the fix is to reverse it with journal entries or start the organisation again — there is no undo for a bulk import.

Questions

Can you do the migration for us?

Yes — that is a services engagement. See Implementation.

How long does a typical migration take?

Two to six weeks of elapsed time, most of it waiting on decisions about structure rather than on data movement.

What if our old data is wrong?

Do not import the error. Correct it in the old system or adjust on the way in, and document which you did.