folder_open Google Tag Manager

How to debug duplicate conversions in GTM, GA4, and Google A

Martin Marinov Martin Marinov
16 min read
Topics conversion-id-mismatchgoogle-ads-tag-assistantau-consent-modedouble-counting-leadsenhanced-conversions-au

Smart Bidding in an Australian Google Ads account does not care that your CRM counted one quote request. It cares what the conversion tag fired. When that tag fires twice, tCPA looks cheaper than it is, Performance Max soaks up extra budget, and the CFO in Sydney or Perth starts asking why pipeline in HubSpot does not match the Ads column. Done, for this how-to, means one thank-you, one form POST, or one call click maps to one conversion in GTM, one key event in GA4, and one primary conversion in Google Ads, with Meta only receiving the same lead if you deliberately send it via CAPI with a shared event ID.

You are not hunting a mystery pixel. You are isolating a second fire: a leftover gtag on the theme, a GTM trigger that listens to both form submit and the thank-you pageview, Google Ads conversion linker plus a hardcoded AW- tag, or Consent Mode v2 granting ads storage twice on the same session. Australian sites add GST-inclusive checkout values and click-to-call on mobile, so the same enquiry can post as a form, a tel: tap, and a thank-you hit before anyone in sales has spoken.

This walkthrough is for the person who owns the marketing number. You will Preview the container, read Tag Assistant, confirm DebugView, then check Google Ads diagnostics. If the landing page itself is leaking submits, pair the tag work with session evidence from HeyLead Insights so you are not “fixing” a double fire that is actually two frustrated taps on a broken form.

GTM, GA4, and Ads access you should lock on an Australian stack

Skip this and Preview will lie to you. You need Publish rights on the live GTM container (not a copy in a freelancer’s account), Editor on the GA4 property that actually receives Australia traffic, and Standard or Admin on the Google Ads account that spends AUD. If the site uses a CMP for the Australian Privacy Principles and Google’s Consent Mode v2, you also need to know whether ads_storage defaults to denied until the banner. A grant that fires after a form submit will send the conversion twice: once as a denied ping, once as a granted event.

List every conversion object before you touch a trigger. In Google Ads, note the Conversion ID and Conversion Label for each primary action (form, call, purchase). In GA4, note the event name you marked as a key event, and whether it is counted once per session or once per event. If you pass a transaction_id or a lead UUID into the data layer, write that field name down. Without a stable ID, Ads cannot deduplicate a gtag fire against a GTM fire on the same enquiry.

Confirm the site only loads GTM once in the head. Theme files, Shopify additional scripts, WordPress headers, and “backup” gtag snippets from an old media plan are the usual extras. Check the thank-you URL pattern used in Melbourne versus a multi-location site that uses query strings. If /thanks/ and /thank-you/ both exist, a page-path trigger will miss one and a form-submit trigger will still fire on both.

If you cannot get Ads and GA4 into the same login, stop. Comparing last-click in one UI to data-driven in another is how teams “fix” duplicates that are really two attribution windows. When the plumbing is messy, a short pass with Google Tag Manager and events is cheaper than another month of inflated ROAS on a 4.2x benchmark that never hit the bank.

Isolate the second fire: Preview, DebugView, then Ads

Work in this order. Tag Assistant first, GA4 DebugView second, Google Ads conversion diagnostics last. If you reverse it, Ads will show a doubled conversion count and you will rewrite bidding before you know which tag is guilty. Use a real device on the corporate VPN if your CMP behaves differently in Australia than on a US Preview session.

