How to track form submissions

A click is not a lead.Count the ones that arrived.

To track form submissions, count one of three things: the thank-you page the form sends people to, an event your page fires when the form confirms it was sent, or the form tool’s own record of entries. Then mark that page view or event as a key event in GA4, import it into Google Ads, or make it a goal in Builderify. GA4’s automatic form tracking is a start, not an answer: Google only says it fires “when the user submits a form”, so check it against real entries first. The picker below gives the method for your form tool, with the code.

10 form tools · 3 places to count docs checked 29 October 2026

By the Builderify team

01 A thank-you page URL 02 A success event 03 The tool’s own log
01 / Three methods

What counts as a form submission?
The entry, not the click.

Form submission tracking is only as good as the moment it counts. A click on Send happens before anything is checked. The browser’s submit happens before your form tool has said yes. Only three things happen after the entry was accepted, so count one of those.

01

A thank-you page URL

The form sends people to its own page once it has accepted the entry, and you count visits to that page.

Good for
Any form that can redirect. No code, and every analytics tool records page views.
The catch
Reloads, bookmarks and search visits count too, so the page needs a noindex and no menu link.

The thank-you page guide covers the redirect setting on each builder.

02 Most forms

An event on success

Your page listens for the form tool’s own success event and sends one event or goal from it.

Good for
Forms that thank people on the same page, embedded forms, and anything you want to tell apart by form.
The catch
Needs a snippet on your site, and each tool names its event differently. The picker below has them.

Chapter 04 lists each tool’s event, with its docs.

03

The tool’s own log

The entries table in your form tool, your inbox, or your list of leads.

Good for
The true number. It is what the other two should match.
The catch
It doesn’t know which channel or campaign sent the person, so on its own it can’t tell you what to spend more on.

Use it to check the other count each week.

Why not count the Send button? Because people press it with a field empty, twice in a row, or just before the form says no. A click goal is right for a button that does one thing, which the guide to tracking button clicks covers. A form needs the moment after it has said yes.

Entries not arriving at all? That is a delivery problem, not a tracking one, and no analytics tool will fix it. On WordPress, start with why a contact form stops sending email, then come back and count.

02 / In GA4

How to track form submissions in Google Analytics 4
Three ways in, one key event out.

GA4 can count a form by itself, through Google Tag Manager, or from an event your page sends. Whichever you use, the count only becomes a conversion once you mark the event as a key event. Google renamed GA4’s conversions to key events; “conversion” now means an action used to measure ad campaigns.Google

Automatic

Enhanced measurement: form interactions

Turn it on in Admin, Data streams, your web stream, Enhanced measurement, where Form interactions is one of the options under the settings icon. Google lists two events: form_start, “the first time a user interacts with a form in a session”, and form_submit, “when the user submits a form”, with the form’s ID, name, destination and button text.Google Those parameters only show in reports once you create custom dimensions for them.

Google’s description stops there. It doesn’t say whether form_submit waits for your form to accept the entry, or which forms it can’t see. A tag on your page can’t see inside a form embedded from another site, such as a Typeform. So test it before you trust it: send one entry with a required field empty and one real one, and count the form_submit events that arrive.

Google Tag Manager

A Form Submission trigger, or a custom event

In Tag Manager, Triggers, New, then the Form Submission trigger type. Tick Check Validation so it fires “only if the form is successfully sent”; without it, it fires whenever someone attempts to submit. Google suggests limiting it to Some Forms with a condition, such as the page URL.Google Then fire a GA4 event tag named generate_lead on that trigger.

For forms that send by script and thank people on the same page, push your own event from the tool’s success event, dataLayer.push({ event: 'form_sent' }), and use a Custom Event trigger with that exact name.Google

From your page

A generate_lead event from the success event

generate_lead is Google’s recommended event for when a user “submits a form or a request for information”.Google Sending it with gtag('event', 'generate_lead') from the form tool’s success event is the most exact of the three, because it fires only after the form has said yes. The picker in chapter 03 writes the snippet for your tool.

Using a thank-you page instead? Google’s own tutorial makes generate_lead from the page’s page_view, with no code.Google

Mark it as a key event

Once the event arrives, it needs one more switch to count as a conversion in your reports and to be importable into Google Ads.

  1. 01
    Find the event

    Admin, Data display, Events. Once GA4 has received it, the event is under Recent events.

  2. 02
    Star it

    Click the star next to it to mark it as a key event; you need Editor access or above. Not received yet? Under Key events, click New key event and enter the exact name.

  3. 03
    Allow for the delay

    Google says it can take up to 24 hours to show in standard reports, and it counts from then on, not backwards. A standard property can have up to 30 key events.Google

03 / Method picker

