Quick answer: To track form submissions in GA4, create a GA4 Event tag in Google Tag Manager named generate_lead, fire it with the trigger that matches how your form behaves (Form Submission, thank-you page or dataLayer event), test that it fires on success only, publish, and mark the event as a key event in GA4.
Form leads are the number one conversion for service businesses, yet they are the most common tag to break. Follow these 10 steps in order. Total time: about 45 minutes.
In this guide: Choose your method | 10 steps | Common problems | FAQ
First: choose the right method for your form
Submit your own form and watch what happens. The result tells you which trigger to use.
| What happens after submit | Best trigger | Step |
|---|---|---|
| Redirects to a unique thank-you page | Page View on that page path | Step 4 |
| Standard form, browser submits it | Form Submission | Step 3 |
| Message appears on the same page (AJAX) | Element Visibility or dataLayer event | Step 5 |
| You have a developer | Custom Event from dataLayer | Step 5 |
The 10-step setup
Step 1: Check how your form behaves after submit
Fill in and submit the form once. Note whether the browser goes to a new thank-you URL, reloads the same page, or shows a success message without reloading. Use the table above to pick your method.
Step 2: Create the GA4 event tag
- In Google Tag Manager open Tags > New and choose Google Analytics: GA4 Event.
- Select your Google tag or enter your Measurement ID (it starts with G-).
- Set the event name to generate_lead, a GA4 recommended event.
- Leave the trigger empty for now and save. You will attach it in Step 3, 4 or 5.
Step 3: Method A - Form Submission trigger
- Go to Variables > Built-in variables > Configure and enable all Form variables.
- Create a trigger of type Form Submission.
- Tick Check validation. This stops the trigger firing when the browser blocks a submit because of errors.
- Under "Enable this trigger when", use a broad condition such as Page Path contains /.
- Open Preview, submit the form, and look for a Form Submit event. If it never appears, this method will not work for your form, so use Step 4 or 5.
- To limit the trigger to one form, find a unique value such as Form ID in the event's Variables tab, then change the trigger to Some Forms with that condition.
- Attach the trigger to your generate_lead tag.
Step 4: Method B - Thank-you page trigger
- Confirm the success URL is unique and people cannot reach it without submitting the form.
- Create a Page View trigger and choose Some Page Views.
- Set Page Path equals your exact path (for example /thank-you). Avoid broad matches such as "contains thank".
- Name it clearly, for example "PV - Form Success", and attach it to the generate_lead tag.
Step 5: Method C - dataLayer or element visibility
Best option (needs a developer): ask your developer to push an event such as formSubmission only after a successful submit, then:
- Create a Custom Event trigger with the exact same event name.
- Create Data Layer Variables for any values sent, such as form type.
- Attach the trigger to the generate_lead tag.
No developer, success message on the same page: right-click the message, choose Inspect, and find a unique ID or class. Create an Element Visibility trigger using that ID or CSS selector (class selectors start with a dot), and tick Observe DOM changes.
Step 6: Test success and failure in Preview
- Submit the form correctly. The generate_lead tag must show under Tags Fired.
- Submit again with a required field empty. The tag must not fire.
If the tag fires on errors, the trigger is too broad. Turn on Check validation or switch to a method that only fires after success.
Step 7: Add a form_id parameter
If you run several forms, open the tag, add an event parameter named form_id with the value {{Form ID}} (or your own variable), and save. To report on it in GA4, register it under Admin > Custom definitions as an event-scoped custom dimension. Allow up to 48 hours for it to populate.
Step 8: Publish the container
In GTM click Submit, give the version a clear name (for example "Add form lead tracking"), and click Publish. Preview mode changes are not live until you do this.
Step 9: Mark generate_lead as a key event
In GA4 mark generate_lead as a key event under the Events section. If it has not appeared in the list yet, add the exact event name manually. You need Marketer access or higher. Key events are not retroactive, so only submissions after you mark it are counted.
Step 10: Verify in DebugView and reports
Open Admin > Data display > DebugView and submit the form with Preview on. The event should appear within minutes. Standard reports can take 24 to 48 hours. If the event is missing there, see the checklist in my post GA4 Events Not Showing in Reports? 11-Step Fix.
Common problems and fixes
| Problem | Fix |
|---|---|
| No Form Submit event in Preview | Form is not a standard submit. Use Step 4 or 5. |
| Tag fires on errors | Turn on Check validation, or use a success-only trigger. |
| Several forms trigger the same tag | Limit by Form ID and send a form_id parameter. |
| Tag fires twice | Set the tag to fire once per page. |
| Variable shows undefined | Check spelling and enable the built-in Form variables. |
| Element Visibility never fires | Check the selector and tick Observe DOM changes. Forms in iframes need extra setup. |
Frequently asked questions
What is the best way to track form submissions in GA4?
If the form redirects to a unique thank-you page, a page view trigger is the most reliable. Otherwise try the built-in Form Submission trigger, and use a dataLayer event pushed by a developer when neither works.
Why is my GTM Form Submission trigger not firing?
Many forms do not use a standard browser submit, for example AJAX forms. If no Form Submit event appears in Preview mode, use a thank-you page, an element visibility trigger or a dataLayer event instead.
Which event name should I use for form submissions in GA4?
generate_lead is a GA4 recommended event and a good default for lead forms. Use a custom name only if you have a clear reason, and keep it under 40 characters.
Why does my form tag fire even when the form has errors?
The trigger is too broad. Turn on Check validation in the Form Submission trigger, or switch to a thank-you page or dataLayer trigger that only fires after success.
How do I track multiple forms separately?
Find a unique identifier such as Form ID, limit the trigger to that form, and send it as a form_id parameter on the GA4 tag. Register the parameter as a custom dimension to report on it.
Final thoughts
Match the trigger to how your form behaves, test both success and failure, then publish and mark the key event. Once leads flow into GA4, you can import the key event into Google Ads as a conversion for bidding.
Using a specific form plugin or builder? Tell me which one in the comments and I will cover it step by step.