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.

Systems map: who uses what
SystemWhat it does for the business
ServiceM8Source of clients, job addresses, contacts, jobs, quotes, materials, time, invoices, labels, attachments and forms. Read-only after cutover.
simPROTarget for customers, sites, contacts, equipment (assets), jobs with cost centres, quotes and maintenance plans.
XeroStays as the ledger. Receives new invoices from simPRO after cutover only. Historic invoices are never re-sent.
Staging workbookOne mapping sheet per record type, with the rule, the owner and the load result for each.
Operations managerApproves job, status and asset mapping and reviews the asset exceptions list.
Finance lead and accountantSign off the open items and the invoice history flag before any live load.

How the data moves

  1. ServiceM8 export
  2. Staging workbook
  3. Cleaned and mapped
  4. simPRO test load
  5. Tie-out
  6. Rehearsal
  7. Live load
  8. Xero link switched on

Problem

What the owner sees

  1. A history that stays behind in ServiceM8 forever
  2. Equipment records that nobody can find in the new system
  3. Fear that the move re-sends old invoices to Xero
  4. 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.

Where the drift starts
Everyday situationWhat goes wrong
Client with many job addressesEvery address loaded as a separate customer, so the account is split ten ways
Equipment written in job notesThe serial number is in free text and never becomes a searchable asset
Completed jobs loaded with an invoice linkThe accounting link treats them as new and pushes duplicates into Xero
Materials without a catalogue itemCost lines load with no part, so margin reports are blank
Labels and queuesStatus information is dropped, so open work loses its place
Attachments and formsPhotos 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.

  1. LookA read-only export and audit of ServiceM8: counts, duplicates, blank fields, and a scan of notes and forms for equipment details.
  2. Agree the rulesMapping for every record type, the status map, the equipment rules and the invoice history flag are written down and signed.
  3. Load and testTwo test loads into a simPRO test environment, each ending in a written tie-out. The second is a full rehearsal.
  4. Cut over and checkFreeze, delta export, live load, Xero link switched on, go-live checks, and a read-only archive of ServiceM8.
Rules agreed in writing (example settings)
ItemExample setting
Cutover dateThe last Friday of a month, after the final invoice run in ServiceM8
Customer and site structureOne customer per client company. Each job address becomes a site under it, matched on normalised address.
Job historyAll completed jobs for six years loaded as closed jobs with cost centres, materials, time and invoice reference
Open workAll open jobs and scheduled visits loaded with status, assigned staff and costs to date
Historic invoicesLoaded with a historic flag and excluded from the accounting link, so nothing is re-sent to Xero
EquipmentExtracted from notes, forms and asset fields, reviewed by the operations manager, loaded against the site
AttachmentsPhotos and PDFs copied to the matching simPRO job, with the original date in the file name
ArchiveServiceM8 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.

Load sequence and dependencies
StepSourceTargetRule or dependency
1Companies and contactssimPRO customers and contactsMerged duplicates approved first
2Job addressessimPRO sitesNeeds step 1; matched on normalised address
3Equipment recordssimPRO site equipmentNeeds step 2; reviewed list only
4Materials and cataloguesimPRO catalogue and cost centresPart numbers created before any job line
5Completed jobsClosed jobs with costsNeeds steps 2 to 4
6InvoicesHistoric invoice recordsFlagged so the Xero link ignores them
7Open jobs and visitsOpen jobs, scheduled visitsLast, after the delta export
8AttachmentsJob and site attachmentsMatched on the job number kept in step 5
Field mapping, ServiceM8 to simPRO (example settings)
ServiceM8simPRORule
Company nameCustomer nameTrimmed, case-normalised, legal suffix kept
Job addressSite name and addressOne site per normalised address under the customer
Contact name, phone, emailContact on customer and siteMobile and email validated, invalid values listed
Job descriptionJob descriptionKept in full, technician notes appended as a note
Job status and queueJob statusMapped by the signed status table
Material lineCost centre catalogue lineMatched on part name; new items created in a reviewed batch
Time and activityLabour on the cost centreStaff mapped to simPRO employees; unknown staff to a legacy employee
Invoice numberInvoice reference on the jobOriginal number kept, historic flag set
LabelCustomer or job tagMapped by list; unmapped labels listed
Asset serial and typeEquipment serial and typeParsed 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.

