folder_open GA4

How to set up GA4 events for forms and calls in AU

Martin Marinov Martin Marinov
17 min read
Topics generate-lead-eventclick-to-call-trackingchat-start-eventgtm-preview-aukey-events-google-ads

If you run Google Ads into a Sydney or Melbourne landing page and your “conversions” are still pageviews, scroll depth, or a thank-you URL that also fires on the careers form, Smart Bidding is learning the wrong job. Done looks like this: three enquiry events (form submit, click-to-call, chat start) fire once per real attempt, show in DebugView with the parameters you named, sit as key events in GA4, and match the same names you import into Google Ads. Not 40 generate_lead hits from a sticky header. Not a tel: click that fires when someone copies the ABN.

This how-to is for the person who owns the marketing number in Australia: you need enquiry-quality signal so Performance Max and Search stop chasing junk. You will build the events in Google Tag Manager, mark them in GA4, and verify them against how Australians actually enquire (mobile tap-to-call after hours, Intercom or HubSpot chat on a Gold Coast landing page, a Typeform or HubSpot form that posts without a full reload). If tracking is already a mess, treat this as a rebuild, not a tidy-up.

Skip this and the tags will publish. They just will not mean anything. You need Editor (or Admin) on the GA4 property, Publish on the GTM web container that actually loads on production (not the staging container your developer still uses), and Admin on Google Ads if you will import those events as conversions. Confirm the Google tag is firing on every template: home, service pages, paid landing pages, and the thank-you or “we’ll be in touch” view. In Australia you also need a consent story that is not theatre. If you use Consent Mode, ads and analytics storage must resolve before you claim a conversion. Otherwise you will under-count real form posts and over-count clicks that happened before the banner closed.

Write the enquiry taxonomy on one line before you open GTM. Form: a completed, successful submit that would create a row in HubSpot, Salesforce, or the inbox the sales coordinator actually works. Call: a deliberate tap or click on a tel: link that is meant to start a conversation (header, sticky bar, click-to-call button), not every phone number in the footer legal block. Chat: the first human-intent open (widget expanded and a first message sent, or the vendor’s “conversation started” callback), not the floating bubble loading. If you sell to strata managers in Brisbane and tradies in Perth, those three still cover almost every paid lead. WhatsApp click-to-chat is a fourth if that is a real sales path; treat it like call, not like form.

You also need a way to see post-click friction. A form can “succeed” in GTM and still be the page people abandon after the third required field. Pair the event work with behaviour evidence: scroll, rage clicks on the submit button, and drop-off on mobile. That is where HeyLead Insights earns its keep, because a clean generate_lead event that sits on a form nobody finishes is still a bad signal. Check Core Web Vitals while you are in there. INP from a chat widget or a heavy review carousel will make the same tap that should fire generate_call feel broken. Roughly 55.9% of origins pass all three Core Web Vitals in recent CrUX data; if your paid landing page is not in that set, fix the page before you celebrate the tag.

Last prerequisite: one source of truth for names. Use generate_lead for successful forms, generate_call for tel: intent, generate_chat for a started conversation. Keep them lowercase, no spaces, same spelling in GTM, GA4, and Google Ads. If last year’s agency used form_submit and this year’s freelancer used lead, pick one and kill the rest. Duplicate names are how last-click reports count the same enquiry twice and how your CFO decides “attribution is basically dead.”

If you want a second pair of eyes on whether the property, container, and Ads account even agree, the GA4 configuration and events work is the right place to start, not a new campaign structure.

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

Build form, call, and chat events so GA4 and Google Ads share one definition

Work in GTM Preview against the live URL you actually buy traffic for (a paid landing page in AU, not localhost). Keep the browser console open. You are done when DebugView shows one event per enquiry, with form_id or link_url, and Realtime does not double-fire on a single click.

