folder_open Analytics & Attribution

How to track form fills, call taps, and WhatsApp clicks in GTM - without counting the same lead three times

Martin Marinov Martin Marinov
19 min read
Topics google-tag-manager-form-trackingtel-click-eventswhatsapp-click-trackingga4-key-events-auenhanced-conversions-leads

A Brisbane growth lead pulled Monday’s Google Ads export and counted 19 “conversions”. The CRM had 11 new enquiries. Four of those were the same person submitting the contact form, then tapping the sticky 04 number, then opening WhatsApp. Smart Bidding treated every tap as a new customer. CPL looked cheap. Pipeline did not. This how-to finishes one job: Google Tag Manager form tracking in Australia that fires once per real enquiry, whether the person submits a form, taps to call, or starts a WhatsApp chat.

“Done” is not a screenshot of Preview with a green tag. Done is a container where form_submit, tel_click, and whatsapp_click land in GA4 as key events, map to Google Ads conversions without double counting, and still work after the next landing-page redesign. You should be able to click a live page in Sydney or Perth, watch one event fire, and see it in DebugView within a minute. If Ads, GA4, and your CRM still disagree by more than a rounding error, you are not done.

Australian lead-gen sites mix three contact paths on the same template: a form (often Gravity Forms, WPForms, HubSpot, or a custom React widget), a tel: link for 13/1300/1800 and 04 mobiles, and a wa.me or api.whatsapp.com link. On paid search in Australia, mobile accounts for roughly 60-70% of clicks on most lead-gen verticals - so call and WhatsApp tracking is not optional. If you only track submit, you train bidding on a minority of the actual jobs.

The GTM kit you need before a single AU click is counted

Skip this and Preview will lie to you. You need Admin on the Google Tag Manager web container that actually ships on the site (not a stale staging container). You need Editor on the GA4 property, and conversion access in Google Ads for the same MCC or client account that spends in AUD. If consent is on, you also need a working Consent Mode setup: ad_storage and analytics_storage must resolve before conversion tags fire, or you will under-count on Safari and over-count on Chrome.

Name events like an operator, not like a developer dumping IDs. Use form_submit, tel_click, and whatsapp_click. Put the same names in the data layer, in GTM, in GA4, and in Ads. If marketing calls it “lead” and engineering calls it “contactFormV2”, you will import the wrong conversion and Smart Bidding will chase ghosts. Document which button is primary on mobile (sticky call vs WhatsApp) so you do not mark both as primary conversions.

You also need a test path that does not pollute production. Create a thank-you URL or a success state you can hit without logging a real job. For WhatsApp, use a dedicated test number or a prefilled message that ops can ignore. For tel:, use a non-public test line if you have one. If every Preview click rings the after-hours tradie roster, you will stop testing, and that is how duplicate tags survive into the live container.

Capacity matters. Someone has to own the container after launch: tag names, trigger exceptions, and the Ads conversion import. If that person is “whoever last logged into GTM”, the next web redesign will silently break form tracking. If you already know the measurement work is bigger than a Friday afternoon, HeyLead’s Google Tag Manager and events work is the channel to keep the data layer honest while you keep running media.

Fire form, tel, and WhatsApp hits that survive a redesign

Work in one pass. Three separate “we’ll do calls later” tickets is how you end up with three Form Submission triggers and one conversion counted four times. Use Preview on a production URL with the GTM snippet in the head. Confirm the container ID matches the published version. Then build in this order: variables, triggers, tags, GA4 event names, Ads conversion actions, then a live verification on mobile Chrome and Safari.

How-to