How-to

  1. Open GTM Preview, connect the production URL, and submit one test lead with a unique email (for example [email protected]). Watch the Summary pane. You want exactly one conversion tag in the same event that represents the submit, not on Container Loaded and again on Form Submit.

  2. Click that event. If Google Ads Conversion Tracking, GA4 Event, and a leftover AW- gtag all show Fired, you already have the duplicate. Note the trigger names. A trigger named “All Forms” plus “Thank You Page” is the classic Australian lead-gen stack error after a Webflow or WordPress rebuild.

  3. In Tag Assistant’s Variables tab, confirm event_id or transaction_id is populated and identical if both GTM and a native gtag still exist. Empty IDs mean Ads cannot collapse two hits. Add the ID in the data layer on the success callback, not on DOM Ready.

  4. Disable every conversion tag except one Google Ads tag and one GA4 event. Publish to a workspace, Preview again, submit once. If the Ads tag still fires twice, the second fire is outside GTM: theme gtag.js, Google Ads “use a tag” website installation, or a plugin injecting gtag(‘event’,‘conversion’).

  5. View page source and search for GT- , AW- , G- , and googletagmanager.com. One GTM snippet is the target. A second gtag config for the same AW conversion ID is a guaranteed double count, including GST-inclusive purchase values that then look like two orders.

  6. Open GA4 DebugView on the same session. The key event should appear once. If generate_lead or purchase appears on form_submit and again on page_view of /thanks, your GA4 tag is bound to two triggers. Keep the event on the success signal only. Mark it as a key event counted once per event, then rely on event_id if the CMS can re-render the thank-you page.

  7. Check Consent Mode. If ad_storage flips from denied to granted after submit, GTM may send a conversion in the denied state and again when the grant lands. Fire the conversion only after consent is granted, or wait for the CMP callback. Do not fire on the banner’s first paint.

  8. In Google Ads, open Goals, then Conversions, then the action. Confirm it is set to Primary, counting One, and that “Include in Conversions” is on for only one action per lead type. Secondary duplicates of the same form inflate Smart Bidding even when you “do not use them in bidding” if another identical AW tag still uploads.

  9. Use Ads’ tag diagnostics / conversion details for the last 7 days. Filter to your test time in Australian Eastern time. Two conversions with the same timestamp and different conversion action names means two tags, not two customers. Two conversions milliseconds apart with the same GCLID means one page fired gtag twice.

  10. If you use Enhanced Conversions, hash the same email once. Sending the hashed email from GTM and again from the Google tag in the CMS looks like two qualified leads. Turn on the unified Enhanced Conversions toggle in one place only.

  11. Call and click-to-call: if Google forwards a tracking number and you also fire a GTM click trigger on tel: links, Ads will count the call conversion and the click conversion. Keep call reporting in Ads or the click in GTM, not both as Primary.

  12. Publish the cleaned container, wait for the live web container to update, and send three more unique test leads. Export Ads conversions for that hour and match rows to GA4 DebugView. Three tests, three rows. Anything else means a tag you did not own is still on the host.

Slow INP from a heavy GTM container can make testers double-click Submit. That is a real second conversion, not a tag bug. If CrUX shows the origin failing Interaction to Next Paint, fix the click handler before you keep deleting tags. Only 55.9% of origins pass all three Core Web Vitals, so an Australian lead-gen page with three pixels and a chat widget is a plausible culprit.

Build test URLs with consistent UTM parameters so GA4 sessionisation does not split your Preview traffic into a new session on the thank-you host. Cross-domain on a booking subdomain is a frequent Melbourne SaaS pattern: without linker coverage you get two sessions and two key events for one form.

Not sure where your funnel leaks?
Get a free marketing audit - we review your search, ads, and landing pages and send back what to fix first.
Get a free audit

How to debug duplicate conversions in GTM, GA4, and Google Ads

Where the same Australian lead still posts twice after a “clean” publish

You unpublished the extra Ads tag and Preview looks perfect. Monday’s spend report still doubles. The live site is not the Preview connected tab. A CDN or app cache is serving the old container, or a landing page on Unbounce still has its own native pixel. Check the network tab on the production thank-you URL for two collect or conversion hits after a hard refresh, not after Preview.

SPA route changes fire history events that look like new pageviews. If your GA4 config tag fires on History Change and your conversion listens to that as well as a dataLayer push, you will count the lead on the form route and again when the router paints /thanks. Bind the conversion to the dataLayer event your devs already emit (formSubmitSuccess) and ignore virtual pageviews for that action.

Audit scorecard

  1. Two snippets, one AW IDGTM plus a hardcoded gtag(‘config’,‘AW-…’) in the footer. Remove the footer snippet. Keep conversion linker only inside GTM.

  2. Form trigger plus thank-you triggerBoth Primary. Keep the success event only. Thank-you pageviews double-count people who refresh or hit back.

  3. Call click and call reportingtel: click in GTM and Google forwarding numbers both marked Primary. Pick one signal per enquiry type.

  4. Consent grant after submitConversion fires denied, then granted. Gate the tag on granted ads_storage or on the CMP callback.

  5. Empty event_idEnhanced Conversions and duplicate gtag hits cannot collapse. Push a UUID from the server or the form success handler.

  6. Meta CAPI plus browser pixelSame lead without event_id / fbp. Ads looks fine while Meta doubles. Share one ID across browser and server.

