All documentation
What comes across from ServiceM8
TradesSync syncs two things and attaches everything else to them. Once you understand that, the rest of the setup makes sense.
The two things
| In ServiceM8 | Becomes in GoHighLevel |
|---|---|
| Client | Contact |
| Job card | Opportunity — if you have opportunities switched on |
Opportunities are optional and off on a new account. With them off you still get every client as a contact, kept up to date, with tags driven by the job's status, queue, category or badges. Plenty of trades run it that way and build the rest with GoHighLevel workflows.
That is the whole model. Everything else attached to a job — line items, payments, notes, job contacts, attachments, checklists, form responses, badges, category and queue — is gathered up and becomes fields on that contact or opportunity.
Nothing turns into a separate GoHighLevel record. Your materials list does not become five GoHighLevel objects; it becomes a field on the opportunity containing the materials. That keeps your CRM readable instead of drowning it in records nobody looks at.
Find any job by its number
Every opportunity is named with its ServiceM8 job number first, like #4503 – George – Supply and installation of a new cooker. Type the job number into GoHighLevel's opportunity search and it comes straight up. When a customer rings about job 4503, you are not scrolling through a pipeline looking for it.
Everything that can come across
There are around 160 ServiceM8 fields available to map, grouped by where they live:
- Job — status, job number, description, address, dates, quote and invoice totals, payment state, PO number
- Client — name, full address broken into parts, website, payment terms, tax details
- Contacts — first name, last name, email, phone, mobile
- Category and queue — name, colour, timeframe
- Payments — amount, date, method, notes
- Materials — name, quantity, price, cost
- Notes — the note text and who wrote it
- Activities — scheduled start and end
- Attachments — file names
- Form responses — checklist and form data captured on site
- Badges — the badge names on the job
You decide which of those actually travel. See Field mapping.
How often
ServiceM8 is checked every five minutes for anything created or changed. There is nothing to press and no schedule to configure.
It remembers what it has synced
This is the big difference between TradesSync and a Zap. A typical Zap has no memory: something happens in ServiceM8, it fires an action in GoHighLevel, and it has no idea what it did last time.
TradesSync keeps a record of every link it makes. Each ServiceM8 client is tied to its GoHighLevel contact, and each job card to its opportunity, and each job also records which customer it belongs to. Only the IDs are stored, never a second copy of your customers' names, emails or phone numbers. Because of that record, TradesSync can:
- Update instead of duplicating. The same job updates the same opportunity every time, rather than creating a new one every five minutes.
- Move jobs through your pipeline as they move through your statuses, queues or categories.
- Swap tags over cleanly. When a job changes queue or category, the old tag comes off as the new one goes on.
- Pick up what you already had. If an opportunity for the job already exists in GoHighLevel, it is linked rather than doubled up.
- Spot a change of client. If someone changes the client on an existing job, the old customer's opportunity is left alone and the new customer gets their own, so nothing is sent to the wrong person.
- Leave things alone. If nothing about a job has changed, its opportunity is not touched, so GoHighLevel workflows that watch for changes do not fire for nothing.
- Put itself right. If an opportunity or contact has been deleted in GoHighLevel, it is recreated or relinked instead of failing on every check.
- Show its working. Your sync log records exactly what it did, to which record, and why.
What does not come across
The sync starts the day you connect. It watches for jobs and clients that are created or changed from that point onwards. A job that has sat untouched since before you signed up will not appear on its own, because as far as ServiceM8 is concerned nothing has happened to it. Change something on the job itself and it comes through on the next check.
A returning customer's old jobs stay where they are too. When a client comes back with a new job, only that new job comes across. Their history does not flood into your pipeline, so workflows built on new opportunities or tags, like review requests, won't fire for work you finished years ago.
Clients with no way to contact them. A ServiceM8 client with no email, no phone number and no jobs is not sent to GoHighLevel. Accounting links such as Xero can fill ServiceM8 with bank payees and suppliers, and this keeps them out of your CRM. Once the client has a job, an email or a phone number, they come across as normal.
Empty fields. Only what is actually there gets sent. If a job has no category, or the client has no email address, that field is skipped and everything else still syncs.
Anything you have not mapped. Unmapped fields simply do not travel. If you map nothing to a pipeline stage, no opportunity is created and the contact syncs on its own — which is a perfectly valid way to run it.
The direction of travel
The sync does not change, move or delete anything in your ServiceM8 account. If TradesSync stopped existing tomorrow your ServiceM8 would be exactly as you left it.
There is one optional exception, off unless you switch it on, covered in Leads into ServiceM8.
One consequence worth knowing: because ServiceM8 is the source of truth, if a client's name differs between the two systems, the ServiceM8 version wins and overwrites the GoHighLevel one on the next sync.