Dynamic number insertion (DNI) swaps the phone number on your website per visitor so each call can be tied back to the ad, keyword or channel that caused it. ServiceM8 has no version of it, but you can get the result today with a call tracking pool in front of ServiceM8 Phone and a small automation that writes the source onto the job. Web Blend is building that integration into ServiceM8 and taking beta enquiries.
- DNI shows a different tracking number to each visitor based on where they came from, then forwards the call to the number you actually answer.
- Dedicated trackers such as CallRail and WildJar, marketing platforms with number pools, and the big enterprise field service platforms all do it the same way: pool, swap script, forwarding, webhook, write to the CRM.
- ServiceM8 has no number pool or swap script. ServiceM8 Phone can receive diverted numbers but cannot tell you which one the customer dialled.
- The setup on ServiceM8 is a pool forwarding into ServiceM8 Phone with the caller's real number passed through, then a webhook that writes the source onto the job.
- Web Blend is building this as a ServiceM8 integration on CallRail or Twilio numbers. It is in development as of September 2026 and you can ask to be a beta tester from this page.
- Never swap the number on your Google Business Profile, and keep the real number in the page HTML so the swap only happens in the visitor's browser.
Keep asking about it in
Quick answer: Dynamic number insertion, or DNI, shows each website visitor a different phone number depending on how they arrived, then forwards the call to your real number. When the phone rings, you know whether that call came from a Google Ads click, an organic search or a Facebook post, and in some setups which keyword. ServiceM8 has no version of this. What it does have is ServiceM8 Phone, a call record that matches callers to jobs, and an API. Put a number pool in front of that and write the source onto the job, and you get the same picture the big platforms charge enterprise money for. We are building exactly that integration into ServiceM8, and you can ask about the beta at the end of this article.
Watch DNI happen
The animation below loops through three visitors landing on the same page. Watch the phone number change for each one, the call arrive on the same phone every time, and the source land on the ServiceM8 job.
Where the visitor came from
Blocked drain? Call us now
Only the last digits change, real number stays in the code
One ServiceM8 Phone
ServiceM8 job
SourceGoogle Ads, blocked drain darwinOrganic searchDirect
What DNI actually does
Most trade businesses have one number on the website, on the van and on the Google Business Profile. When it rings, nobody knows what caused the call. The customer says “I found you on Google”, which could mean an ad, the map pack or an organic result, and each of those is paid for differently.
DNI fixes that in the browser. A small script on your website checks where the visitor came from, then swaps the visible phone number for a tracking number from a pool. A visitor from a Google Ads click sees one number. A visitor from organic search sees another. Someone who typed your address straight in sees the real number. All of the tracking numbers forward to the phone you already answer, so the customer notices nothing.
Because each number is tied to a source at the moment it was shown, the provider can record the call against that source. The better providers also capture the Google click ID from the visitor’s session, which is what lets the call be sent back to Google Ads as a conversion against the exact keyword and ad.
How other platforms and systems do it
Every system that offers DNI is built from the same five parts, whatever the brochure calls them. A pool of numbers. A script that swaps the number on the page. Forwarding that passes the caller’s real number through. A webhook when the call ends. And something at the other end that writes the source onto the customer record and sends a conversion to Google Ads.
| Type of system | Examples | What you get | What is missing for a ServiceM8 business |
|---|---|---|---|
| Dedicated call trackers | CallRail, WildJar, WhatConverts | Pool, script, dashboard, Google Ads conversions, all ready-made | No idea what ServiceM8 is. The source stays in their dashboard |
| Marketing platforms with number pools | GoHighLevel | Pool and swap inside the CRM you may already use for follow-up | Needs a sync to carry the source into ServiceM8 |
| Enterprise field service platforms | ServiceTitan and similar | Pool assigned automatically, one snippet, conversion sent for every call, all native | Priced for a dispatch office, and it is a different platform |
| Programmable carriers | Twilio | Numbers at wholesale rates, forwarding with caller ID intact, a webhook per call | No script, no dashboard, no ServiceM8. Someone builds all of that |
| Australian job management tools | ServiceM8, Tradify, simPRO | Phone add-ons and call records | To our knowledge none of them has a number pool or a swap script |
The enterprise platforms show what finished looks like: enter the domain, the main number and a postcode, paste a snippet, and calls arrive with the source attached and a conversion already sent to Google Ads. The rest of this article is about getting that on ServiceM8 without changing platforms.
What ServiceM8 gives you today
Nothing for DNI, and it is better to be clear about that than to pretend. Here is the honest inventory of what ServiceM8 does with phone calls and lead sources.
| Need | What ServiceM8 has | Gap |
|---|---|---|
| A business number that rings the team | ServiceM8 Phone add-on, one number per account with extra numbers at extra cost | No pool, no swapping |
| Bring existing numbers in | Divert or port them into ServiceM8 Phone | With several numbers diverted, it cannot show which one was dialled |
| Match a call to a customer | Caller’s number matched against contacts on open quotes and work orders | Only works if the caller’s real number is passed through |
| Record the call on the job | Call event on the job diary, with a call summary and recording | No source field on the call or the job |
| Track marketing source | utm_source on the Online Booking URL, reported in Online Booking reports | Bookings only, not calls |
| Send conversions to Google Ads | Nothing native | Needs an external integration |
The diverted-number limitation matters most. The old-fashioned way to track call sources is one static number per channel, all forwarded to the office. ServiceM8’s own FAQ says that if you divert more than one number into ServiceM8 Phone, you will not be able to tell which number the client called. So even the basic version of call tracking has to happen somewhere other than ServiceM8.
How to get DNI working with ServiceM8
The setup is five steps. Steps one to three are configuration. Steps four and five are where the integration earns its keep.
1. Choose where the numbers come from
You need Australian local numbers, a pool of them, a website swap script, caller ID passthrough when the call forwards, and a webhook when a call ends. CallRail and WildJar do all five out of the box. If you already run GoHighLevel for missed-call text-back and follow-up, its number pools do the same job and keep the source inside a system that already syncs contacts to ServiceM8.
The third option is a programmable carrier such as Twilio. It sells Australian local and mobile numbers by the month at wholesale rates, forwards calls with the caller’s number intact and sends a webhook for every call. What it does not give you is the swap script, the dashboard or any idea of what ServiceM8 is. You, or someone you pay, has to build that layer.
Our integration supports both ends of that range: CallRail for businesses that want a ready-made tracker with its own reporting, and Twilio for those that want the number pool, the call record and the ServiceM8 job designed as one thing instead of three products glued together.
Pool size is the setting the enterprise platforms handle for you and you will have to handle yourself. A number is held for a visitor for the length of their session, so the pool needs to cover how many people are on the site at once, not how many visit per day. A small trades site usually sits somewhere between four and eight numbers. If the pool runs out, later visitors see the real number and those calls go untracked, so check the pool usage report after the first fortnight.
2. Forward every tracking number to the number you answer
Point every number in the pool at your ServiceM8 Phone number, or at the mobile that gets answered if you do not run ServiceM8 Phone. Then check one setting before anything else: caller ID passthrough. The provider must present the customer’s own number to ServiceM8 Phone, not the tracking number.
If passthrough is off, every call arrives from the same handful of tracking numbers. ServiceM8 Phone matches callers to jobs by phone number, so it will either match nothing or attach every call to whichever job last had a tracking number on it. Call return routing breaks for the same reason. This is the single most common mistake we clean up on call tracking installs.
3. Install the swap script the right way
The provider gives you a snippet to add to every page. Two rules keep your local SEO intact.
- Leave the real business number in the page HTML. The script swaps it in the visitor’s browser after the page loads, so Google still crawls the same name, address and phone number it sees on your Business Profile.
- Never put a tracking number on the Google Business Profile itself. Map pack calls go straight to the number on the profile, they never touch your website, and a swapped profile number breaks the consistency that local rankings depend on. If you want to measure map pack calls, use the Business Profile’s own call reporting.
Test it by opening your site from a Google Ads click, from an organic result and by typing the address directly. You should see three different numbers, the same way the animation above does.
4. Write the source onto the ServiceM8 job
This is the step the enterprise platforms do for you and ServiceM8 does not. After step three, the call source lives in your tracking provider’s dashboard and the call itself lives in ServiceM8. Nobody in the office is going to cross-reference the two.
The provider’s end-of-call webhook carries the caller’s number, the source, the landing page, the campaign and keyword where known, and the Google click ID. A small automation takes that payload, finds the matching client or the job ServiceM8 Phone just created from the call, and writes the source onto it. Today we do this in one of two ways.
- A direct build against the ServiceM8 API, which adds a note to the job diary and sets a custom field or badge for the source. This suits businesses that only need reporting.
- Through GoHighLevel, where the call creates or updates the contact with its source, and our GoHighLevel to ServiceM8 sync carries that source across when the contact becomes a client and job. This suits businesses that also want the missed-call text-back and follow-up sequences.
Once the source is on the job, ServiceM8’s own reports can answer the question that matters: not how many calls each channel produced, but how many jobs and how much revenue.
5. Send the outcome back to Google Ads
Most providers will fire a Google Ads conversion the moment a tracked call ends, using the click ID they captured. That is better than nothing, but it tells Google that a ring is a win. Wrong numbers, suppliers and tyre kickers all count the same as a $4,000 hot water replacement.
The version worth having sends the conversion when the job reaches a status you care about, such as quote accepted or invoice paid, with the job value attached. That is offline conversion tracking, and it is what our ServiceM8 Google Ads conversion tracking service sets up. DNI supplies the click ID for phone leads, which is the piece that is otherwise missing for the majority of trade enquiries that never touch a form.
We are building DNI into ServiceM8
Steps four and five are the part every ServiceM8 business has to have built for them, and we have built them enough times to know the shape. So we are turning them into a ServiceM8 integration.
Here is what it does. It takes the end-of-call webhook from CallRail or from a Twilio number pool we run for you. It matches the caller to the ServiceM8 client, or to the job ServiceM8 Phone just created from the call. It writes the source, campaign and keyword onto that job the moment the call ends, so there is no third dashboard to check. And when the job reaches a status you choose, it sends the outcome and the job value back to Google Ads as an offline conversion.
It is in development as of September 2026 with no launch date, and it will feed the calls column of the ServiceM8 ads dashboard we are building alongside it. We are lining up a small group of beta testers now. A beta tester needs an active ServiceM8 account, a website we can put the swap script on, and enough calls a month for the data to mean something. In return you get the integration installed and supported for free during the beta, and a say in what it does next.
If that is you, ask about the beta using the form at the end of this article. If you cannot wait for the beta, the same form gets you a scoped quote for a build on the current tooling.
What you should be able to see afterwards
A working setup gives you four numbers per channel each month, and none of them need a spreadsheet.
- Calls, from the tracking provider, split by source and keyword.
- Answered rate, from ServiceM8 Phone reports, so a channel that rings at 5pm on a Friday is not blamed for calls nobody picked up.
- Jobs created, from ServiceM8, filtered by the source written in step four.
- Revenue, from the same jobs once they are invoiced.
Do you need DNI at all?
Not always, and it is cheaper to decide before buying a pool of numbers.
If your Google Ads traffic lands on a dedicated page that organic visitors do not reach, one static tracking number on that page tells you everything a small business usually needs, and the same webhook flow in step four still works. That is the setup we start most clients on.
DNI pays for itself when the same pages carry paid, organic, Business Profile and social traffic, when you are spending enough on Google Ads that keyword-level call data would change your bids, or when you are running Google Ads without call ads and need to know whether the website is now doing the job the call ad used to do.
Costs to expect
ServiceM8 Phone is a paid add-on on top of your plan, with an extra charge per additional number. Call tracking providers charge a monthly fee for the pool plus a per-minute rate for forwarded calls. Twilio charges a few dollars per number per month plus cents per minute, which is cheaper, but the build on top is where the cost sits. Pricing changes often enough that you should check the provider’s page rather than trust any figure in a blog post. Until the integration launches, the automation in step four is a fixed-price build scoped inside our ServiceM8 automation service, and we will tell you on the phone if a single static number would do the job instead.
// BETA PROGRAM
Want call tracking inside ServiceM8?
We are building dynamic number insertion into ServiceM8, with CallRail or Twilio numbers and the source written straight onto the job. Tell us about your setup and we will let you know when a beta spot opens, or scope a build now if you cannot wait.