
Form submission tracking in GA4 sounds simple, but it is one of the most common places tracking goes wrong. We regularly see forms that count every click on the submit button (including failed validation), forms that are not tracked at all, and leads that are counted twice because GA4's automatic tracking and a GTM tag both fire.
This guide covers the reliable ways to track form submissions in GA4 using Google Tag Manager, which one to choose, and how to turn them into GA4 key events you can trust.
Quick answer
The most reliable form submission tracking in GA4 uses a dataLayer event pushed only after a successful submission, picked up by a Custom Event trigger in Google Tag Manager that fires a GA4 event such as `generate_lead`. If that is not possible, use a unique thank you page, then an Element Visibility trigger on the success message. Test in GTM Preview and GA4 DebugView, then mark the event as a key event in GA4.
Why GA4's automatic form tracking is not enough
GA4's enhanced measurement includes "Form interactions", which sends `form_start` and `form_submit` events. It is a useful extra, but it is not a reliable lead count:

- It can fire on a submit attempt even if validation fails.
- It does not detect many AJAX forms or forms inside iframes, such as embedded HubSpot, Typeform or Calendly widgets.
- It treats all forms the same, so newsletter sign-ups and enquiry forms are mixed together.
Many setups switch it off (Admin, Data streams, Enhanced measurement) and track important forms deliberately. If you keep it, do not mark `form_submit` as a key event at the same time as a custom lead event, or you will double count.
Choose your tracking method
Work down this list and use the first method your site supports.
Method 1: dataLayer push on success (best)
The site, or the form plugin, pushes an event into the dataLayer only after the form has been successfully submitted:
``` window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: 'form_success', form_id: 'contact', form_name: 'Contact Form' }); ```
Many form tools can do this with a small snippet or a built-in event. For example, Contact Form 7 fires a `wpcf7mailsent` DOM event, and Gravity Forms has a confirmation hook, both of which a developer can use to push to the dataLayer. Embedded HubSpot forms broadcast a message when submitted, which a short listener script in GTM can convert into a dataLayer event.
This method is the most accurate because it is tied to real success, not to a click.
Method 2: thank you page view
If the form redirects to a unique URL such as `/thank-you/` or `/enquiry-received/`, you can trigger on that page view. It is simple and robust, with two caveats:
- Make sure the page cannot be reached any other way (noindex it, and keep it out of menus and sitemaps).
- Refreshes and revisits will count again, so use a dedicated URL per form where possible.
Method 3: Element Visibility on the success message
For AJAX forms that show "Thanks, we will be in touch" without reloading, use GTM's Element Visibility trigger, targeting the success message by ID or CSS selector. Tick "Observe DOM changes" so GTM notices the message appearing, and set it to fire once per page.
This works well, but it depends on the site's markup. A redesign can silently break it.
Method 4: GTM Form Submission trigger (last resort)
GTM's built-in Form Submission trigger listens for the browser's submit event. Enable "Check Validation" so it only fires when the form's default action is not blocked. It often fails with AJAX forms, so test carefully. Avoid using plain click triggers on submit buttons: they count failed attempts.
Setting it up in Google Tag Manager
Using method 1 as the example:

- Create the variables. Go to Variables, New, Data Layer Variable. Create `DLV - form_id` with the name `form_id`, and `DLV - form_name` with the name `form_name`.
- Create the trigger. Triggers, New, Custom Event. Event name: `form_success`. If you only want certain forms, choose "Some Custom Events" and add a condition on `DLV - form_id`.
- Create the GA4 event tag. Tags, New, Google Analytics: GA4 Event. Select your Google tag or enter your measurement ID. Event name: `generate_lead`. Add event parameters `form_id` and `form_name` using your variables.
- Check consent settings so the tag respects your consent mode configuration.
- Attach the trigger and save.
For method 2, swap the trigger for a Page View trigger where Page Path equals your thank you URL. For method 3, use your Element Visibility trigger.
Which event name should you use?
`generate_lead` is Google's recommended event for lead forms, and it is a sensible default. If you have several distinct forms, keep one event name and use a `form_name` parameter to tell them apart, rather than creating a different event for every form. It keeps reporting tidy and stays well within GA4's event limits. If you want to report on the parameter, register `form_name` as an event-scoped custom dimension in GA4 (Admin, Custom definitions).
You can also pass a `value` and `currency` if you assign an estimated value to leads, which helps if you later optimise ad bidding on value.
Testing your form submission tracking

- Click Preview in GTM and open your site in Tag Assistant.
- Submit the form with invalid data first. The tag should not fire.
- Submit it properly. Confirm `form_success` appears in the event list and your GA4 tag fires once.
- In GA4, open Admin, DebugView and check that `generate_lead` arrives with the right parameters.
- Test each form, on desktop and mobile.
Then publish the container with a clear version name.
Mark it as a GA4 key event
In 2024 Google renamed GA4 "conversions" to key events. To mark your lead event:
- In GA4, go to Admin, Data display, Events (or Key events).
- Find `generate_lead` once it has been received (this can take up to 24 hours to appear), and toggle it as a key event. You can also create the key event in advance by entering the name manually.
If you run Google Ads, you can import the GA4 key event as a Google Ads conversion, or track the same submission with a Google Ads conversion tag in GTM. Choose one as primary for bidding, not both, otherwise conversions are counted twice. Our Google Tag Manager setup guide covers how this fits into the wider container.
Lead tracking beyond the form
A tracked form submission tells you a lead arrived. It does not tell you whether it was any good. For proper lead tracking:
- Capture the click ID and UTM values in hidden form fields so your CRM knows where each lead came from (see our UTM parameters guide).
- Feed qualified leads or sales back into Google Ads through offline conversion imports or enhanced conversions for leads.
- Track phone and email clicks separately, as they are softer signals than a completed form.
Common form tracking mistakes
- Click triggers on the submit button, counting failed attempts.
- Enhanced measurement `form_submit` and a custom event both marked as key events.
- Newsletter sign-ups counted as leads.
- Thank you pages that are indexed or bookmarked, inflating numbers.
- Embedded third-party forms that are not tracked at all.
- Tags blocked by consent settings that were never tested.
If you are not sure your current setup counts leads correctly, our Tracking Audit + Fix includes conversion event testing on every form.
FAQs
Why is GA4 not tracking my form submissions?
Common causes are AJAX or iframe forms that the trigger cannot see, a trigger condition that never matches, consent blocking the tag, or the container not being published. GTM Preview usually shows which.
Should I use form_submit or generate_lead?
Use `generate_lead` from a deliberate GTM setup for lead forms. `form_submit` from enhanced measurement is too broad to rely on as a conversion.
How long until form submissions show in GA4 reports?
DebugView and the Realtime report show them within seconds. Standard reports can take 24 to 48 hours to process.
Can I track embedded HubSpot or Typeform forms?
Yes, but usually not with standard triggers. Use the provider's submission callback or message events, convert them into a dataLayer push, and trigger on that.
Get your forms tracked properly
If you want every lead counted once, correctly, our Tracking Setup (GTM & GA4) is £149, and our Tracking Audit + Fix is £199 if you already have tracking in place. Get My Audit to get started.
Share