Action checklist

  1. Create three Data Layer or Auto-Event variables you will reuse: Click URL, Click Text, and Form ID (or Form Classes). For SPA or React forms, add a dataLayer.push on successful submit with event: form_submit, form_id, and page_location. Do not rely on GTM's built-in Form Submission trigger alone if the page never does a full reload. That trigger is the first thing that dies after a "headless" rebuild.
  2. Build the form trigger. Prefer a Custom Event trigger listening for form_submit from the data layer. Fallback: a Form Submission trigger with a condition on Form ID matching the lead form only (not newsletter, not footer "callback" spam). Add an exception for thank-you page views if the CMS also fires a page_view that you previously marked as a conversion. One form, one event.
  3. Build the call trigger. Use a Just Links / Click trigger where Click URL contains tel:. Australian numbers appear as +61 (E.164), 04 (local mobile), 13, 1300, or 1800 - and dynamic call tracking tools typically output E.164 only. The contains tel: condition catches all variants; verify on the live HTML before assuming the format. Exclude tel: links in the footer legal block if those are not lead actions. Fire tel_click once per click, not on mousedown and click.
  4. Build the WhatsApp trigger. Click URL contains wa.me or api.whatsapp.com or whatsapp://. Plenty of AU sites mix a floating button (your WhatsApp link) with in-copy "chat on WhatsApp" links. One trigger covering both is enough. Capture Click URL as a parameter so you can see which button actually starts chats. Name the event whatsapp_click, not "social" or "outbound".
  5. Create three GA4 Event tags (or one tag with a lookup on event name). Send event_name form_submit, tel_click, whatsapp_click. Include page_location, form_id (forms only), and link_url (clicks). Do not send value or currency unless a real quote amount exists. Fake $1 conversion values in AUD train bidding on noise. Mark these as GA4 key events only after you have seen them in DebugView, not before.
  6. In Google Ads, create three conversion actions imported from GA4, or fire Ads conversion tags from the same GTM triggers if you need faster learning. Set the primary conversion to the action that matches how you actually win work. For many AU lead-gen sites that is form_submit. Set tel_click and whatsapp_click as secondary unless calls are the product. If all three are primary, Performance Max will treat one person as three customers.
  7. Turn on Enhanced Conversions for leads on the form path (email and/or phone hashed). Do not hash empty fields. In GTM's Google Ads Enhanced Conversions tag, map the email field variable to the User-Provided Email field; if the form has no email field, set the variable to undefined rather than an empty string - an empty string hashes to a consistent garbage value that pollutes match rates. If the form only collects a first name, skip it until you collect a usable identifier. This is the practical answer to the 20%+ conversion data you lose to ad blockers and ITP, not a new pixel.
  8. Add trigger exceptions: GTM Preview should not fire Ads conversions into the live account if you can help it. Use a hostname allowlist (www and the apex, plus the AU staging host if you test there). Block the Google Ads conversion tag when page_location contains gtm_debug or when the click is from your office IP if you still use one. Quiet test traffic is cheaper than a week of poisoned bidding.
  9. Publish a named version: "AU lead events: form, tel, WhatsApp". Then verify on a phone. Chrome on Android, Safari on iOS. Tap the sticky call button, submit the form, open WhatsApp. Confirm one hit each in GTM Preview (or Tag Assistant) and in GA4 DebugView. Then wait for the Ads conversion diagnostics to show "recording conversions" rather than "no recent conversions".
  10. Reconcile 7 days later. Export GA4 key events, Ads conversions, and CRM new leads by source. You want the same order of magnitude, not identical integers. If Ads is 2x GA4, you still have a duplicate tag or a thank-you page counted as a second conversion. If CRM is far below both, the events are firing on non-lead forms (newsletter, strata portal login, end-of-lease quote widgets that are not sales).

DIY tools for this section

After the tags fire, look at the page the click lands on. A form that is below a slow hero, or a WhatsApp button that covers the submit CTA, will still waste spend even with perfect GTM. Session recordings and heatmaps in HeyLead Insights show whether people rage-tap the call button because the form failed validation, which is a CRO problem, not a tag problem. Fix the friction; do not mark every rage tap as a conversion.

Stamp paid traffic with UTMs before you argue about channel credit. If the landing URL has no campaign parameters, GA4 will dump Google Ads and Meta into the same messy default. Build the URLs once, then keep them. Core Web Vitals still matter here: INP spikes from three chat widgets plus GTM plus a pixel soup delay the click that you just instrumented. If the origin fails INP, users tap twice and you get two tel_click events for one intent.

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

When Ads CPL looks cheap because GTM counted the same enquiry three times

The usual break is duplicate tags, not “GTM is flaky”. A developer added gtag.js in the theme, the agency added GTM, and the CMS plugin added its own GA4 config. Form submit then fires the plugin event, the GTM event, and a thank-you page_view marked as a conversion. You will see this as Ads conversions racing ahead of CRM rows. Delete the extra config tags. One GA4 Measurement ID in GTM. Nothing in the theme head except the GTM snippet.

Form Submission triggers on AJAX forms are the second failure. The listener never hears a native submit, so marketing “fixes” it by converting the thank-you page view. That works until someone bookmarks /thanks or the SPA route stays on the same URL. Push form_submit from code when the server or the client confirms success. If the form shows inline “we’ll call you this arvo” without a URL change, the data layer is mandatory.

Call tracking numbers (dynamic insertion) break Click URL contains tel: if the swap happens after GTM’s listeners bind, or if the number is rendered as a button with an onclick instead of an href. Inspect the live HTML on mobile. If there is no tel: href, add a data attribute and a Click trigger on that CSS selector. Do not fire on every click inside the header. Sticky bars on Gold Coast service sites often wrap logo, phone, and WhatsApp in one giant tap target.

