Phone calls are the hole in your paid search reporting
As of August 2026, most service businesses running Google Ads can tell you their cost per click and their cost per form fill, and cannot tell you which keyword produced the phone call that turned into a $900 job. That asymmetry is not a reporting oversight; it is structural. A form submission happens inside the browser session, where the click identifiers still live. A phone call leaves the browser entirely — the visitor reads a number, opens the dialer, and arrives on your telephony as a stranger with no session attached. Everything in call attribution is engineering around that one discontinuity.
This is the mechanics article. If you want the conceptual introduction — why call tracking matters, what it changes about how you run a service business — start with our call tracking and attribution guide and come back here. What follows assumes you already accept the premise and want to know how the plumbing works, where it leaks, and what a correct implementation looks like on Run with Jarvis.
The stakes scale with how phone-heavy your category is. For an ecommerce advertiser, unattributed calls are a rounding error. For a locksmith, a plumber, a towing operator, or a restoration company, calls are the majority of revenue-producing conversions — which means the majority of the signal Google's bidding algorithms need is missing unless you deliberately put it back.
The four things a complete call attribution record contains
Before the mechanics, define the target. A call record that is genuinely useful for optimizing spend carries four layers:
- Source identity. Which channel produced this call: paid search, organic, Local Services Ads, the Google Business Profile listing, a directory, a yard sign, a truck wrap.
- Click-level identity. For paid search specifically, the click identifier — the gclid — which resolves to campaign, ad group, and search term inside Google Ads.
- Call quality. Duration, whether it was answered, whether it reached a human or the AI, and ideally a transcript with an intent classification and a score.
- Business outcome. Did it book. Did the job happen. What did the invoice total. Without this layer you are optimizing toward calls, which is not the same as optimizing toward money.
Most implementations get layer one, half of layer two, and none of layers three and four. That is why so many owners report that "call tracking never told us anything useful" — they instrumented the ring and stopped.
Dynamic number insertion: how the number swap works
Dynamic number insertion, or DNI, is the mechanism that gives a call a source identity. The concept is simple: the phone number your website displays is not a constant, it is a function of where the visitor came from.
The sequence, step by step
- The visitor lands. They arrive on a landing page carrying a referrer and, if the visit came from an ad, URL parameters — a gclid, UTM tags, or both.
- A script runs early. A small tracking script executes on page load and reads three things: the referring domain, the query string, and any existing session cookie identifying a returning visitor.
- The script classifies the source. Paid search, organic search, referral, direct, social, or a named campaign. This classification decides which number pool to draw from.
- A number is checked out of the pool. Each source — and for granular setups, each campaign — is backed by a pool of local tracking numbers. The script requests one, and the server marks it as assigned to this session for a defined window.
- Every rendered number is rewritten. This is the part implementations get wrong. The script must replace the number in the visible text, in every
tel:link, in the sticky mobile call bar, in the header, in the footer, in the contact block, and inside any modal that renders later. Anything it misses will display your default number and produce an unattributed call. - The assignment is held. The mapping of number to session persists for the session's lifetime — typically a window measured in tens of minutes, sometimes longer — so that a visitor who reads the page, thinks about it, and calls fifteen minutes later still resolves correctly.
- The call arrives. Your telephony receives an inbound call on tracking number 47. The system looks up which session held number 47 at that moment, and hydrates the call record with everything that session knew.
Pool sizing is the constraint nobody plans for
The pool has to be large enough that two concurrent visitors from the same source never share a number, because if they do, the second call is attributed to the first visitor's session. Pool size is driven by concurrency, not by monthly volume. A site with modest traffic but sharp spikes — a storm-response restoration company, a locksmith after a Friday night bar close — needs a bigger pool than raw monthly sessions would suggest.
Two symptoms tell you the pool is undersized: attribution that looks suspiciously concentrated on a handful of keywords, and calls whose recorded source contradicts what the caller says when asked how they found you. Both are pool collisions.
Session-level versus visitor-level swapping
Two granularities are common. Session-level assigns a number per visit, which is what you want for attribution accuracy. Visitor-level assigns a sticky number to a returning person, which is friendlier for repeat customers who saved your number but blurs multi-touch reality. Most service businesses should run session-level for paid traffic and consider visitor-level for organic and direct, where the attribution value is lower and the customer experience value is higher.
Carrying the gclid all the way to the call record
DNI alone tells you "this was a paid search call." Getting to "this was the water heater replacement near me search term in the Emergency Plumbing campaign" requires the gclid to survive the journey.
Capture
The gclid arrives as a URL parameter on the landing page. The tracking script reads it on the first page view and writes it into first-party storage — a cookie or local storage entry — alongside the session identifier and the assigned tracking number. Capture must happen on the landing page, not on the conversion page, because the parameter is frequently gone by the second click.
Persistence across the visit
Visitors do not call from the page they land on. They land on a service page, read the reviews section, check the service-area page, and call from there. Every one of those navigations is an opportunity to lose the parameter. The tracking script therefore has to read the gclid from storage on subsequent page views rather than from the URL, and re-attach it to the session record. Implementations that only read the URL end up with a gclid on the first pageview and nothing thereafter.
Three specific things break persistence:
- Cross-domain hops. If your landing pages and your booking flow sit on different domains, the parameter and the cookie do not travel unless you explicitly link the domains.
- Aggressive privacy defaults. Modern mobile browsers cap the lifetime of client-side storage written by scripts. A session that stretches across days will not carry its original gclid, which is one reason short attribution windows are more honest for phone calls than long ones.
- Redirect chains. Every hop that drops the query string drops the gclid. Tracking templates and vanity redirects are common culprits.
Association at call time
When the call lands, the system joins on the tracking number and the time window: which session held this number in the last N minutes. That session record carries the gclid, the referrer, the landing page, the UTM set, and the visitor's page path. All of it copies onto the call record. From there the gclid is resolvable inside Google Ads down to campaign, ad group, and — subject to Google's own reporting granularity — search term.
What happens with calls that never touched a webpage
This is the honest limitation. A tap on the call button in a Google Business Profile listing, a Local Services Ads lead call, a call from a directory, a call from a truck wrap — none of these involve a browser session, so none of them carry a gclid. These calls are attributable only at the channel level, via a dedicated number per channel. You know it was the listing; you cannot know it was a keyword, because there was no click. Anyone promising keyword-level attribution on Maps calls is describing something that does not exist.
The practical response is a written number map: one dedicated number per channel, documented, never reused. Profile gets one. LSA gets one. Each directory gets one. The website gets a DNI pool. Trucks and print get their own. The map is boring and it is the difference between a call log you can reason about and one you cannot. The interaction between the paid Google surfaces specifically is covered in our Local Services Ads guide.
Turning a call into a conversion: duration, scoring, and the threshold problem
You now know where the call came from. The next question is harder: was it worth anything? Feeding every ring back to Google Ads as a conversion trains the bidding algorithm on noise — wrong numbers, robocalls, existing customers asking where the technician is, vendors pitching you.
Duration as a first filter
The default industry approach is a duration threshold: a call counts as a conversion if it lasted longer than N seconds. Most service businesses settle somewhere in the 30-to-60-second band. The logic is that genuine service inquiries take at least that long to state the problem and hear a response, while misdials and robocalls end sooner.
Duration is cheap to implement and genuinely useful as a coarse filter. It is also crude in two directions:
- False negatives. A repeat customer who knows exactly what they want can book a job in 35 seconds. A caller who is told they are outside the service area hangs up fast — that is a real, well-handled call that will not clear a 60-second bar.
- False positives. A four-minute call can be a neighbor complaining about parking, a supplier, or a caller you could not help at all. Length is not intent.
Scoring on content, not just clock
The stronger design uses the transcript. Every answered call gets transcribed, then classified: what service was requested, was the caller in the service area, was a price quoted, was an appointment booked, did the caller decline, did they ask for a human. From those signals you derive a score and a qualification flag. Our lead scoring guide goes through the criteria in depth; the essential point here is that content-based scoring lets you send Google Ads a conversion signal that means "qualified inquiry," not "the phone was off the hook for a minute."
There is a compounding advantage when the answering layer and the tracking layer are the same platform. If an AI answered the call, the system already knows the structured outcome — service type, address validated, price quoted, appointment written — without inferring it from audio. That structured result is a far cleaner conversion signal than a duration bucket, and it is available immediately rather than after a transcription pass.
Feeding conversions back to bidding
Once you have a qualified-call definition, upload those calls to Google Ads as conversions against their gclids. This is the step that actually changes your results, because it is what lets Smart Bidding optimize toward the keywords that produce jobs rather than the keywords that produce clicks.
Two rules make this work:
- Send a value, not just a count. If you can attach the eventual job value — or even a per-service-type average — the algorithm optimizes toward revenue rather than volume. A conversion that is worth $95 and one worth $1,400 should not be weighted identically.
- Be consistent about definitions. Changing your qualification threshold mid-quarter makes period-over-period comparison meaningless and destabilizes bidding. Pick a definition, document it, and change it deliberately.
The full economics of this loop — what a lead costs you before and after you can see it — is worked through in our cost per lead guide.
The multi-touch reality nobody's dashboard shows
Here is the customer journey attribution models pretend does not happen: the prospect searches on their phone, clicks your ad, calls, asks a couple of questions, does not book. Two days later they search your brand name directly, land on your site, submit a form. A week after that they walk into your shop and pay.
Which touch gets credit? On a last-click model, the walk-in gets none and the form gets everything, and the paid search click that started it gets nothing. On a first-click model the reverse. Neither is true.
For service businesses, the practical resolution is not a fancier attribution model — it is identity resolution on the phone number. If the call, the form, and the invoice all carry the same phone number, you can see the sequence even if you cannot cleanly divide the credit. That is why matching on the last ten digits of the phone number is the single highest-value join in a service business data model: it links the call record, the CRM contact, the appointment, and the paid invoice.
Once that join exists, you can answer the question that actually matters — what did the calls from this campaign eventually bill? — without pretending to resolve the philosophical credit-allocation problem. You get lag as a fact rather than a distortion: this campaign's calls bill an average of six days after the call. That is a planning input, not a modeling failure.
And once the data is joined, the reporting question becomes conversational rather than technical. Instead of building a report, you ask the Jarvis brain which campaigns produced calls that turned into paid work last month, and it queries across the call log, the CRM, and the invoices.
What breaks in practice
Hardcoded numbers in places the script cannot reach. A phone number baked into a hero image, an embedded PDF, a third-party review widget, or a chat bubble's canned response will never be swapped. Those become unattributed calls, and worse, they silently deflate the measured performance of whatever page they sit on. Audit every rendered surface, including images.
One number reused across channels. The moment your Google Business Profile number is also on your trucks, both channels report as one. Every channel that can be separated should have its own number, and the map should be written down.
Number changes that break local consistency. If you put a tracking number on your Google Business Profile, keep your real local number on the profile as an additional number so the local link stays verifiable. Number sprawl across directories with no consistency does more SEO damage than the attribution is worth.
Consent and recording exposure. Recording is where call tracking touches real legal obligation. Requirements differ by state — some require only one party's consent, others require all parties — and a recording disclosure at the start of the call is the standard operational answer. The U.S. Federal Trade Commission (ftc.gov) and the Federal Communications Commission (fcc.gov) are the authorities to work from for calling, recording, and automated-contact rules, and our call recording consent and compliance guide covers how to implement the disclosure without wrecking the caller experience.
Session expiry and privacy defaults. Client-side storage lifetimes are short and getting shorter, and iOS in particular restricts what a script can persist. Long attribution windows on phone calls are largely fictional. Design for a window measured in a session, not a fortnight, and treat anything longer as directional.
Unanswered tracked calls. The most expensive failure of all: perfect attribution on a call nobody picked up. Attribution tells you the ad worked; it does not answer the phone. If your measured missed-call rate is meaningful, fix the answering before you spend another week tuning bids. Our speed-to-lead guide covers why that ordering matters.
What this costs on Run with Jarvis
Call tracking and attribution is CallFlux, and it ships from the Pro tier up.
| Plan | Monthly | AI minutes / mo | Overage | Call attribution |
|---|---|---|---|---|
| Core | $500 | 500 | $0.45/min | Not included — answers and books every call, does not separate sources |
| Pro | $750 | 1,000 | $0.40/min | CallFlux: DNI, gclid capture, transcription, recording, lead scoring |
| Elite | $1,200 | 2,500 | $0.35/min | Everything in Pro, plus the AI growth layer and the Jarvis AI Assistant |
All three plans are month-to-month, with zero setup fees, unlimited users, and no per-call fees — the only usage charge is per-minute overage at your tier's rate, and that rate drops as you move up. Full detail is on the pricing page.
The sizing logic for attribution specifically is straightforward: if you are spending money on paid search or LSA, you need Pro. Core will answer and book every call perfectly well, but it will not tell you which ad produced it, which means your bidding stays uninformed. If you are not running paid acquisition at all, the attribution layer is a nice-to-have and Core is the honest recommendation.
Related reading
Three pieces linked above are the natural next reads, in this order: the call tracking and attribution guide for the conceptual foundation, the lead scoring guide for getting your qualification criteria right, and the call recording consent guide for keeping your recording practice defensible. When you want this instrumented against your real campaigns and call volume, get in touch.



