You pay for call tracking so you can see which campaigns make the phone ring. The reports show calls, but fewer than you expected from paid search, and a lot of them land in a bucket labeled direct or website.
Often the tracking is fine and the swap is not. Dynamic number insertion only works if the script actually replaces the number a visitor sees and taps. When it misses, the caller dials your main line, the call is never tied to the ad click, and the campaign that produced it looks like it produced nothing.
What is dynamic number insertion?
Dynamic number insertion, or DNI, is a script that replaces the phone number shown on your website with a tracking number chosen for that visitor's traffic source. When the visitor calls, the call tracking platform knows which source, campaign and often which keyword brought them.
CallRail, CallTrackingMetrics, Invoca and WhatConverts all work this way. Google Ads offers its own version through website call conversions, which swap in a Google forwarding number for visitors who arrived from an ad.
The mechanics are similar across platforms. A script loads on your page, reads the visitor's source from the referrer, UTM parameters or a click ID such as the gclid, and finds your business number on the page. It then replaces that number with a tracking number from a pool. Session level tracking assigns each visitor their own number for a period, so the call can be matched to the specific visit and, for Google Ads traffic, to the click.
The weak point is the find and replace step. The script looks for a number that matches the one you configured. If it cannot find it, nothing is swapped, and nothing tells you.
Because it is the number most callers use. Paid visitors land with intent, look for a way to reach you, and the header is where they find it, especially on mobile where a tap to call button sits at the top of the screen.
If the header number is not swapped, the calls with the most commercial intent go untracked. Google Ads sees a click and no conversion. Smart bidding learns that the campaign does not produce leads and shifts budget away from it. Meanwhile the phone rings, sales closes the deal, and the revenue is credited to nothing.
This is worse for businesses where most leads call rather than fill in a form: home services, legal, healthcare, local trades. In those accounts the phone call is the conversion, and a header number that does not swap removes most of the signal your bidding depends on.
How do I test whether dynamic number insertion is working?
Visit your site from a fresh browser with paid traffic parameters, note the header number, then compare it with a direct visit. If the numbers are identical, the swap is not happening for paid visitors.
- Open a private window so no earlier session or cookie affects the result.
- Load your landing page with parameters that match how your platform identifies paid search, for example
?gclid=test&utm_source=google&utm_medium=cpc. Some platforms need a genuine ad click to assign a Google forwarding number, so if a test parameter shows nothing, click one of your own ads instead.
- Note the number in the header, the footer, and any call buttons in the page body.
- Open a second private window and load the same page with no parameters. Note the numbers again.
- Repeat on a real phone, and tap the call button rather than just reading it.
The paid visit should show a different number from the direct visit. Every instance of the number on the page should change, not just one. Then check the call tracking platform to confirm the test visit was recorded with the right source.
Why is my tracking number not swapping?
In most cases the script is running but cannot match the number on your page. The formats differ, the number is not text, or the number arrives after the script has finished looking.
The swap target is formatted differently. You told the platform to find (555) 123-4567 and the page shows 555.123.4567 or +1 555 123 4567. Some platforms normalize formats and some do not, and a redesign often changes the formatting without anyone updating the call tracking settings. Check the exact target configured in the platform against the exact text on the page.
The number is inside an image or SVG. A phone number that is part of a header graphic, a logo lockup or an icon font cannot be found by text replacement. It looks like text to a human and is invisible to the script. The number has to be real HTML text, or the element needs a class or attribute the script is told to target.
The number pool does not cover that source. If the pool is set up for Google Ads only, visitors from Microsoft Ads or paid social see your default number. If the pool is too small for your traffic, numbers get reused across visitors and attribution becomes unreliable. Check which sources your swap rules include and whether the pool size matches your concurrent visitors.
Numbers are injected by JavaScript after the swap ran. Many modern sites render the header, a sticky call bar or a popup after the page loads. If the call tracking script runs first, it swaps what exists at that moment and misses what appears later. Most platforms have a setting or function to rerun the swap on dynamic content, but it has to be enabled.
Why do mobile callers dial the untracked number?
Because the visible text was swapped and the tap to call link was not. The text on screen shows the tracking number, but the underlying tel: link still points to your main line, so tapping the button dials the untracked number.
This is one of the most expensive DNI failures because it passes a visual check. Someone looks at the page on a laptop, sees the tracking number, and signs off. On a phone, where most calls from paid search happen, the tap dials the original number.
It happens when the href value is formatted differently from the visible text. The link might be tel:+15551234567 while the text reads (555) 123-4567, and the script only matches one of them. Inspect the element in DevTools after a paid visit and read the href directly, or long press the button on a phone to see the number it will dial.
Can a cookie banner or caching stop DNI from working?
Yes. Both are common, and both usually go unnoticed because the site looks normal.
The cookie banner holds the script back. Call tracking scripts set cookies and read the visitor's source, so consent platforms often classify them as marketing. In opt in regions, the script will not run until the visitor accepts, and visitors who ignore or decline the banner see your default number. That may be the correct legal outcome, but you should know it is happening and account for it when you read your call reports. Where the script is categorized wrongly, or blocked even where consent is not required, you lose calls for no reason.
Caching serves an old or already swapped page. Page caching and some performance plugins can store a copy of the page that was generated before the script was installed, or combine and delay scripts so the swap runs late or not at all. The same applies to plugins that hold back all JavaScript until the visitor scrolls or taps: a visitor who calls straight from the header before interacting never sees a swapped number. Exclude the call tracking script from delay and combine settings, and clear caches after any change.
How do I send tracked calls back to Google Ads as conversions?
Connect your call tracking platform to Google Ads, or import calls as offline conversions using the gclid the platform captured with the visit. Either way, Google Ads then sees which clicks turned into calls and can bid toward them.
Most call tracking platforms offer a direct integration that uploads qualifying calls automatically. Set a minimum duration so short calls, wrong numbers and spam do not count. Better still, send only calls your team marks as qualified, and pass a value where you can, so smart bidding optimizes toward calls that become customers rather than calls in general.
If you use Google's own forwarding numbers, calls from ads and website calls are recorded inside Google Ads directly, with a duration threshold you set in the conversion action. Choose one source of truth for call conversions so the same call is not counted twice, once by Google's forwarding number and again by your platform's import.
None of this works if the swap fails. A call to your main line has no click attached, so there is nothing to send back. An audit can flag whether the header number changes for paid traffic, but the real test is a paid visit from a clean browser, followed by a tap on the call button.
FAQ
Why is dynamic number insertion not working on my site?
Usually because the script cannot find the number it is supposed to replace. The configured swap target may be formatted differently from the number on the page, the number may be inside an image or SVG, or it may be added by JavaScript after the swap ran. Consent banners that block the script and caching or script delay plugins are the other common causes.
How can I check if my call tracking number is swapping?
Open a private browser window and load your landing page with a gclid or paid UTM parameters, then note every phone number on the page. Load the same page in a separate private window without parameters and compare. The numbers should differ. Repeat on a phone and tap the call button to confirm the dialed number changes too, not only the visible text.
Why does my site show the tracking number but calls come in on the main line?
The visible text has been swapped but the tel: link behind the call button has not. Mobile visitors tap the button, which dials whatever number is in the link. This happens when the link and the visible text use different formats and the script only matches one. Inspect the link in DevTools after a paid visit to see which number it actually dials.
Does the cookie banner affect call tracking?
It can. Call tracking scripts are often categorized as marketing, so in opt in regions they only run after the visitor accepts. Visitors who decline or ignore the banner see your default number, and their calls are not attributed to a source. Check how your consent platform classifies the script and confirm it behaves as your privacy policy intends in each region.
Should I import call conversions into Google Ads?
Yes, if calls are an important way customers reach you. Without them, Google Ads cannot see which campaigns and keywords produce calls, and smart bidding optimizes without that signal. Import only qualifying calls, using a minimum duration or a qualified status from your team, and avoid counting the same call through both Google's forwarding numbers and your call tracking platform.