How-to

  1. In GTM, create a GA4 Event tag named generate_lead. Event name: generate_lead. Event parameters: form_id, page_location, and (if you have it) lead_type such as quote, demo, or end_of_lease. Trigger: Form Submission if the form is a native HTML post, or a Custom Event / dataLayer push if it is React, Webflow, HubSpot, or Typeform. Never fire on button click alone. Wait for success: thank-you page view, 200 from the endpoint, or the vendor callback. Test a failed validation so a missing postcode in an Adelaide postcode field does not count as a lead.

  2. Create generate_call. Event name: generate_call. Parameters: link_url, link_text, page_location. Trigger: Just Links, Click URL contains tel:, and Click Element matches the enquiry numbers only. Exclude ABN, accounts, and after-hours recorded lines if those are not sales. On iOS Safari, confirm the click still reaches GTM before the phone app takes over. Many AU sites lose half their call events on iPhone because the tag is too slow.

  3. Create generate_chat. Event name: generate_chat. Trigger on the chat vendor’s “conversation started” or first visitor message, not widget load. Intercom, HubSpot, Zendesk, and Facebook chat each expose a different callback. If the vendor only gives you “widget opened,” fire a separate chat_open event and do not mark it as a key event. Parameters: chat_provider and page_location. If WhatsApp is a sales path, add generate_whatsapp on clicks to wa.me or api.whatsapp.com and treat it like a call.

  4. Add a uniqueness guard. For forms, push a dataLayer event only after success and include a submission_id or timestamp. In the tag, use a custom JavaScript variable or a 1-second tag sequencing so the same thank-you does not fire generate_lead on every SPA re-render. For calls, fire once per click, not on mouseover. For chat, fire once per conversation_id. This is the step that stops Google Ads from “optimising” to duplicate hits.

  5. Preview: submit a real form, tap a real tel: link on a phone, start a real chat. In GTM, each tag should fire once. In GA4 Admin, open DebugView (enable the debug_mode parameter on the tags or use the GA Debugger). Confirm event names, parameters, and that user_pseudo_id stays the same across the three. Then check Realtime. If you see two generate_lead events, do not publish. Find the second trigger (usually a thank-you pageview tag plus the form listener).

  6. Publish the GTM container with a version name you will recognise in six months (“AU enquiry events: form/call/chat”). In GA4, go to Admin, then Events, mark generate_lead, generate_call, and generate_chat as key events. Do not mark generate_lead and a duplicate form_submit. Create an exploration with event name, landing page, session source/medium, and device. You want to see mobile call share vs desktop form share, because mobile still takes most paid clicks and converts worse when the tap target or INP is messy.

  7. In Google Ads, import those three as conversions (Goals, then GA4). Set primary conversion to the event that matches how you actually close work. A national tradie network that books on the phone should not bid primarily on generate_lead if 70% of jobs start on generate_call. Turn on Enhanced Conversions if you collect email or phone on the form and your privacy policy covers it. That is the first-party patch against the 20%+ conversion data you otherwise lose to blockers and consent. Keep UTM hygiene so paid social and Search do not collapse into (direct).

  8. Reconcile 7 days of events against the CRM or inbox. Count unique enquiries, not rows. If GA4 is 30% high, you still have a double-fire or a thank-you that loads on refresh. If GA4 is 30% low, the SPA form never hits the listener, or Consent Mode is holding analytics_storage. Fix that before you change bids. Then spot-check three landing pages (Sydney paid, Melbourne organic, a thin service URL) so templates did not miss the container.

After publish, leave DebugView on for one paid session you control. Buy a $5 click if you have to. You want the same event in GTM, GA4, and the Ads conversion column. If Ads shows the conversion and GA4 does not, you imported a different event name. If GA4 shows it and Ads does not, the key event is not imported or is secondary. ROAS is irrelevant if the conversion you feed the algorithm is a scroll.

When the form is the bottleneck rather than the tag, stop adding events. Watch session recordings on the enquiry page, fix the field that kills mobile, then re-test generate_lead. Clean conversion setup beats another campaign.

GA4 event tracking for forms, calls, and chats: a practical setup guide for Australian advertisers

Where Australian stacks usually ship a broken copy of the same three events

The classic fail is firing generate_lead on Form Start or on every input blur. You get a beautiful volume chart and a sales team that swears marketing is sending tyre-kickers. The second is the thank-you URL shared by contact, careers, and supplier forms. One GTM trigger, three business outcomes, one key event. Split by form_id or by destination. If you cannot, do not mark the event as key until you can.

Call tracking numbers make this worse in AU. Dynamic insertion swaps the tel: href after GTM has already bound the listener, so generate_call never fires, or it fires on the old number. Bind clicks on a stable CSS class (.js-call-enquiry) rather than the raw href, and re-init after the swap. Chat widgets that inject after window.load will miss a trigger that only ran on DOM Ready. Use a custom event the vendor documents, or an element visibility trigger on the transcript pane, not “All Pages.”