Your form tool, where you count it,
and the code that joins them.

Pick the tool that runs your form and where you want the count. You get the method that works for that pair, three steps, the snippet or setting to copy, and how to test it. Event names were checked against each vendor’s docs on 29 October 2026.

Your form tool
Where you want to count it

Contact Form 7 → GA4

Success event

Listen for Contact Form 7’s wpcf7mailsent event and send a generate_lead event to GA4 only once the form has accepted the entry.

  1. Nothing to change in the form: Contact Form 7 fires wpcf7mailsent when an Ajax submission has completed and the mail has been sent.
  2. GA4 must load on the page through the Google tag (gtag.js). On Google Tag Manager, swap the gtag line for dataLayer.push({ event: 'form_sent' }) and fire a GA4 event tag named generate_lead on a Custom Event trigger. Then mark generate_lead as a key event.
  3. Paste the snippet in your site’s footer with a code snippets plugin or your theme, on every page that has a form.
Snippet
<script>
document.addEventListener('wpcf7mailsent', function (event) {
  // event.detail.contactFormId tells your forms apart
  if (typeof gtag === 'function') {
    gtag('event', 'generate_lead', { form_name: 'contact' });
  }
}, false);
</script>

Test it: Send one real entry from a private window, then look for generate_lead in GA4’s Realtime report, on the Key events by Event name card. With debug mode on, DebugView shows it within seconds.

Count wpcf7mailsent, not wpcf7submit: wpcf7submit fires on every completed Ajax submission, including ones with invalid fields or a failed mail.

Docs: Contact Form 7: DOM events

Replace the placeholders in capitals with your own IDs, and the event and goal names with ones you will recognise later. Put the snippet on the pages that have the form, after GA4 or the Builderify script tag has loaded.

04 / Form by form

Form submission tracking for each form tool

Every form tool says “sent” in its own way. Some fire an event on the page, some only redirect, and some do both. Here is what each one documents, so you count the right moment.

Squarespace, Wix and Webflow redirect settings, and how to keep the thank-you page out of search, are in the guide to tracking conversions by URL.

Contact Form 7: wpcf7mailsent

Listen for wpcf7mailsent on the document. Contact Form 7 fires it when an Ajax submission has completed and the mail has been sent; event.detail.contactFormId tells your forms apart.CF7 Its siblings are the ones not to count: wpcf7invalid (fields failed validation), wpcf7mailfailed (the mail did not send) and wpcf7submit, which fires whatever happened.

WPForms: wpformsAjaxSubmitSuccess

Switch on Ajax submission, then listen for wpformsAjaxSubmitSuccess with jQuery. WPForms’ own example binds it to the form and says it only works with “Enable AJAX form submission” ticked on the General tab of the form’s settings.WPForms Without Ajax, set the confirmation to Show Page or Go to URL (Redirect) and count the page.WPForms

Gravity Forms: gform_confirmation_loaded

On an Ajax form, gform_confirmation_loaded fires when the confirmation message shows, with the form’s ID. Gravity Forms documents it as a jQuery event bound to the document.Gravity Forms A confirmation of type Page or Redirect (Form Settings, Confirmations) sends people to a URL instead, which you count as a page.Gravity Forms

Squarespace: a post-submit redirect

Squarespace’s form block help documents no success event, so redirect to a thank-you page and count that. Edit the block, then in the Content tab, Edit Post-Submit, Redirect. Redirects don’t run while you are logged in, so test logged out. Squarespace also reports a form submission rate in its own form and button conversions analytics.Squarespace

Wix: generate_lead, sent for you

With GA4 connected, Wix sends generate_lead when a lead comes in, so you only mark it as a key event. Wix lists it for Wix Forms, the form in chat and the mobile Quick Action Bar, so it counts more than forms.Wix For Google Ads, Wix publishes custom code that listens for its Lead event through wixDevelopersAnalytics, with your Google tag connected in Wix.Wix Custom code needs a published site with a connected domain.Wix New Wix Forms can also redirect to a URL after submit.Wix

Webflow: a redirect URL

Select the form, open its Settings panel, and choose a page on your site or enter a URL to send people to after they submit. Webflow keeps each submission under Site settings, Forms, which is the number to check your count against.Webflow

HubSpot: hs-form-event:on-submission:success

Forms made in HubSpot’s updated forms editor fire hs-form-event:on-submission:success on the window, with the form’s ID in the event’s detail.HubSpot Legacy forms post a message instead: listen for message events whose data has type hsFormCallback and eventName onFormSubmitted.HubSpot The picker’s snippet listens for both.

Typeform and other embedded forms: onSubmit