Edge cases and how each is handled
SituationHow it is handled
Client with several legal entitiesSeparate customers, linked by a group note, never merged without approval
Same address under two clientsOne site per client; the shared address is listed for the operations manager
Equipment replaced in a later jobThe old unit is marked replaced with the date and the new unit is added
Serial number unreadable or missingLoaded as equipment with no serial and listed on the asset exceptions list
Job with materials but no part nameLoaded to a generic catalogue line, with the original text in the note
Technician who has leftMapped to an inactive employee so history keeps the name
Recurring jobConverted to a maintenance plan with the next visit date, then checked against a 90-day list
Invoice part-paid at cutoverLoaded with its payments, balance unchanged, and excluded from the Xero link
Job edited after the final exportDelta export for the freeze window, applied before go-live
Attachment too large or unreadableListed 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 counts: source to loaded (example figures)
Record typeIn ServiceM8Excluded or mergedLoaded to simPRO
Clients1,41296 merged1,316
Job addresses2,30587 duplicate2,218
Completed jobs18,402018,402
Cancelled or no-charge jobs438438 archive only0
Open jobs2800280
All jobs19,12043818,682
Equipment extracted from notes, forms and asset fields (example figures)
StageRecordsOutcome
Found by pattern and field search4,860
Clean: serial and type read4,311Loaded
Needs review549Sent to the operations manager
Review: accepted471Loaded
Review: rejected78Not loaded, kept in the archive
Equipment in simPRO4,7824311 + 471
Status map for open work (example settings)
ServiceM8 queue or statussimPRO status
Quote sentQuote: sent
Work orderJob: scheduled
In progressJob: in progress
Needs partsJob: on hold, reason parts
Completed, not invoicedJob: complete, awaiting invoice
InvoicedJob: invoiced (historic)
Tie-out after test load 2 (example figures, US$)
MeasureServiceM8simPRODifference
Jobs loaded18,68218,6820
Invoices, count17,96417,9640
Invoices, total value9,418,230.009,418,230.000.00
Open invoices, balance184,420.50184,420.500.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.

What is watched, and who hears about it
SignalThresholdAlert goes toFirst action
Load script failureAny failed batchOperations manager and Manaz Afzal by emailBatch stopped, error list reviewed, batch re-run on its own
Count difference after a loadAny difference from the staging workbookFinance leadLoad paused until the difference is explained
Historic invoice sent to XeroAny invoice with the historic flag in the link queueFinance lead and Manaz Afzal, immediatelyLink switched off, entry reversed in Xero, rule fixed
Equipment without a siteAny recordOperations managerRecord held on the exceptions list
Daily after go-liveNew simPRO invoices compared to Xero for 30 daysFinance lead, daily summaryUnmatched 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.

Test plan with PASS and FAIL conditions
IDCheckMethodPASS whenFAIL when
T1Customer and site structureTen multi-address clients checked by handEvery site sits under the right customerAny site on the wrong customer
T2Record countsStaging workbook against simPRO after each loadEqual, or each difference is on the exceptions listUnexplained difference
T3Equipment spot check by handFifty items checked against the original job noteSerial, type and site all correctMore than two wrong
T4Invoice history valueTotal and count compared by branch and yearEqual to the centAny difference
T5Xero link on a closed jobEdit a historic job in testNothing reaches XeroAnything reaches Xero
T6Xero link on a live jobInvoice one new job in the test linkOne invoice in Xero with the right codesNo invoice, two invoices or wrong tax code
T7Open workEvery open job checked against the ServiceM8 listStatus, staff and next visit matchAny open job missing
T8AttachmentsRandom 40 jobs opened in simPROAll files open and match the jobAny 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.

Cutover runbook and rollback triggers
StepOwnerGate to continueRollback trigger
Freeze new jobs and edits in ServiceM8Operations managerStaff confirm in writingNot applicable
Final export and delta loadManaz AfzalCounts equal to the staging workbookAny count difference not explained
Run checks T2, T4, T7Manaz Afzal and finance leadAll PASSAny FAIL that cannot be cleared in the window
Switch on the Xero linkFinance leadT6 passes on a live jobDuplicate or wrong invoice in Xero
Go or no-goOwnerAll gates passedOwner decision
RollbackOperations managerServiceM8 reopened, simPRO load discardedDecision recorded with the reason
Archive ServiceM8Operations managerSeven days of clean runningNot applicable

Scope and milestones

A fixed scope agreed in writing before anything starts. Each milestone is paid when you sign off its deliverable.

Scope: what a project like this covers
AreaIncluded
Systems AuditRead-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 workbookOne sheet per record type with rules, owners and results
ExtractionCompanies, sites, jobs, materials, time, invoices, attachments and forms
Equipment registerExtracted, reviewed and loaded against sites
Two test loadsEach with a written tie-out
Xero linkConfigured and tested so history is never re-sent
Cutover and archiveRunbook, delta load, go-live checks and a read-only archive
HandoverWritten SOPs, a recorded handover video and files you own, plus 14 days of fixes after go-live
Not includedTax filing and statutory returns.
Also outside the scopeTraining of every user. Building new simPRO reports. Price book redesign. Software subscriptions (billed to you by the vendors).
Fixed milestones
MilestoneDeliverableTimingShare
M1 Audit and rulesFindings, a fixed quote, mapping rules signedWeek 120%
M2 Test load 1Structure and equipment loaded, tie-out writtenWeeks 2 to 430%
M3 RehearsalFull test load 2, checks T1 to T8 runWeeks 5 to 630%
M4 Cutover and handoverLive load, Xero link on, archive, SOPs, handover video, 14 days of fixesWeeks 7 to 820%

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.

Hire me on Upwork (opens in a new tab)Hire me on Freelancer (opens in a new tab)