Work snippet 15 / 34Migration + accounting
Full-history move to simPRO and Xero, with a cutover plan
How I'd approach moving a multi-branch commercial contractor group onto simPRO and Xero with its history, so open items, jobs in progress and the opening trial balance tie on the cutover date and the old systems can be switched off.
Work snippet with example figures.
- Area
- Migration + accounting
- Tools
- simPRO · Xero · Older job system
- Typical scope
- US$3,500–5,000
- Timeline
- About 8 weeks · 4 fixed milestones
01Context
A commercial electrical and mechanical contractor group with three branches, a finance lead, a contracts administrator and an outside accountant. For years it has run quotes and job costing in an older job system and kept its books in desktop accounting software.
The systems in play
In the example the group moves to simPRO for jobs, contracts and recurring service schedules, and to Xero for the ledger, and wants its history to come with it. Customers and suppliers need their statements, project managers need job costs to date, and the accountant needs a trial balance that ties on the cutover date.
| System | What it does for the business |
|---|---|
| Older job system | Quotes, jobs, job costs and service schedules for six years. To be switched off after cutover and kept as a read-only archive. |
| Desktop accounting software | The current ledger, with open invoices, open supplier bills and fixed assets. To be replaced by Xero. |
| simPRO | The future home of customers, sites, jobs, contracts, cost centres and recurring service schedules. |
| Xero | The future ledger: contacts, open items, history for statements and the opening trial balance. |
| Accountant | Signs off the conversion balances and the first month-end. |
02Problem
What the owner sees
- A cutover that nobody can promise will be clean
- Customer statements that must still be right on day one
- Jobs in progress that lose their costs to date
- Fear of switching off the old systems and missing something
A migration fails quietly, at the seams: an invoice part-paid in one system and unpaid in the other, a supplier loaded twice, a job that restarts at zero cost. The plan has to find these before go-live, not after the first month-end.
| Everyday situation | What goes wrong |
|---|---|
| Open invoices loaded as one lump | The ageing report is right in total and wrong for every customer |
| Part-paid invoices | The invoice is loaded at its full value and the payment is lost, or the other way round |
| Duplicate customers and suppliers | The same company is loaded two or three times with different payment terms |
| Jobs in progress | Costs to date are not carried over, so margin looks better than it is |
| Invoice numbers reused between branches | Two invoices share a number and the second is rejected |
| Bank balance at cutover | Cheques and deposits in transit are missing, so the first reconciliation never closes |
| Sales tax codes | Old codes map to the wrong new code and the first return is wrong |
03Approach
Four steps, in this order. Each one ends with a result that is checked.
- LookA read-only review of the older job system, the desktop ledger and the files kept outside both. Nothing is changed. Every record type is counted and its data quality scored.
- Agree the rulesWhat moves, what is archived, how duplicates are merged, what the cutover date is and who signs off the balances are written down.
- Load and testTwo full test loads into a trial Xero organization and a simPRO test environment. Each ends with a written tie-out.
- Cut over and checkA freeze, a final extract and the live load, then a go-live check, a rollback window and a parallel first month-end.
| Item | Example setting |
|---|---|
| Cutover date | The last day of a month, so the opening trial balance is a month-end figure |
| Customers and suppliers | Merged on tax ID, then on name and postal code; a person approves every merge |
| Open items | Loaded one by one with their original date, due date and number, never as a lump per customer |
| History in Xero | 24 months of invoices and bills with payments applied, so statements and ageing work; older years kept as archived reports |
| History in simPRO | All closed jobs for six years, with costs and invoices linked, plus every open job with costs to date |
| Invoice numbers | Original numbers kept; a branch prefix is added only where two numbers collide |
| Archive | Old job system and ledger set to read-only and exported to a document store for seven years |
| Sign-off | The finance lead signs the record counts and the open items. The accountant signs the trial balance. |
04What the setup includes
What the setup includes, and why each piece is there. The detail of how it is configured is agreed in the scoping call.
Show the setup, layer by layer
| Layer | What is set up and why |
|---|---|
| Source audit | Counts and quality scores for every record type, so the plan starts from facts: duplicates, blanks, bad addresses and orphaned records. |
| Mapping workbook | One sheet per record type, with the old field, the new field, the rule and the owner. It is the written spec for every load. |
| Chart of accounts and tax codes | The old chart mapped to a new Xero chart, with a tax code map that the accountant approves before any load. |
| Contacts and sites | Merged customers and suppliers loaded into Xero as contacts, and into simPRO as customers, sites and contacts, with the same names in both. |
| Open items and history | Open invoices and bills with payments applied. History loaded after the open items, so ageing is right from the first test. |
| Jobs and costs to date | Open jobs and contracts loaded with cost centres and costs to date, so margin is right from day one. Closed jobs loaded as history. |
| Recurring schedules | Service schedules loaded with their next-visit dates and checked against a list of what is due in the first 90 days. |
| simPRO to Xero accounting link | Account and tax code mapping tested on a closed job and then on a live invoice, so each invoice reaches Xero once. |
| Cutover runbook | A timed list: freeze, final extract, load, checks, go or no-go, rollback. Each step has an owner and a pass condition. |
How the data moves
- Source audit
- Mapping workbook
- Test load 1
- Test load 2 (rehearsal)
- Freeze and final extract
- Live load
- Go-live check
- First month-end in parallel
05Edge cases
The cases that break a migration are the ones that only appear in the real data. These are agreed in advance and tested on the second test load.
| Situation | How it is handled |
|---|---|
| Part-paid invoice | Loaded at its original value with the payment applied, so the balance and the history are both right |
| Unallocated customer payment or credit note | Loaded as a prepayment or credit on the right contact, never netted off another invoice |
| Customer and supplier at the same company | One contact with both roles in Xero, and two linked records in simPRO |
| Duplicate customers | Matched by rule, listed with a recommended survivor, merged only after a person approves |
| Invoice number already used | Original number kept and a branch prefix added to the later one. The change is listed. |
| Supplier bill in another currency | Loaded in its own currency, with the cutover-date rate agreed with the accountant |
| Retention held on a project | Loaded as a retention balance on that project, not as part of the invoice |
| Job in progress with costs from two systems | Costs to date loaded as one opening cost line per cost centre, with the old reference kept in the notes |
| Bank items in transit at cutover | Each cheque and deposit loaded as an individual unreconciled item, so the first reconciliation closes |
| Transactions after the final extract | A delta load for the freeze window, or a manual entry list that is checked off at go-live |
| Staff access | Users and roles set up in simPRO and Xero before go-live and reviewed by the finance lead |
| Rollback | The old systems stay writable until the go-live check passes, then read-only. A written trigger list decides a rollback. |
06Worked example
The tables below use one cutover with example figures. They show the shape of the checks, not a client result.
| Record | Old systems | Merged out | To load | Loaded | Diff. |
|---|---|---|---|---|---|
| Customers | 2,184 | 222 | 1,962 | 1,962 | 0 |
| Suppliers | 611 | 63 | 548 | 548 | 0 |
| Sites | 3,730 | 148 | 3,582 | 3,582 | 0 |
| Open sales invoices | 318 | 0 | 318 | 318 | 0 |
| Open supplier bills | 204 | 0 | 204 | 204 | 0 |
| Open jobs and contracts | 212 | 0 | 212 | 212 | 0 |
| Closed jobs (six years) | 41,306 | 0 | 41,306 | 41,306 | 0 |
| Recurring service schedules | 486 | 12 | 474 | 474 | 0 |
Merged out: 222 duplicate customers, 63 merged or inactive suppliers, 148 duplicate site addresses and 12 expired service schedules, each on a list signed by the finance lead.
| Age | Old ledger | Xero | simPRO | Difference |
|---|---|---|---|---|
| Current | 618,402.15 | 618,402.15 | 618,402.15 | 0.00 |
| 1 to 30 days | 411,236.80 | 411,236.80 | 411,236.80 | 0.00 |
| 31 to 60 days | 298,114.45 | 298,114.45 | 298,114.45 | 0.00 |
| 61 to 90 days | 187,500.60 | 187,500.60 | 187,500.60 | 0.00 |
| Over 90 days | 127,476.40 | 127,476.40 | 127,476.40 | 0.00 |
| Total (318 invoices) | 1,642,730.40 | 1,642,730.40 | 1,642,730.40 | 0.00 |
| Account | Debit | Credit |
|---|---|---|
| Bank, operating account | 412,860.35 | |
| Bank, term deposit | 150,000.00 | |
| Accounts receivable | 1,642,730.40 | |
| Retention receivable | 286,400.00 | |
| Stock on hand | 98,215.60 | |
| Fixed assets, net | 735,540.00 | |
| Accounts payable | 986,415.20 | |
| Retention payable | 121,750.00 | |
| Sales tax payable | 144,320.80 | |
| Accrued expenses | 205,600.00 | |
| Bank loan | 480,000.00 | |
| Equity (capital and retained earnings) | 1,387,660.35 | |
| Total | 3,325,746.35 | 3,325,746.35 |
| Account | Old ledger | Xero | Difference |
|---|---|---|---|
| Accounts receivable | 1,642,730.40 | 1,642,730.40 | 0.00 |
| Accounts payable | 986,415.20 | 986,415.20 | 0.00 |
| Stock on hand | 98,215.60 | 98,215.60 | 0.00 |
| Fixed assets, net | 735,540.00 | 735,540.00 | 0.00 |
| Step | When | Owner | Pass condition | Rollback if |
|---|---|---|---|---|
| Freeze notice to staff | Two days before | Finance lead | Everyone has acknowledged it | Not applicable |
| Final extract of both old systems | Day 0, after close of business | Consultant | Counts match the last test load within the delta list | Counts differ with no explanation |
| Live load into Xero and simPRO | Day 0 evening | Consultant | Record counts and open item totals match the extract | Any total differs |
| Trial balance and control accounts | Day 1 morning | Accountant | Opening trial balance equals the old ledger at cutover | Difference not explained by the end of Day 1 |
| Test invoice, bill and payment | Day 1 | Finance lead | Each reaches Xero once with the right codes | Any posts twice or to a default account |
| Go or no-go | Day 1, 2 PM | Finance lead and consultant | All the checks above are signed | Any trigger on the rollback list |
| Old systems set to read-only | Day 3 | Finance lead | Archive export opened and spot-checked | Not applicable |
07How the result is checked
Three tie-outs decide whether the cutover goes ahead: record counts, open items and the trial balance. Each test load must pass them before the next step starts, and the second one is run as a full rehearsal.
| Check | Before | After |
|---|---|---|
| Record counts | Unknown until something is missing | Every type counted at the source, the load and the target, with each difference explained |
| Customer ageing | Rebuilt by hand from statements | Equals the old ledger for every customer and in total |
| Supplier balances | Checked at the first payment run | Equal to the old ledger for every supplier before go-live |
| Trial balance | Reconciled after the event | Signed by the accountant on Day 1 |
| Jobs in progress | Costs restart at zero | Costs to date equal to the old system, per job and cost centre |
| Statements | Hand-adjusted | A statement run for ten customers matches the old statement line by line |
| First month-end | New and old compared by hand | Parallel run: both closed, differences listed and cleared |
| Access | Set up as people ask | Roles reviewed and signed before go-live |
08Scope and milestones
A fixed scope agreed in writing before anything starts. Each milestone is paid when you sign off its deliverable.
| Area | Included |
|---|---|
| Audit | Read-only review of the older job system, the desktop ledger and the files kept outside both, a 45-minute call, written findings and a fixed quote |
| Mapping and rules | The mapping workbook, the tax code map and the cutover rules in writing, signed by the finance lead and the accountant |
| Test loads | Two full loads into a trial Xero organization and a simPRO test environment, each with a written tie-out |
| Live cutover | The final extract, live load, go-live checks and a rollback window |
| Accounting link | Mapping and testing of the simPRO to Xero link on a closed job and a live invoice |
| Parallel month-end | Support through the first month-end with a list of differences and fixes |
| Archive | An export of the old systems to a document store, with a short index |
| Handover | Written SOPs, a recorded handover video and files you own, plus 14 days of fixes after go-live |
| Not included | Tax filing and statutory returns. |
| Also outside the scope | Training of every user beyond the handover video. Building new reports in simPRO. Moving to a different accounting package after Xero. Software subscriptions (billed to you by the vendors). |
| Milestone | Deliverable | Timing | Share |
|---|---|---|---|
| M1 Audit and mapping | Findings, a fixed quote, the mapping workbook and the cutover rules in writing | Weeks 1 to 2 | 20% |
| M2 Test loads | Two test loads with passing tie-outs | Weeks 3 to 5 | 30% |
| M3 Cutover | Live load, go-live checks signed and a rollback window closed | Weeks 6 to 7 | 35% |
| M4 Parallel month-end and handover | First month-end closed, SOPs, handover video, 14 days of fixes | Week 8 | 15% |
Typical scope for this kind of project: US$3,500–5,000
About 8 weeks across 4 fixed milestones. The Systems Audit (US$300, fixed) comes first and confirms the scope.
Describe what is going wrong between your job system and your books, and I'll say where I'd look first.
Send a short note through the form on the home page. I will reply with where I would start, and whether the US$300 Systems Audit is the right first step.