Privacy and blockers already strip 20%+ of conversion data. Doubling the remaining fires trains bidding on the wrong volume. Last-click across Ads and GA4 will still disagree after you dedupe tags, because the models differ. Deduping is about not sending two identical hits, not about forcing every dashboard to the same integer.

If form UX is the real double submit, watch rage clicks and abandon on the thank-you path rather than adding more exception triggers. You already have the tag map; now you need behaviour proof. When you want a specialist to own the container, triggers, and Ads conversion objects as one job, use the same Google Tag Manager and events workstream rather than a one-off pixel tidy.

What marketing leaders are seeing

“We paused PMax for a week in Adelaide because CPA looked brilliant. HubSpot had 11 qualified forms. Ads had 23 conversions. The extra 12 were the thank-you tag plus the form listener on the same GTM event.” - Head of Growth, B2B services

“Consent Mode was ‘on’, but the conversion still left on DOM Ready. The grant landed 400ms later and sent it again. tCPA chased ghost volume for 11 days before we gated the tag.” - CMO, national ecommerce

Prefer to just ask? Message Martin directly on WhatsApp: Chat with us on WhatsApp

How to debug duplicate conversions in GTM, GA4, and Google Ads

FAQs

Should Google Ads and GA4 both receive the same generate_lead event?

Yes, once each, from GTM, with a shared event_id if you also send Enhanced Conversions. Do not also keep a website tag created inside the Google Ads UI for that same Conversion ID.

Does counting “One” in Google Ads fix a double GTM fire?

No. “One” deduplicates repeat conversions from the same click within the window. Two tags on one submit still look like two conversions from one GCLID in many setups, especially with different action names.

Can I leave a secondary conversion for the thank-you page?

You can, if it is not included in bidding or in the Conversions column you report to finance. Most Australian accounts still leave it as Primary by accident after a rebuild.

Why does Preview show one fire and production show two?

Cached container, a second snippet on a landing-page host, or a CMP path that only runs on the live domain. Always verify with a logged-out production tab and the Network panel.

Do I need to rebuild campaigns after cleaning tags?

Do not reset structure. Let Smart Bidding relearn on cleaner signals. Expect a noisy week, not a new account.

Putting it to work

Execution sprint

This week

  1. Pull 30-90 days of performance for how to debug duplicate conversions in gtm ga4 and ads (Search Console, ads, CRM, or call logs - whatever you have).
  2. Flag the top leak: wrong intent, weak page, slow response, or dirty conversion tracking.
  3. Ship one fix on the highest-traffic money path (page, campaign split, or response rule).
  4. Run the free tools below on that same URL or account and log the findings.

Next 30 days

  1. Expand the fix to the next one or two money paths only after the first one shows cleaner bookings.
  2. Align creative, keywords, or content with the same offer the page now states.
  3. Review booked outcomes weekly; cut anything that still only produces unqualified volume.

This week

  • Export 7 days of Google Ads conversions and match timestamps to CRM or form emails for one campaign.

  • Preview production, submit one unique lead, and screenshot every Fired conversion tag.

  • Search the live HTML for AW- and googletagmanager.com duplicates.

  • Turn extra Primary actions to Secondary or remove the leftover gtag snippet.

  • Push an event_id on the success callback and confirm it in Tag Assistant.

  • Build one UTM test URL and repeat the submit on a phone, because click-to-call is where AU stacks double-count.

Next 30 days

  • Gate conversion tags on granted ads_storage and re-test the CMP.

  • Align call reporting so tel: clicks are not Primary beside forwarded-number conversions.

  • Watch INP on the form page and remove scripts that invite double submits.

  • Reconcile Ads, GA4 key events, and CRM weekly until the counts stay within a small operational gap, not 2x.

Pull yesterday’s Ads conversion rows against form emails before you change bids again. If you want the duplicate-fire hunt, Consent Mode gating, and conversion objects kept honest as the site changes, HeyLead can own that GTM-to-Ads loop so you are not debugging Tag Assistant between forecast meetings. Chat with us on WhatsApp

Work with HeyLead
Free marketing audit, or reach Martin directly:
Get a free audit Connect on WhatsApp · [email protected]