WhatsApp is messy in AU because some teams use a third-party chat overlay that never exposes wa.me. If the click is a JavaScript widget, you need a Custom Event from the vendor or a click listener on the widget’s button class. Test in-app browsers (Instagram, Facebook) as well as Safari. If the widget does not open, you have a conversion you will never see in CRM, and bidding will still “optimise” toward it if you marked the click primary.

Consent Mode v2 without a default denied/granted pattern creates random under-counting. If the banner fires tags before choice, you leak. If it never updates consent, Ads conversions sit at zero on iPhone and look fine on desktop Chrome. Set defaults, update on grant, and keep conversion tags in the appropriate consent group. Do not “fix” a consent gap by making tel_click a primary conversion. That just hides the measurement hole.

Last-click still double counts across channels if Meta and Google both claim the same form. That is an attribution argument, not a reason to skip GTM. Your job in this setup is one clean first-party event stream. Unified measurement can come later. If you cannot trust the event, no model will save the AUD spend. If the container is clean but the landing page still dumps paid traffic on the homepage, that is a different failure: the offer and the page, not the trigger.

If you want a second pair of eyes on whether the container is the problem or the page is, keep it specific: Google Tag Manager and events is the workstream that keeps form, call, and WhatsApp as one signal instead of three competing pixels.

How to track form fills, call taps, and WhatsApp clicks in GTM - without counting the same lead three times

Two patterns we see repeatedly

We had a home-services client where tel_click and form_submit were both set to primary in Ads. CPL looked like a bargain until we matched names in the CRM and found the same Melbourne enquiry three times in one afternoon.

We had a B2B services client where Preview was green but live Safari was empty. Consent never updated after the banner, so iPhone WhatsApp taps never reached GA4 and bidding leaned on desktop form fills only.

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

FAQs

Should form, call, and WhatsApp all be primary conversions in Google Ads?

Almost never. Pick the action that matches a real sales handoff. For most AU lead-gen sites that is form_submit. Keep tel_click and whatsapp_click as secondary observations unless your close rate is genuinely driven by inbound calls. Three primaries teach Performance Max that one person is three customers.

Can I use GTM’s built-in Form Submission trigger on a React or AJAX form?

You can try. It often fails silently because there is no native submit. Push form_submit to the data layer when the request succeeds, and trigger on that custom event. That is the version that survives the next redesign.

Do I need a separate container for staging?

A separate container is cleaner if staging uses a different GA4 stream. If you share a container, hostname conditions are mandatory so test submits do not hit Ads. Never debug by converting on the live 1300 number.

Why do Ads conversions exceed CRM leads after a “successful” GTM launch?

Duplicates: plugin plus GTM plus thank-you page_view, or call plus form plus WhatsApp all primary. Export 7 days, match by time and contact, then delete the extra tags. Do not raise budget until the counts sit in the same neighbourhood.

Does this replace Enhanced Conversions or a CRM offline import?

No. GTM gets the click and the successful submit into GA4. Enhanced Conversions improve match quality on the form. Offline import (qualified or won) is how you stop bidding on junk enquiries. You still need the front-end events to be unique and named consistently.

How to track form fills, call taps, and WhatsApp clicks in GTM - without counting the same lead three times

Free tools

DIY free tools for this playbook

Run these on the pages and campaigns this article covers, then fix what they flag before you scale spend or content volume.

If the checklist shows a leak you cannot close in-house, request a free marketing audit.

Putting it to work

Execution sprint

This week

  1. Pull 30-90 days of performance for how to track form fills call taps and whatsapp clicks in gtm without (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

  • List every lead action on the live AU templates: form IDs, tel: href patterns, wa.me links, and any chat widget that is not a real link.

  • Confirm one GTM container ID in the site head and remove duplicate gtag or plugin GA4 configs.

  • Implement form_submit, tel_click, and whatsapp_click with the playbook above, then verify on Chrome and Safari.

  • Set only one primary conversion in Google Ads. Park the other two as secondary.

  • Stamp a test paid URL with the UTM link builder and submit it once so source is not (direct).

Next 30 days

  • Reconcile GA4, Ads, and CRM for a full month and kill remaining duplicates.

  • Turn on Enhanced Conversions for leads on the form path once email or phone is actually collected.

  • Watch recordings for form errors that cause extra call taps, then fix the page rather than the tag.

  • Document the event dictionary so the next redesign does not invent contactFormV3.

Pull the last 14 days of Google Ads conversions next to CRM new leads and mark every row that is a second tap from the same person. That gap is the whole point of this setup. If you want that form, call, and WhatsApp wiring owned so bidding is not trained on triple-counted enquiries, HeyLead can run the container, the GA4 key events, and the Ads import as one measurement job. Chat with us on WhatsApp

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