Paid Media
Your Google Ads Conversion Tracking Setup Is Probably Lying
Before you touch bids or rewrite ad copy, check whether the account is counting real inquiries. Six ways tracking breaks quietly, and a verification routine that takes about an hour.
Picture an account that has been live for eight months. Spend is steady, the conversions column shows a respectable number, cost per conversion looks tolerable, and the sales inbox is quiet. The reflex at this point is to rewrite ad copy, add negative keywords, or move bids around.
That is the wrong first move. The first hour of any Google Ads audit should go to establishing whether the numbers in the conversions column correspond to events that actually happened. Before you conclude that the strategy is weak, rule out the possibility that the account is counting the wrong things.
Smart Bidding treats your conversion data as ground truth
Target CPA, Target ROAS and Maximize Conversions all do the same thing: they read the conversion signal you send back and buy more of whatever produced it. There is no sanity check. If a tag fires on every page load, the system learns that cheap, high-bounce traffic converts brilliantly and buys more of it. If a form conversion never fires, the system concludes the campaign is worthless and starves it.
Measurement faults are therefore not a reporting inconvenience. Budget migrates toward whichever campaign miscounts most generously, and over a quarter the account quietly reorganizes itself around the error.
A tracking fault does not only make the report wrong. It teaches the bidding system to spend against the fault.
Tags outlive the pages they were installed on
The most common failure is also the dullest. Somebody redesigned the site, a developer rebuilt the templates, and the conversion snippet that lived in the old thank-you page did not survive the move. Nothing errors. The page loads fine. Conversions stop, or drop to whatever partial coverage is left.
The mirror image is a thank-you page that still exists but is no longer reached. Most modern form plugins submit over fetch and swap in an inline confirmation without navigating anywhere. If your conversion is a destination trigger on /thank-you and the form no longer sends anyone to /thank-you, the conversion is unreachable. It reports zero, and the ads get blamed.
A confirmation page that is publicly reachable and indexable has the opposite problem. It collects organic hits, bots and bookmarks, and each one counts as a lead. Adding noindex to confirmation URLs belongs in routine technical SEO work rather than being treated as a paid media detail.
The same event counted twice
Double counting usually arrives with a handover. One agency installs conversion tracking through Google Tag Manager. The next agency, finding no hardcoded tag in the page source, adds one. Both now fire on the same view and every lead is worth two.
The second flavor is importing GA4 key events into Google Ads while the native Ads tag still fires for the same action. Ads has no way to know that the imported generate_lead and the native lead form conversion describe one submission. It counts both. Attribution windows differ between the two sources, so the totals are not even a clean doubling, which makes the problem harder to notice.
Pick one source of truth per action. If you import from GA4, remove or demote the native equivalent, and check which actions are marked Primary, because only Primary actions feed bidding. The rest are observation.
The dataLayer push that breaks gtag silently
This one deserves a section of its own because it produces no console error and no visible symptom. The standard bootstrap defines a small function whose entire job is to push the built-in arguments object into dataLayer. Two innocent-looking rewrites of that single line break it.
Converting the function to an arrow function destroys it, because arrow functions have no own arguments object. Collecting the parameters into a named array first and pushing that array also destroys it, because the tag expects the array-like arguments object with the call signature intact, not a plain array of values you assembled yourself.
Both versions pass code review. Neither throws. dataLayer fills up with entries, so a quick console check looks healthy. Nothing reaches Google. The only reliable test is counting outbound network requests, never reading dataLayer.
Call conversions that fire on page load
Phone tracking gets this wrong constantly. A click-to-call conversion needs an event listener on the tel: link, or a Tag Manager click trigger scoped to links whose href starts with tel:. What often ships instead is a conversion that fires when the contact page loads. Every visitor to /contact becomes a phone lead, mobile performance looks superb, and bidding piles into it.
Two related settings are worth checking at the same time. Counting should be set to One for lead actions and Every for purchases, because leaving a lead form on Every turns one impatient person clicking submit three times into three leads. And call conversions from a Google forwarding number need a sensible minimum call length, otherwise wrong numbers and hang-ups are recorded as inquiries.
A verification procedure that takes about an hour
Do not audit tracking by reading the Google Ads interface. Audit it from the browser, as a user, end to end.
- Open the site in a fresh incognito window with any ad blocker disabled, devtools open, Network tab filtered to collect, pagead and conversion.
- Land on a paid landing page carrying a gclid. A real paid click is the only fully honest test and it costs you one click, which is worth paying for. A manually appended test parameter still tells you whether the gclid survives your redirects and lands in the _gcl_aw cookie.
- Submit the form with a name you will recognize later, for example Tracking test June 24.
- Read the requests. You want a GA4 /g/collect hit carrying the event name, and a /pagead/ request carrying your AW conversion ID and label, both returning 200 or 204. Check the gcs parameter on those hits. Consent Mode encodes granted and denied storage there, and a value showing denied storage means the hit is modeled rather than attributed to the click.
- Confirm there is exactly one conversion request per action. Two identical pagead hits is your double count, visible in five seconds.
- Check the Ads interface after the reporting delay, commonly up to three hours. Conversions are reported against the date of the click, not the date of the submission, so today's test may appear on an earlier day's row.
- Run for a week, then reconcile: count conversions in the account against actual inquiries in the CRM or inbox for the same period.
Step seven is the one that gets skipped and the one that decides the answer. Everything before it proves that a tag fires. Only reconciliation proves the count is true.
Judge by the traffic to conversion ratio
Dashboard totals hide the shape of the problem. A campaign showing 40 conversions from 4,000 clicks and one showing 40 conversions from 400 clicks are not the same campaign, and neither number means much until you know what fraction of sessions produced a real inquiry.
Track sessions to conversions as a ratio per landing page and per campaign, then compare it against what the sales team can actually name. If the account claims a 6% conversion rate and three inquiries arrived this month, you have a measurement fault, not a conversion rate. If a page's ratio jumps the week after a deploy, inspect what the deploy did to the tags before congratulating the copywriter.
Once the signal is honest, everything downstream becomes cheap. Bidding has something real to learn from, cost per lead is comparable across campaigns, and decisions about Google Ads budget rest on arithmetic rather than on a feeling. Until then, optimization is guesswork applied precisely.
Related service
Want this handled for you?
Account structure, conversion tracking that actually fires, negative keyword discipline and landing pages built for the traffic you pay for.