Your Google Ads dashboard shows a $42 CPA. Finance calculates the real cost per acquisition at $67 using actual revenue and ad spend. The $25 gap exists because your conversion tracking is technically firing but functionally broken. The tag sends data to Google. Google counts something. But what it counts does not match reality.
Google Ads Smart Bidding (Target CPA, Target ROAS, Maximize Conversions) uses your conversion data as its primary training signal. If the conversion data is wrong, Smart Bidding optimises against fiction. It bids higher for audiences that appear to convert but actually do not. It underbids for audiences that convert but whose conversions are not tracked. The entire bidding algorithm is miscalibrated.
The user completes a purchase and lands on the thank-you page. The conversion tag fires. The user refreshes the page. The tag fires again. Google counts two conversions from one purchase. If 12% of users refresh the thank-you page (our observed average), your conversion count is inflated by 12%.
Fix: Use a one-time conversion action (not “Every” counting method). Or deduplicate with a unique order_id / transaction_id parameter. Google deduplicates conversions sharing the same transaction ID within the same conversion action.
Your conversion tag fires with a static value (e.g., value: 1) instead of the dynamic order value. Or the value reads from a data layer variable that returns undefined, so Google records $0. Or the value is in the wrong currency. A ₹5,000 purchase recorded as $5,000 inflates your reported revenue by 83x.
This failure is insidious because the conversion still counts. Your conversion volume looks correct. Only the value metrics (ROAS, revenue, average order value) are wrong.
The Google Ads Conversion Linker tag must fire on every page for conversion tracking to work correctly. It manages the GCLID (click identifier) storage. If the Linker tag is missing from a page in the user’s journey — for example, missing from the checkout page because of a trigger misconfiguration — the GCLID is lost. The conversion fires but cannot be attributed to the click. It appears as an “unattributed” conversion.
Enhanced Conversions sends hashed first-party data (email, phone, address) to improve conversion matching. If the hash is computed incorrectly (wrong normalisation, wrong encoding) or the data is pulled from the wrong form field, Google receives garbage hashes and cannot match conversions. The feature is enabled but provides no benefit. Your match rate stays at baseline.
// Common mistake: hashing without normalisation
// WRONG
sha256(userEmail) // "John@Example.com" hashes differently from "john@example.com"
// CORRECT
sha256(userEmail.toLowerCase().trim()) // Consistent hash
When ad_storage is denied, the Google Ads conversion tag fires in a limited mode. It does not write cookies, does not store the GCLID, and sends a cookieless conversion ping. Google uses modelling to estimate the conversion, but the modelled conversion has lower confidence and may not appear in all reporting views. For European traffic with high consent denial rates (40–60%), this means 40–60% of your conversions are modelled rather than observed.
Your Google Ads conversion action has a 30-day click-through window. But your typical purchase cycle is 45 days. Conversions that happen on day 31–45 are not counted. Your CPA appears higher than reality because late converters are invisible. The fix is straightforward (extend the window to 60 or 90 days) but most accounts use the default 30-day window without evaluating their actual purchase cycle.
A user clicks your ad on mobile, researches on tablet, and purchases on desktop. If the user is not signed into Google across all devices, Google cannot connect the click to the conversion. The conversion fires on desktop but is attributed to direct traffic, not the Google Ads click. Enhanced Conversions partially solves this by matching on email address, but only if the user enters their email on all devices (unlikely in a pre-purchase research flow).
Run a weekly reconciliation:
Continuous tag monitoring automates this reconciliation by comparing tag fire data (what left the browser) with platform-reported data (what Google received). Discrepancies trigger alerts before they compound into weeks of bad bidding data.
Across every tag, every page, 24/7. Set it up in 5 minutes. No GTM dependency. No developer required.
Start 14-day free trial →Across every tag, every page, 24/7. Set it up in 5 minutes.
No GTM dependency. No developer required.