v2.3.0
Current
7 September 2026
Leads that arrive in GoHighLevel can now become ServiceM8 clients and job cards.
It is optional, off until you switch it on, and everything else still works exactly
as it did.
Leads from GoHighLevel into ServiceM8
- The gap this closes — a web form fills in, or your AI answers a call you missed. It lands in GoHighLevel and goes no further, because ServiceM8 has never heard of it. Switch this on and that contact becomes a ServiceM8 client with a job card at Quote, ready to price.
- Off until you want it — find it in Sync Settings under GoHighLevel → ServiceM8. Tick the switch, copy the webhook URL it gives you, and paste it into a GoHighLevel workflow. One switch turns it back off.
- Existing clients are never edited — if the contact matches a client you already have, on email or phone, we link to your record and leave it alone.
- Only a client and a job card — no queues, badges or custom fields. What happens to the job from there is yours.
- Nothing bounces back — contacts that came from ServiceM8 in the first place are recognised and ignored.
- Full details, not partial ones — GoHighLevel tells us the moment a contact appears, which can be before the address and company name have finished saving. We wait, then read the finished record, so what reaches ServiceM8 is complete.
Safety limits on it
- Bulk imports can't flood your account — more than 20 contacts in 10 minutes, or 50 in a day, and we pause and alert ourselves rather than fill ServiceM8 with hundreds of quotes.
- Nothing is lost when we pause — every contact is still recorded, so a backlog can be looked at and released deliberately.
- No duplicates — the same contact arriving twice, whether from a retry or a workflow firing again, only ever creates one client and one job.
- Your webhook URL is unique to you — it carries a secret only your account has, and anything without it is rejected.
Everything else is unchanged
- Still one-way by default — ServiceM8 remains the source of truth, and we still only read from it unless you switch the above on.
- Matching improved — finding an existing ServiceM8 client now copes with the different ways a phone number gets written down, so +44 and 07 versions of the same number find the same client.
v2.2.0
5 September 2026
Custom fields now actually save in GoHighLevel, and the mapping page has been rebuilt
into four steps so it's clear what you need to fill in.
Custom fields now save
- Contact custom fields — mapping a ServiceM8 value into one of your own GoHighLevel fields used to be accepted and then quietly ignored, leaving the field empty. It now writes properly.
- Job details on the contact — fields taken from the job card, like the job number or description, now reach the contact instead of being dropped.
- Opportunity custom fields — supported as well, and can no longer break an opportunity update when they're set.
- No more false success — if a mapped field doesn't match anything in your GoHighLevel account, the sync log says so instead of reporting it as sent.
A clearer setup page
- Field Mappings is now Sync Settings — the page does more than field mapping, so the name was misleading.
- Four steps instead of one long page — setup, pipeline, fields, advanced. One screen at a time rather than endless scrolling.
- Only one step is required — the pipeline step. Everything else has a sensible default, and a tick or warning on each step shows what still needs doing.
- Plain-English summary — the top of the page tells you what the sync does and which classifier is driving your pipeline stage.
- Advanced options tucked away — conditional rules and won/lost status are collapsed, so they don't compete with the settings most people need.
Clearer answers when something's skipped
- Skip messages name the right thing — if you run on queues, the log no longer tells you a job status mapping is missing. It names the classifier you actually chose.
- Jobs with no queue — now say exactly that, rather than looking like a broken mapping.
- Better account overview — shows which classifier drives your stages, how many stages and tags are set, and warns when opportunities can't be created.
- Backfill — shorter date windows and individual job selection, so a single job card can be pushed through on request.
- Corrected first-sync wording — syncing starts from the day you connect. Jobs that already existed come across when they next change, or on request.
v2.1.0
3 September 2026
Pipeline stages can now be driven by your ServiceM8 queues or categories, not just job status —
which is how most trades actually run their week. Plus a lot of sync reliability work.
Choose what drives your pipeline
- Stage driver — pick job status, queue or category to move opportunities through your pipeline. Most trades pick queue.
- Classification tags — the two you didn't pick still apply tags in GoHighLevel, and so do badges.
- Exclusive vs additive tags — moving a job between queues swaps its tag rather than stacking another one on. Badges accumulate, because a job can carry several.
- 160 mappable ServiceM8 fields, up from 91.
- Wildcards and aggregates — roll up every line item or payment on a card into one field: join, count, sum, first, last, unique.
Sync reliability
- Notes now sync — a wrong API call had been failing every company sync that carried a note since 21 July. Fixed.
- Duplicate contact recovery — if the contact already exists in GoHighLevel we find it, link it and update it instead of failing.
- Deleted opportunity recovery — delete an opportunity in GoHighLevel and the next sync notices, clears the stale link and creates a fresh one.
- Messy email addresses — an invalid email in ServiceM8 no longer blocks the whole contact; we drop the bad field and sync the rest.
- Readable errors — GoHighLevel returns errors as a list, which we were flattening into the word "Array". Real messages now reach the sync log.
- Queue worker hardening — a single-run lock stops overlapping cron runs, and a fatal error can no longer strand items mid-queue.
Seeing what's going on
- Sync preview — pick a real job card and see exactly what would be sent, including the stage and tags, without sending it.
- Backfill — bring historical job cards across on request, rather than waiting for them to change.
- Sign-in history — last sign-in, first seen, and recent activity per account, with failed attempts recorded.
v2.0.0
Beta launch
19 March 2026
The platform rebuild: one-way ServiceM8 → GoHighLevel sync, per-customer field mapping,
and a queue that keeps going when something goes wrong.
Sync engine
- Companies become contacts, jobs become opportunities — everything attached to a job card is gathered up and lands as fields on those two records.
- Checked every five minutes — changes in ServiceM8 are picked up automatically.
- Entity linking — a permanent record of which ServiceM8 job belongs to which GoHighLevel opportunity, so the same card is updated rather than duplicated.
- Retries — a failed item is tried again rather than dropped.
Field mapping
- Per-customer mapping — every account decides which ServiceM8 details land in which GoHighLevel fields.
- Transforms — uppercase, lowercase, phone formatting, date formats, number and boolean conversion.
- Conditional rules — if a job matches a condition, set a field or add a tag.
Security
- Encrypted credentials — ServiceM8 and GoHighLevel keys are stored encrypted, never in plain text.
- Read-only on ServiceM8 — nothing is ever written back to your job cards.
- Separated accounts — each customer's data is scoped to their own account.
Logging and monitoring
- Sync log — every sync recorded with what was sent, what came back and how long it took.
- Queue view — see what's waiting, what's running and what failed.