An embedded form is out of reach of a tag on your page, so use the callback its embed gives you. Typeform’s embed takes data-tf-on-submit naming a function on your page, or an onSubmit option, and passes the form and response IDs. Typeform says it fires only for successful submissions, not on validation errors or a broken connection.Typeform For any other embedded form, look for the same thing in its embed docs, or its own redirect setting.

06 / With Builderify

Track form submissions in Builderify
its own forms, and everyone else’s.

Builderify’s own forms are counted where they land, and a form from any other tool becomes a goal in User Journey. Both run from one script tag in your site’s head, on WordPress, Shopify, Wix, Squarespace, Webflow, Framer or plain HTML.

Forms built in Builderify

Counted where they land

  • Custom Form Each submission is stored with the form, where you can search, filter and export it as CSV, and logged in your activity feed; the account owners get an email alert. The person joins a lead list only when the form has a ticked consent field and the block has a list set.
  • Contact Form Messages land in your Inbox, so you reply from your own domain.
  • Newsletter and popups Sign-ups go into Leads with the source recorded. A popup can show a success panel, close, or redirect to a thank-you page after submit.

In User Journey, the Uses your widget trigger has a Sends a form goal for custom forms and popup forms, and Leaves their email for sign-ups. Builderify decides them on its servers from what it already recorded, so ad blockers can’t hide them.

Forms from any other tool

Three Journey goals that fit

  • Visits a page Your thank-you page’s path: is, starts with, contains or regex. The most robust choice when the form can redirect.
  • Custom event Call builderify('goal', 'contact_form_sent', { value: 49 }) from the form’s success event; the value is optional. The picker writes it for your tool.
  • Submits a form A CSS selector, optionally on certain pages. It counts when the browser submits the form, before your form tool has accepted or rejected it, and it can’t see forms embedded from another site.

A data-bdf-goal="…" attribute is the no-code custom event, but it fires on a click on that element. On a Send button it counts attempts, so keep it for buttons and use the success event for forms.

The rate you see

A goal’s conversion rate is the people who reached it divided by the unique visitors in the period, not visits. To judge the number, read what a good conversion rate is.

Who sent them

Each goal’s report lists converters by source, next to that source’s own rate. The guide to where your website traffic comes from explains the channels.

What it costs

Each tracked visitor journey is 0.1 credits, and a new lead 1 credit, out of 250 free credits a month with no monthly fee. One-time packs start at $9 and never expire. See pricing.

07 / Test it

How to check your form tracking works
before you report on it.

Send a good entry and a bad one, then compare a week of counts with the form tool’s own log. The two will rarely match exactly: visitors who refuse analytics cookies or block scripts aren’t in GA4. A gap you can explain is fine; a count higher than your entries means something counts twice. Tick them off as you go; the ticks stay in this tab only.

0 of 9 done

Send test entries

Check each place

DebugView lists events from the last 30 minutes, and may miss visits where consent mode is on and the visitor hasn’t agreed to analytics cookies.Google Form submissions are one of the website metrics a small business should track; that guide has the other four.

Questions

Form tracking, before you ask.

Count the moment after the form accepts the entry: either its thank-you page, turned into a generate_lead event from page_view, or a generate_lead event sent from the form tool's own success event. Then mark generate_lead as a key event under Admin, Data display, Events. GA4's automatic form interactions send form_submit, but Google doesn't say which forms it misses, so check it against real entries first.

Usually because it counts a different moment. A click on Send or the browser's submit happens before the form has accepted the entry, so failed attempts count, while forms embedded from another site, such as a Typeform, are invisible to a tag on your page. Visitors who refuse analytics cookies or block scripts are missing too. Count the form's success event or thank-you page, and compare with the form tool's own log.

Listen for the wpcf7mailsent event on the document. Contact Form 7 fires it when an Ajax submission has completed and the mail has been sent, and event.detail.contactFormId tells your forms apart. From it, send a generate_lead event to GA4, a Google Ads conversion or a Builderify goal. Don't count wpcf7submit, which fires whatever the outcome.

If GA4 already counts the form as a key event, link the accounts and import it: in Google Ads, Goals, Summary, Create conversion action, then choose your GA4 property and the event. Otherwise fire a Google Ads conversion with the Google tag from the form's success event. Use one route per form, or each lead counts twice, and allow up to 24 hours for data to appear.

Yes, in two cases. Builderify's own custom forms and popup forms count as a "Sends a form" goal in User Journey with no setup, and a form from another tool that redirects to a thank-you page counts with a "Visits a page" goal. Forms that thank people on the same page need one line from their success event: builderify('goal', 'contact_form_sent').

Stop losing the visitors
you already paid for.

More leads from the traffic you already have, and follow-up that sends itself. Free to start. No card, no monthly fee.