tracking · call-tracking · google-ads · ga4

How to set up call tracking for a Google Ads campaign

Complete call tracking setup: forwarding numbers vs third-party tools, DNI explained, duration thresholds that work, and GA4 import so every call is attributed.

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.

The three tools, ranked by use case

ToolCostBest forWeakness
Google ForwardingFreeSimple call extensionsCan’t track on-site calls after click
CallRail~$45.00/moMost service businessesNo built-in CRM deeper than basic
WhatConverts~$60.00/moHigh-volume, complex reportingOverkill 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:

  1. You set up a pool of tracking numbers in CallRail
  2. A small script on your sitechecks the visitor’s source (Google Ads = “google / cpc”)
  3. If it matches, the script swaps your real phone number for a tracking number from the pool
  4. 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.”

IndustryMinimum call durationWhy
Emergency plumbing30 secondsUrgent callers commit fast
Cleaning/Detailing45 secondsQuote-seekers need a bit more time
HVAC/Roofing (high ticket)90 secondsQuote 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:

  1. Calls from ads (the phone icon and call extension clicks)
  2. 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:

  1. Click your own ad in Google search
  2. Watch the URL when you land on your site. It should have a gclid parameter
  3. Verify the phone number on the website is a tracking number (not your main number)
  4. Call the tracking number
  5. Stay on the line for at least your duration threshold (e.g., 60 seconds)
  6. 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.

Start here

Three numbers are enough to start.

  1. What the last marketing attempt cost, all-in
  2. What a booked job is usually worth
  3. How many jobs you can take on now

Send what you have. A missing number is not a blocker, working it out is part of the audit. No contracts, ever. I reply within 12 hours.

Send the numbers

What is happening with your advertising?

Spend, leads, and what you suspect is going wrong. I reply within 12 hours.

No contracts. I reply within 12 hours.

Start with a number