Work snippetMigration + assets
ServiceM8 to simPRO migration, with job history and an equipment register
How I would approach moving a 28-tech commercial plumbing and electrical contractor from ServiceM8 to simPRO with six years of jobs and every piece of equipment it has serviced, without a single historic invoice reaching Xero twice.
Work snippet with example figures.
- Area
- Migration + assets
- Tools
- ServiceM8 · simPRO · Xero
- Typical scope
- US$3,200–5,000
- Timeline
- About 8 weeks · 4 fixed milestones
Context and systems map
A 28-tech commercial plumbing and electrical contractor with two branches, a finance lead, an operations manager and an outside accountant. Six years of jobs, quotes and client history sit in ServiceM8, the ledger is in Xero, and equipment details live in job notes, forms and photos.
The systems in play
In the example the business is moving to simPRO for job costing, an equipment register and maintenance plans, and wants its job history and every asset it has ever serviced to come with it. Xero stays as the ledger, so the move must not create a single duplicate invoice there.
| System | What it does for the business |
|---|---|
| ServiceM8 | Source of clients, job addresses, contacts, jobs, quotes, materials, time, invoices, labels, attachments and forms. Read-only after cutover. |
| simPRO | Target for customers, sites, contacts, equipment (assets), jobs with cost centres, quotes and maintenance plans. |
| Xero | Stays as the ledger. Receives new invoices from simPRO after cutover only. Historic invoices are never re-sent. |
| Staging workbook | One mapping sheet per record type, with the rule, the owner and the load result for each. |
| Operations manager | Approves job, status and asset mapping and reviews the asset exceptions list. |
| Finance lead and accountant | Sign off the open items and the invoice history flag before any live load. |
How the data moves
- ServiceM8 export
- Staging workbook
- Cleaned and mapped
- simPRO test load
- Tie-out
- Rehearsal
- Live load
- Xero link switched on
Problem
What the owner sees
- A history that stays behind in ServiceM8 forever
- Equipment records that nobody can find in the new system
- Fear that the move re-sends old invoices to Xero
- Technicians who lose the notes from the last visit
ServiceM8 and simPRO model the same work differently. A ServiceM8 job is one record with materials and time on it; simPRO wants a job with cost centres, sites and equipment. A move that copies fields without translating the structure produces a system that looks full and cannot be searched.
| Everyday situation | What goes wrong |
|---|---|
| Client with many job addresses | Every address loaded as a separate customer, so the account is split ten ways |
| Equipment written in job notes | The serial number is in free text and never becomes a searchable asset |
| Completed jobs loaded with an invoice link | The accounting link treats them as new and pushes duplicates into Xero |
| Materials without a catalogue item | Cost lines load with no part, so margin reports are blank |
| Labels and queues | Status information is dropped, so open work loses its place |
| Attachments and forms | Photos stay in the old system and are lost when the subscription ends |
Approach
Four steps, in this order. Each one ends with a result that is checked.
- LookA read-only export and audit of ServiceM8: counts, duplicates, blank fields, and a scan of notes and forms for equipment details.
- Agree the rulesMapping for every record type, the status map, the equipment rules and the invoice history flag are written down and signed.
- Load and testTwo test loads into a simPRO test environment, each ending in a written tie-out. The second is a full rehearsal.
- Cut over and checkFreeze, delta export, live load, Xero link switched on, go-live checks, and a read-only archive of ServiceM8.
| Item | Example setting |
|---|---|
| Cutover date | The last Friday of a month, after the final invoice run in ServiceM8 |
| Customer and site structure | One customer per client company. Each job address becomes a site under it, matched on normalised address. |
| Job history | All completed jobs for six years loaded as closed jobs with cost centres, materials, time and invoice reference |
| Open work | All open jobs and scheduled visits loaded with status, assigned staff and costs to date |
| Historic invoices | Loaded with a historic flag and excluded from the accounting link, so nothing is re-sent to Xero |
| Equipment | Extracted from notes, forms and asset fields, reviewed by the operations manager, loaded against the site |
| Attachments | Photos and PDFs copied to the matching simPRO job, with the original date in the file name |
| Archive | ServiceM8 exported in full and set to read-only for seven years |
Flow and data mapping
Two tables define the move. The first is the order of operations and what each load depends on. The second is the field-level mapping that the load scripts follow.
| Step | Source | Target | Rule or dependency |
|---|---|---|---|
| 1 | Companies and contacts | simPRO customers and contacts | Merged duplicates approved first |
| 2 | Job addresses | simPRO sites | Needs step 1; matched on normalised address |
| 3 | Equipment records | simPRO site equipment | Needs step 2; reviewed list only |
| 4 | Materials and catalogue | simPRO catalogue and cost centres | Part numbers created before any job line |
| 5 | Completed jobs | Closed jobs with costs | Needs steps 2 to 4 |
| 6 | Invoices | Historic invoice records | Flagged so the Xero link ignores them |
| 7 | Open jobs and visits | Open jobs, scheduled visits | Last, after the delta export |
| 8 | Attachments | Job and site attachments | Matched on the job number kept in step 5 |
| ServiceM8 | simPRO | Rule |
|---|---|---|
| Company name | Customer name | Trimmed, case-normalised, legal suffix kept |
| Job address | Site name and address | One site per normalised address under the customer |
| Contact name, phone, email | Contact on customer and site | Mobile and email validated, invalid values listed |
| Job description | Job description | Kept in full, technician notes appended as a note |
| Job status and queue | Job status | Mapped by the signed status table |
| Material line | Cost centre catalogue line | Matched on part name; new items created in a reviewed batch |
| Time and activity | Labour on the cost centre | Staff mapped to simPRO employees; unknown staff to a legacy employee |
| Invoice number | Invoice reference on the job | Original number kept, historic flag set |
| Label | Customer or job tag | Mapped by list; unmapped labels listed |
| Asset serial and type | Equipment serial and type | Parsed by pattern, unclear values sent to review |
Edge cases handled
Agreed in advance with the finance lead and the operations manager, and tested before go-live.
| Situation | How it is handled |
|---|---|
| Client with several legal entities | Separate customers, linked by a group note, never merged without approval |
| Same address under two clients | One site per client; the shared address is listed for the operations manager |
| Equipment replaced in a later job | The old unit is marked replaced with the date and the new unit is added |
| Serial number unreadable or missing | Loaded as equipment with no serial and listed on the asset exceptions list |
| Job with materials but no part name | Loaded to a generic catalogue line, with the original text in the note |
| Technician who has left | Mapped to an inactive employee so history keeps the name |
| Recurring job | Converted to a maintenance plan with the next visit date, then checked against a 90-day list |
| Invoice part-paid at cutover | Loaded with its payments, balance unchanged, and excluded from the Xero link |
| Job edited after the final export | Delta export for the freeze window, applied before go-live |
| Attachment too large or unreadable | Listed with the job number, kept in the archive and re-attached by hand if needed |
Worked example
The tables below use one example business of two branches. They show the shape of the checks, not a client result.
| Record type | In ServiceM8 | Excluded or merged | Loaded to simPRO |
|---|---|---|---|
| Clients | 1,412 | 96 merged | 1,316 |
| Job addresses | 2,305 | 87 duplicate | 2,218 |
| Completed jobs | 18,402 | 0 | 18,402 |
| Cancelled or no-charge jobs | 438 | 438 archive only | 0 |
| Open jobs | 280 | 0 | 280 |
| All jobs | 19,120 | 438 | 18,682 |
| Stage | Records | Outcome |
|---|---|---|
| Found by pattern and field search | 4,860 | |
| Clean: serial and type read | 4,311 | Loaded |
| Needs review | 549 | Sent to the operations manager |
| Review: accepted | 471 | Loaded |
| Review: rejected | 78 | Not loaded, kept in the archive |
| Equipment in simPRO | 4,782 | 4311 + 471 |
| ServiceM8 queue or status | simPRO status |
|---|---|
| Quote sent | Quote: sent |
| Work order | Job: scheduled |
| In progress | Job: in progress |
| Needs parts | Job: on hold, reason parts |
| Completed, not invoiced | Job: complete, awaiting invoice |
| Invoiced | Job: invoiced (historic) |
| Measure | ServiceM8 | simPRO | Difference |
|---|---|---|---|
| Jobs loaded | 18,682 | 18,682 | 0 |
| Invoices, count | 17,964 | 17,964 | 0 |
| Invoices, total value | 9,418,230.00 | 9,418,230.00 | 0.00 |
| Open invoices, balance | 184,420.50 | 184,420.50 | 0.00 |
Monitoring and alerting
The load is watched in every run, and the Xero link is watched for the first 30 days, because that is where a mistake would reach the books.
| Signal | Threshold | Alert goes to | First action |
|---|---|---|---|
| Load script failure | Any failed batch | Operations manager and Manaz Afzal by email | Batch stopped, error list reviewed, batch re-run on its own |
| Count difference after a load | Any difference from the staging workbook | Finance lead | Load paused until the difference is explained |
| Historic invoice sent to Xero | Any invoice with the historic flag in the link queue | Finance lead and Manaz Afzal, immediately | Link switched off, entry reversed in Xero, rule fixed |
| Equipment without a site | Any record | Operations manager | Record held on the exceptions list |
| Daily after go-live | New simPRO invoices compared to Xero for 30 days | Finance lead, daily summary | Unmatched invoices investigated the same day |
Test plan
Every check has a written pass condition and a written fail condition before it is run. A FAIL stops the next step until it is cleared and re-run.
| ID | Check | Method | PASS when | FAIL when |
|---|---|---|---|---|
| T1 | Customer and site structure | Ten multi-address clients checked by hand | Every site sits under the right customer | Any site on the wrong customer |
| T2 | Record counts | Staging workbook against simPRO after each load | Equal, or each difference is on the exceptions list | Unexplained difference |
| T3 | Equipment spot check by hand | Fifty items checked against the original job note | Serial, type and site all correct | More than two wrong |
| T4 | Invoice history value | Total and count compared by branch and year | Equal to the cent | Any difference |
| T5 | Xero link on a closed job | Edit a historic job in test | Nothing reaches Xero | Anything reaches Xero |
| T6 | Xero link on a live job | Invoice one new job in the test link | One invoice in Xero with the right codes | No invoice, two invoices or wrong tax code |
| T7 | Open work | Every open job checked against the ServiceM8 list | Status, staff and next visit match | Any open job missing |
| T8 | Attachments | Random 40 jobs opened in simPRO | All files open and match the job | Any missing file |
Cutover and rollback
The cutover is a timed list with a named owner for every step. ServiceM8 stays writable until the go-live checks pass, then becomes read-only.
| Step | Owner | Gate to continue | Rollback trigger |
|---|---|---|---|
| Freeze new jobs and edits in ServiceM8 | Operations manager | Staff confirm in writing | Not applicable |
| Final export and delta load | Manaz Afzal | Counts equal to the staging workbook | Any count difference not explained |
| Run checks T2, T4, T7 | Manaz Afzal and finance lead | All PASS | Any FAIL that cannot be cleared in the window |
| Switch on the Xero link | Finance lead | T6 passes on a live job | Duplicate or wrong invoice in Xero |
| Go or no-go | Owner | All gates passed | Owner decision |
| Rollback | Operations manager | ServiceM8 reopened, simPRO load discarded | Decision recorded with the reason |
| Archive ServiceM8 | Operations manager | Seven days of clean running | Not applicable |
Scope and milestones
A fixed scope agreed in writing before anything starts. Each milestone is paid when you sign off its deliverable.
| Area | Included |
|---|---|
| Systems Audit | Read-only review of ServiceM8, a scan of notes and forms for equipment, and the Xero link plan, a 45-minute call, written findings and a fixed quote |
| Mapping workbook | One sheet per record type with rules, owners and results |
| Extraction | Companies, sites, jobs, materials, time, invoices, attachments and forms |
| Equipment register | Extracted, reviewed and loaded against sites |
| Two test loads | Each with a written tie-out |
| Xero link | Configured and tested so history is never re-sent |
| Cutover and archive | Runbook, delta load, go-live checks and a read-only archive |
| 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. Building new simPRO reports. Price book redesign. Software subscriptions (billed to you by the vendors). |
| Milestone | Deliverable | Timing | Share |
|---|---|---|---|
| M1 Audit and rules | Findings, a fixed quote, mapping rules signed | Week 1 | 20% |
| M2 Test load 1 | Structure and equipment loaded, tie-out written | Weeks 2 to 4 | 30% |
| M3 Rehearsal | Full test load 2, checks T1 to T8 run | Weeks 5 to 6 | 30% |
| M4 Cutover and handover | Live load, Xero link on, archive, SOPs, handover video, 14 days of fixes | Weeks 7 to 8 | 20% |
Typical scope for this kind of project: US$3,200–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 will say where I would 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.