Type something to search...
How to Track Form Submissions in Google Analytics

How to Track Form Submissions in Google Analytics

Forms are how most of the web's meaningful conversions actually happen — sign-ups, inquiries, applications, bookings — and GA4 gives you two layers of tracking for them: an automatic baseline through Enhanced Measurement, and precise custom events for anything the automatic version can't capture well enough. Knowing when each applies saves you from either under-tracking a business-critical form or over-engineering tracking for a form that didn't need it.

What Enhanced Measurement Gives You Automatically

If Enhanced Measurement is enabled (the default for new data streams), GA4 automatically tracks two form-related events without any custom code:

  • form_start — fires the first time a user interacts with any field in a form on the page.
  • form_submit — fires when a form is submitted.

These come with parameters like form_id, form_name, and form_destination, derived automatically from the form's HTML. This is genuinely useful as a baseline — you get form interaction data for every form on your site without writing anything — but it has real limitations: it can't tell you whether the submission actually succeeded on the backend, and it treats every form on the site somewhat generically.

Why Automatic Tracking Isn't Always Enough

The critical gap: form_submit fires the moment the browser submits the form, regardless of whether your backend accepts it. A failed validation, a server error, or a rejected submission still counts as a form_submit under Enhanced Measurement. For a low-stakes newsletter form, that's a minor imprecision. For a high-value lead or purchase-adjacent form, it can meaningfully overstate your actual conversion count.

Building a Custom, Success-Verified Event

For any form where accuracy matters, fire your own event only after confirming a successful backend response:

document.querySelector("#lead-form").addEventListener("submit", async (e) => {
  e.preventDefault();
  const form = e.target;
  const formData = new FormData(form);

  try {
    const response = await fetch("/api/leads", {
      method: "POST",
      body: formData,
    });

    if (response.ok) {
      gtag("event", "generate_lead", {
        form_name: form.dataset.formName || "unknown",
        form_location: form.dataset.formLocation || "unknown",
      });
      form.reset();
      showSuccessMessage();
    } else {
      showErrorMessage("Something went wrong. Please try again.");
    }
  } catch (error) {
    showErrorMessage("Network error. Please try again.");
  }
});

This pattern guarantees the event only fires on a genuinely successful submission, giving you a trustworthy conversion signal rather than a rough approximation.

Tracking Multi-Step Forms

For forms broken into multiple steps (a common pattern for longer applications or quote requests), track each step distinctly so you can build a funnel and identify exactly where people abandon:

function trackFormStep(stepNumber, stepName) {
  gtag("event", "form_step", {
    form_name: "quote_request",
    step_number: stepNumber,
    step_name: stepName,
  });
}

trackFormStep(1, "contact_info");
trackFormStep(2, "project_details");
trackFormStep(3, "budget_range");

Then, on final successful submission:

gtag("event", "form_completed", {
  form_name: "quote_request",
  total_steps: 3,
});

With this in place, a Funnel exploration in GA4 (steps: form_step at step 1 → step 2 → step 3 → form_completed) shows exactly where in a multi-step form people give up, which is far more actionable than a single "form submitted or not" signal.

Implementing via Google Tag Manager

If you'd rather manage this without touching site JavaScript directly:

  1. Enable Form Submission as a trigger type under Variables → Configure.
  2. Create a Form Submission trigger scoped to your specific form (by ID or CSS selector).
  3. Create a GA4 Event tag with your chosen event name, firing on this trigger.

As with the manual approach, be aware GTM's native form trigger fires on the browser-level submit action, not necessarily on confirmed backend success — test with a deliberately invalid submission to understand exactly what your specific form setup actually captures.

Handling Third-Party Embedded Forms

Forms embedded from third-party tools (Typeform, HubSpot forms, Calendly booking forms) often don't expose a submit event you can hook into directly, since they run inside an iframe or their own isolated script context. Common approaches:

  • Listen for postMessage events, if the embed provider sends one on completion (many do — check their documentation for an event name or message schema).
  • Use the provider's own redirect or thank-you-page mechanism, falling back to page-view-based tracking on a dedicated confirmation URL if no in-page event is available.
  • Check for a provider-specific GTM template in the GTM template gallery, which sometimes handles this integration for you.

Verifying Everything in DebugView

Regardless of implementation method, confirm the final result in Admin → DebugView:

  1. Submit a real test entry through the form.
  2. Confirm the expected event (generate_lead, form_completed, or whatever you named it) fires with the correct parameters.
  3. Deliberately submit an invalid entry (if your form has validation) and confirm the event does not fire for the rejected submission, if you built your tracking around confirmed success.

Marking the Right Events as Conversions

Once verified, mark whichever event represents genuine completion — not the intermediate step events — as a conversion under Admin → Events. For multi-step forms, that's your final form_completed-style event, not the individual form_step events, which are useful for funnel analysis but shouldn't inflate your conversion count on their own.

Reporting on Form Performance by Page

Once your form event is live across multiple pages (a footer contact form, a dedicated contact page form, an inline blog CTA form), build a quick Exploration comparing performance by placement:

  1. Add Form location (your registered custom dimension) as a dimension.
  2. Add Event count (for generate_lead or your chosen event name) and Conversions as metrics.
  3. Compare which placement actually produces the most submissions relative to how much traffic sees it.

This often reveals a form placement that looks unremarkable in raw pageviews driving disproportionately more submissions per view than a more prominent one — useful evidence for deciding where to invest further design or copy effort.

FAQ about Tracking Form Submissions in Google Analytics

faq

Does GA4 track form submissions without any setup at all?

Yes, via Enhanced Measurement's automatic form_start and form_submit events, though these don't confirm actual backend success — just that a submit action occurred in the browser.

When should I build a custom form tracking event instead of relying on the automatic one?

Whenever the form represents meaningful business value (a lead, a purchase-adjacent action) where you need confidence the submission actually succeeded, not just that a submit button was clicked.

Can I track how far someone gets through a multi-step form before abandoning?

Yes — track each step as its own event with a step number and name, then use Funnel exploration to visualize completion and drop-off at each stage.

How do I track a form that's embedded from a third-party tool like Typeform?

Look for a postMessage event the embed sends on completion, a provider-specific GTM template, or fall back to page-view tracking on a dedicated thank-you page if no in-page event is available.

Should every form on my site be tracked as a conversion?

No — reserve conversion marking for forms representing genuine business value; track lower-priority forms as regular events for engagement analysis without necessarily marking them as conversions.

What's the most common mistake in form submission tracking?

Relying solely on the automatic form_submit event for a high-value form, which counts failed and rejected submissions the same as successful ones, overstating your real conversion rate.

Conclusion

Form tracking in Google Analytics works well as an automatic baseline, but any form that actually matters to your business deserves a custom event confirmed against real backend success. Build it deliberately, verify it in DebugView, and mark only genuine completions as conversions so your website's lead and signup data stays trustworthy.

Tags :
Share :

Related Posts

A Beginner's Guide to the GA4 Interface

A Beginner's Guide to the GA4 Interface

If you opened Google Analytics 4 for the first time and felt a little lost, you're not alone. GA4 looks nothing like the old Universal Analytics inte

Continue Reading
A Deep Dive into the Next Generation of Google Analytics

A Deep Dive into the Next Generation of Google Analytics

Google Analytics has long been a staple tool for countless businesses, enabling them to track, measure, and analyze data to gain insightful feedback

Continue Reading
A Practical Guide to Custom Events in Google Analytics 4

A Practical Guide to Custom Events in Google Analytics 4

GA4's automatic and Enhanced Measurement events cover a lot of ground, but sooner or later almost every site needs to track something specific to its

Continue Reading