Local service businesses lose between 40% and 60% of their leads by phone. If those calls are not tracked and attributed back to the exact keyword and ad that caused them, you are optimizing the wrong half of your budget.
This setup ensures every call that turns into a job is counted as a conversion, not just as a generic “phone call” number that could have been a misdial.
| Tool | Cost | Best for | Weakness |
|---|
| Google Forwarding | Free | Simple call extensions | Can’t track on-site calls after click |
| CallRail | ~$45.00/mo | Most service businesses | No built-in CRM deeper than basic |
| WhatConverts | ~$60.00/mo | High-volume, complex reporting | Overkill for single-location shops |
My default for $500.00 to $3,000.00/month ad spend: CallRail + DNI + one pool of tracking numbers. It covers what matters without the bloat.
Dynamic Number Insertion (DNI), explained simply
When someone clicks your ad, they land on your website. Normally, your phone number stays the same whoever visits. With DNI, the number they see changes based on where they came from.
Here is the flow:
- You set up a pool of tracking numbers in CallRail
- A small script on your sitechecks the visitor’s source (Google Ads = “google / cpc”)
- If it matches, the script swaps your real phone number for a tracking number from the pool
- When the phone rings, CallRail logs which keyword, which ad, and which landing page caused the call
The visitor sees nothing unusual. The tracking is invisible.
Duration thresholds: the difference between a lead and a misdial
Not every call is a lead. You need a rule that separates “the phone rang” from “someone actually talked about booking.”
| Industry | Minimum call duration | Why |
|---|
| Emergency plumbing | 30 seconds | Urgent callers commit fast |
| Cleaning/Detailing | 45 seconds | Quote-seekers need a bit more time |
| HVAC/Roofing (high ticket) | 90 seconds | Quote requests take longer |
Wrong setup: “Any call = 1 conversion.” Result: You’re charged for 4-second misdials.
Right setup: “Calls over 45 seconds = 1 conversion.” Result: You pay only for actual conversations.
The Google Ads import step
Once tracking is live, you need to send the data back to Google Ads so the bidding algorithm knows which clicks drive calls.
Two separate conversion actions to create:
- Calls from ads (the phone icon and call extension clicks)
- Calls from site (the DNI-driven calls from your website)
Each gets its own conversion action in Google Ads with the correct duration threshold. This separation tells Google’s algorithm which type of call is more valuable. Emergency services usually find “calls from ads” convert faster, while high-ticket services see more “calls from site.”
GA4 so your analytics know about the call
Send the call conversion event to GA4 with:
- Event name:
phone_call_lead
call_duration parameter
value parameter (estimated job value if known)
This way, you can later compare calls alongside form submissions in the same report instead of having them in separate silos.
The final test before launch
Before you spend one dollar on ads:
- Click your own ad in Google search
- Watch the URL when you land on your site. It should have a gclid parameter
- Verify the phone number on the website is a tracking number (not your main number)
- Call the tracking number
- Stay on the line for at least your duration threshold (e.g., 60 seconds)
- Check Google Ads within 4 hours. Did the conversion show up under the correct campaign and keyword?
If the answer is yes, tracking works. If no, stop. The setup is broken.
The common setup that wastes 30% of budget
Business A:
- Runs ads with phone extensions
- Sees “5 calls” in Google Ads
- Four of those calls were 15-second long hang-ups
- One real call booked a $300.00 job
- Cost per lead reported: $120.00 (fine but misleading)
- Cost per real job: $600.00 (not fine)
Business B:
- Same ads, same budget
- Call duration set to 60 seconds
- Sees “1 call” in Google Ads
- It’s a real $300.00 job
- Cost per lead reported: $300.00
- Cost per real job: $300.00
Business B saves their budget by not paying for junk. The only thing that changed was the tracking setup. The ads were the same.
The takeaway: Every dollar you spend on ads should be tied to a call duration that indicates a real conversation about a real job. If it doesn’t pass that test, it’s not a lead, and you shouldn’t pay for it.
I count conservatively. Every untracked job is your upside, not my credit.