Guide 155 · Events · GA4 + Tag Manager
Track form submissions with the recommended form_submit event: form_id, the GA4 Event tag, and the submit-vs-accepted split
A site with five forms and one submission count cannot tell which form works. The form_submit event is a recommended event with four prescribed parameters — form_id, form_name, form_destination, and form_submit_text — and this guide builds it as a GA4 Event tag that fires on the submit, carrying the identity of the form.
After the tag is published, a test submission shows in DebugView as a form_submit event with form_id, form_name, form_destination, and form_submit_text all set, and the Realtime report lists it under Event count by Event name within minutes.
Download the container fragment: the form_submit event container fragment (JSON) (4938 bytes, MD5 45f474cda1f7aa2c1dc4e4ad26a3bb27). It holds one GA4 Event tag named GA4 - form_submit, the Custom Event trigger that fires when the data layer event equals form_submit, and the four data layer variables for form_id, form_name, form_destination, and form_submit_text. The Measurement ID is left as G-XXXXXXXXXX for you to replace. Import it from Admin, then Import Container, choosing Merge if the container already has tags.
What you need
- The Google tag already installed through Tag Manager. This guide adds one event tag beside it.
- A form submit your site can signal. The push runs in the submit handler, carrying the identity of the form that was submitted.
- Four values per submit. The prescribed parameters for
form_submitareform_id(the identifier of the form),form_name(the name of the form),form_destination(the page the visitor lands on after submitting), andform_submit_text(the text on the submit button).
The worked example
The test below is sixty form starts and forty-five submits across two forms in one week. The number that decides which form works is the submit rate per form.
| Form (form_id) | Starts | Submits | Submit rate |
|---|---|---|---|
| contact-form | 40 | 32 | 80.00% |
| quote-form | 20 | 13 | 65.00% |
| All forms | 60 | 45 | 75.00% |
Those figures were recomputed here before publication: 40 plus 20 is 60 starts; 32 plus 13 is 45 submits; 32 divided by 40 is 0.8, so the contact form submits at 80.00%; 13 divided by 20 is 0.65, so the quote form submits at 65.00%; 45 divided by 60 is 0.75, so the overall submit rate is 75.00%. The data layer push that carries one of those submits is the standard form:
dataLayer.push({
event: "form_submit",
form_id: "contact-form",
form_name: "Contact us",
form_destination: "/thank-you",
form_submit_text: "Send message"
});
The trace
- Push the submit to the data layer in the submit handler. When the form is submitted, run the push above with each value set to the real one. The event name is
form_submit, exactly as Google spells it, and the parameter names areform_id,form_name,form_destination, andform_submit_text. - Create the four data layer variables. In Tag Manager, go to Variables, then in User-Defined Variables create one Data Layer Variable per parameter:
DLV - form_id,DLV - form_name,DLV - form_destination, andDLV - form_submit_text, each with the matching Data Layer Variable Name. - Add the GA4 Event tag. Go to Tags, then click New. Name it
GA4 - form_submit. In Tag Configuration, choose tag type Google Analytics: GA4 Event. Enter your Measurement ID. In Event Name, enterform_submit. Under Event Parameters, add four rows, one per parameter, each with its matching data layer variable. - Set the trigger. In Triggering, click the trigger box and choose New, then choose trigger type Custom Event. Set Event Name to
form_submitand choose All Custom Events. Click Save, then Save the tag. - Check it in Preview and DebugView. Click Preview, enter the site URL, and click Connect. Submit the contact form. In Tag Assistant, the
form_submitevent must appear in the left panel with the tag under Tags Fired. Then open DebugView (Admin, then Data display, then DebugView) and confirm the event shows with all four parameters set, includingform_idcontact-form. - Publish it as a version. Click Submit at the top right, select Publish and Create Version, name the version, and click Publish.
Dead ends
DEAD END — THE SUBMIT COUNTS A FAILED FORM. A submit that fails validation is a form_start that never became a submit. If the push runs before validation, the report counts every failed attempt as a submission. The push runs after the form passes validation.
DEAD END — FORM_ID IS THE PAGE URL. Two forms on one page then share one form_id, and the report cannot tell them apart. The form_id is the identifier of the form itself, not the page it sits on.
DEAD END — FORM_SUBMIT_TEXT IS FREE TEXT FROM THE VISITOR. The submit text is the label on the button — Send message — not anything the visitor typed. A value that carries visitor input can carry personal data into GA4, which breaks Google's terms.
End state
One tag, one trigger, four parameters. A submit shows in DebugView within a minute of the test, in Realtime within minutes of publishing, and in the Events report within 24 hours, with the submit rate visible per form_id. The submit rate needs the form_start count as well — the start event is the other half of the same funnel, and it is built the same way, with the event name form_start and no prescribed parameters.
Sources
- Analytics Help — [GA4] Recommended events — form_submit is a recommended event; it is sent when a user submits a form
- Google Analytics developer documentation — GA4 event reference — the form_submit event and its prescribed parameters, form_id, form_name, form_destination, and form_submit_text
- Tag Manager Help — Set up Google Analytics events in Tag Manager — the GA4 Event tag, the Measurement ID, the event name, the trigger, and Preview verification
- Analytics Help — Monitor events in DebugView — Admin, then Data display, then DebugView
Checked 11 November 2026. The click paths above are the ones in Google's help and developer pages, opened 11 November 2026. No step in this guide was run inside a live Analytics property or a live Tag Manager container, because both need a Google sign-in and this site does not sign in as anyone. What was run: the container fragment was validated structurally in Python 3.12.3 — export format version 2, unique IDs, the tag's firing trigger resolves to the Custom Event trigger in the file, and all four data layer variable references exist as variables — and the worked example was recomputed: 40 + 20 = 60 starts; 32 + 13 = 45 submits; 32 / 40 = 80.00%, 13 / 20 = 65.00%, 45 / 60 = 75.00% submit rates. Google moves menu items without warning; if a path on this page no longer matches, the linked help page is the current map.