Consent Mode v2 with a banner that defaults to denied will look like “GA4 is broken” for a week after you go live. Check the consent state in Preview. If analytics_storage is denied, you should not expect a key event. Do not “fix” that by firing tags in a way that ignores consent. You will also see last-click counting the same person across generate_lead and generate_chat if they submitted a form then opened chat to ask when someone would call. That is two events and one enquiry. Keep both as key events if both are real, but in Ads set only one as the primary optimisation action per campaign type, or you will bid against yourself.

A Melbourne B2B shop we walked through had generate_lead on the HubSpot form’s onReady callback. Every paid session that rendered the form counted. CPL in Ads looked heroic. The CRM showed 11 real contacts in the same window. Moving the push to onFormSubmitted and adding submission_id dropped GA4 events in line with HubSpot. Bidding got worse for two weeks, then qualified pipeline recovered because the algorithm finally saw scarcity. That is the trade-off: honest events feel like a volume crash. They are not. You deleted noise.

If paid Search is already live while you rebuild, pause optimisation against the old conversion for a few days rather than mixing old form_submit with new generate_lead. Mixed signals reset learning as surely as daily campaign reshuffles. For a tighter measurement pass after you ship, you can always come back to GA4 event configuration rather than opening a new Ads structure.

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

GA4 event tracking for forms, calls, and chats: a practical setup guide for Australian advertisers

FAQs

Should generate_lead, generate_call, and generate_chat all be primary conversions in Google Ads?

Import all three. Set primary to the action that matches how you win work. Phone-led businesses should optimise Search to generate_call (and WhatsApp if that is real). Form-led B2B can use generate_lead as primary and keep chat as secondary for observation. Using all three as primary in one campaign inflates conversions and teaches bidding to chase the easiest tap.

Do I need a thank-you page if the form is AJAX?

No. You need a success signal: dataLayer push, network 200, or vendor callback. A thank-you URL is convenient for humans and for a backup pageview trigger. It is not required if the SPA never navigates. Do not add a fake /thank-you just for GA4 if it breaks the UX.

What if we use a call tracking vendor with swapping numbers?

Do not key off the raw tel: string. Key off a stable class or data-enquiry=“call” attribute the vendor will not rewrite. Fire generate_call on that click, and pass the displayed number as a parameter if you need it for QA. Re-test after the vendor’s script loads, not only on a cold page.

In GTM Preview, inspect the Consent tab on the Google tag. If analytics_storage is denied, GA4 should not get the hit. Compare event counts for users with granted vs denied consent in an exploration. If granted users match the CRM and denied users are empty, the tags are fine. The banner is doing its job. Do not “compensate” by double-firing granted users.

Can I reuse the old form_submit event name?

Only if it already means a successful enquiry and Ads is already trained on it. If form_submit ever meant a click, a start, or three different forms, start generate_lead and retire the old key event after you import the new one. Running both as key events is how you invent 40% extra pipeline.

Putting it to work

Execution sprint

This week

  1. Pull 30-90 days of performance for forms and calls (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.

Pull yesterday’s GA4 key events next to yesterday’s inbox or CRM, side by side, for one Australian landing page you actually spend on. If the counts disagree by more than a handful, do not touch bids until the eight steps above are live in Preview.

This week

  • Lock the three event names and which forms, tel: links, and chat widgets qualify.

  • Build generate_lead, generate_call, and generate_chat in GTM with success-only triggers.

  • Verify once each in DebugView on mobile and desktop, including iOS Safari for calls.

  • Mark only those three as key events and import them into Google Ads with one primary per campaign type.

  • Stamp paid URLs with the UTM link builder so source/medium does not collapse.

  • Re-count 48 hours of unique enquiries against the CRM.

Next 30 days

  • Add form_id and lead_type parameters so careers and supplier forms never enter bidding.

  • Turn on Enhanced Conversions for form fields you already collect lawfully.

  • Fix INP on the enquiry template if chat or reviews are blocking the tap; use the Core Web Vitals checker.

  • Drop secondary vanity events from key events so Smart Bidding sees scarcity.

If the painful bit is the GTM listeners, consent, and keeping form, call, and chat events aligned with what Ads uses to bid, HeyLead can own that measurement loop so you are not debugging DebugView between campaign reviews. Chat with us on WhatsApp

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