Why does Google Ads not track conversion data correctly?

We have a major issue with our GTM integration with Google Ads.
Specifically, we want to confirm that the conversion data is properly being tracked from our website to GTM to Google Ads.

The most likely causes of your issue:

  1. Possibly, auto-tagging is disabled in Google Ads, and the gclid parameter is not added to the URL.
  2. The absence or truncation of cookies (for various reasons) also affects Google Ads Conversion Tracking and may lead to incorrect attribution or a complete loss of conversions.
    Google Ads typically uses gclid (Google Click ID) — a parameter that is recorded in a cookie after the user clicks on an advertisement.
    If this cookie is not saved or is cleared too soon, Ads cannot link the action (conversion) with a specific click/campaign.
    With each new visit (if the cookie was cleared or never created), the user will be recognized from scratch, without tying them to the fact that they previously clicked on an ad.
    This can lead to a situation where, even if the conversion is technically being sent, attribution in Ads will be incorrect or «Direct» (no source).
    If Tag Manager does not have time to correctly get or pass gclid (for example, if the script loads late and the user quickly closes the page), this can also lead to the cookie not being recorded in time and not being sent in the conversion request.
  3. When the user clicks on an ad, the gclid parameter is usually added to the URL.
    Then, using the «Conversion Linker» script in GTM, this parameter is recorded in a cookie (or another storage) and linked to the subsequent conversion.
    If, during anonymization or for other reasons, gclid is reset or not stored at all, Google Ads may «not recognize» the user and may not link the event (form submission/purchase) to the ad click.
  4. If the conversion window is set too short (for example, one day), and users complete a purchase or form submission later, Ads will not count them.
    Or if the chosen attribution model does not reflect the real channels.
  5. Possibly, there are conversion paths that you have not taken into account, and the user does not go to the page with the required tracking script.
  6. Even if the trigger fires, there may be errors in the tag itself or in its parameters (for example, incorrectly specified Conversion ID/Label fields, syntax errors, incorrect variables) that cause data not to be sent or to be sent with incorrect parameters.
    It is necessary to check the error reports in the Chrome console («F12» → «Console») during the purchase.
  7. It is possible that GTM tag fires (or tries to fire) before the required data has time to appear in the data layer.
    For example, the code that pushes the purchase data is loaded asynchronously and runs with a slight delay, while the trigger has already fired.
  8. For Google Ads, it is important to pass the correct parameters: send_to, value, currency, transaction_id (or at least the conversion ID and label).
    If the push event does not have the required fields (or they are empty), Ads may either not record the conversion or record it without an amount/ID.
  9. Possibly, you have a mismatch between the event name in the dataLayer and the trigger name in GTM.
  10. Sometimes there is another script on the site (for example, another analytics system) that introduces global changes (redefines the window.dataLayer object or blocks request sending).
    As a result, the Google Ads tag stumbles upon this error and does not send the conversion.
  11. The caching plugins of your site can interfere with the operation of GTM/Ads scripts.
  12. The website may be using a CDN (e.g. Cloudflare).
    If configured incorrectly, the CDN may even cache dynamic parameters and return the old page that does not contain the current order status or the necessary scripts.
    12.1) Some optimizations (JS compression, asynchronous loading) may be enabled in Cloudflare, which can break the order of script execution, causing dataLayer.push to be triggered late or not at all.
  13. Modern blockers (uBlock Origin, AdGuard, Brave Shields, etc.) do not always compare only the hostname.
    They can analyze:
  • The URL pattern (for example, */gtag/js or */collect).
  • The structure of the request (Google Analytics Measurement Protocol).
  • The destination domain (even if it is not google-analytics.com, but inside the packet, it is clear that data is being forwarded there).
    As a result, some traffic will still be blocked — either at the browser filtering level or by an extension that looks at where the traffic is actually going.
  1. On iOS, Safari has built-in restrictions (ITP), Firefox has Enhanced Tracking Protection, and Brave has Shields, all of which can limit or completely disable third-party trackers.
  2. Safari ITP (Intelligent Tracking Prevention) reduces the lifetime of cookies: if a cookie is set by a third party (such as Google), Safari can quickly delete or reset it.
    It can also block scripts, especially if they are detected as tracking scripts.
  3. Firefox's Enhanced Tracking Protection can block Google Ads Conversion Tracking if the user has strict mode enabled.
  4. Brave Shields blocks many advertising and analytics domains (including Google Ads) by default.
    Even if you use a subdomain proxy, Brave sometimes detects that data is being sent to Google Ads.
  5. If there are several tags with different «Conversion ID» and «Conversion Label» in the account, it is easy to confuse the correct one.
    It may turn out that GTM is sending data to an old or inactive tag.
  6. If some of the leads or orders come in by phone, and the phone number is dynamically substituted through call tracking, and this call tracking is incorrectly integrated with Google Ads, then calls will not be counted as conversions.
  7. If the web page is inside an IFRAME, and GTM is installed outside, additional configuration may be required so that the parent domain can see the event inside the IFRAME (or vice versa).
  8. On single-page applications (React, Vue, etc.), screen switching happens without a reload.
    If the trigger is set to «Page View», it may not fire again.
    It is necessary to use «History Change» or custom events.