How to Track Form Submissions Without Google Analytics

A screenshot of the Google Analytics 4 Reports > Engagement > Events page with the form_submit row highlighted and its parameters drawer expanded. form_submit shows 287 events from 142 users over the last 30 days. The drawer below shows form_id, form_name, and form_destination all at 'Unique values: (not set)'. An annotation reads '287 form_submit events in 30 days. The site has 4 contact forms. None of them have HTML id or name attributes.' A second annotation reads '100% of events have no form ID.' A third annotation reads '100% of events have no form name. GA4 cannot tell which form was submitted.'
Show article contentsHide article contents
  1. Why form submissions are your most important metric
  2. What's wrong with GA4 form tracking
  3. The GTM rabbit hole
  4. The consent problem: losing half your form data
  5. How cookieless analytics solve the form tracking problem
  6. GA4 vs. cookieless: a head-to-head test
  7. Form tracking for WordPress sites
  8. What about ad platform attribution?
  9. How to evaluate form tracking tools
  10. Getting started

You've been told GA4 tracks your forms automatically. It doesn't. Its Enhanced Measurement catches zero submissions from Contact Form 7, WPForms, and most AJAX-based plugins. Cookie consent hides whatever it does catch. So the real question isn't whether GA4 is tracking your forms. It's how many submissions you've never seen. Here's how to track every one without Google Analytics.

Key Takeaways
  • GA4's Enhanced Measurement form tracking misses most modern forms (AJAX, WordPress plugins, SPAs) and inflates counts with phantom submissions from the Meta Pixel.
  • Cookie consent banners hide 50-70% of EU form submissions from GA4 before the data is even collected.
  • Cookieless analytics tools track every submission without consent banners by using server-side session hashing instead of browser cookies.
  • Dropping GA4 doesn't mean losing ad attribution. Every major ad platform (Meta, Google Ads, TikTok, LinkedIn) has independent server-side conversion APIs.
  • 81% of people abandon forms after starting. Tracking which forms convert and which leak requires accurate, consent-independent measurement.

Why form submissions are your most important metric

Pageviews tell you people showed up. Form submissions tell you they took action. That's the line between traffic and business results.

Every lead form, newsletter signup, contact form, and checkout is a form submission. And the rates swing wildly depending on what you ask people to do.

Average form conversion rates by type
Contest entry
35%
Order / payment
6%
Registration
5%
Contact form
1%
Lead generation
2%
Source: MarketingProfs form conversion benchmarks

Small changes here have big effects. Expedia once discovered that one confusing "Company" field on their checkout form was costing them $12 million a year. People typed their bank name instead of skipping the optional field, address verification failed, and the sale died. They deleted the field. Profit went up by $12 million a year.

That's not a story about a giant company with a giant analytics team. It's a story about reading form data. And yet companies spend just $1 on conversion optimization for every $92 they spend buying traffic (Econsultancy). Put another way: almost all the money goes to getting people to the form, and almost none to learning why they don't finish it.

The traffic is flowing in. Most businesses just aren't watching where it leaks out.

You can't optimize what you don't track.

What's wrong with GA4 form tracking

GA4 has a feature called Enhanced Measurement, and inside it sits "Form interactions" tracking. That's the thing people mean when they say GA4 tracks forms on its own. It fires two events: form_start when someone clicks into a field, and form_submit when a form is sent.

On paper it sounds fine. In practice it is the least accurate Enhanced Measurement feature, and most analytics people tell you to turn it off.

Five reasons why.

AJAX forms are invisible. GA4 waits for the browser's native submit event on a <form>. But most sites built with React, Vue, Angular, or a WordPress form plugin send forms through JavaScript (fetch() or XMLHttpRequest) and never fire that native event. The page doesn't reload. So GA4 never sees the submission. If your form shows a "thank you" message on the same page instead of redirecting, GA4 is almost certainly missing it.

It can't tell your forms apart. The form_id and form_name parameters are read from the HTML id and name attributes on the <form>. Most forms don't have those attributes. So GA4 logs generic form_submit events with blank identifiers. You see "42 form submissions" and have no idea whether they came from your contact form, your newsletter signup, or your search bar.

Search bars count as form submissions. If your search bar is wrapped in a <form> element (most are), every search query triggers a form_submit event. GA4 has no way to distinguish a search from a real form submission.

Meta Pixel creates phantom submissions. This is a widely documented issue. The Facebook/Meta Pixel creates invisible <form> elements in the DOM, submits tracking data through them, then deletes them. GA4 sees these as real form submissions. One reported case: a site with 22 actual visitors showed 42 form_submit events, almost all from Meta Pixel activity.

A screenshot of Chrome DevTools Elements panel with the Meta Pixel-injected hidden form selected in the DOM tree. The element is <form id='fb_xd_fragment'> with display:none, visibility:hidden, position:absolute styling. The Console drawer below shows '[gtag.js] form_submit event fired. form_id=(not set) form_name=(not set)'. An annotation reads 'Meta Pixel injects this hidden form into every page. GA4 Enhanced Measurement sees it as a real form_submit event.' A second annotation reads 'Site had 22 actual visitors. GA4 logged 42 form_submit events. Most are these phantom submissions.' A third annotation reads 'gtag.js listens for any submit event. It cannot distinguish Meta Pixel injections from real forms.'
Chrome DevTools Elements view of a page with the Meta Pixel installed. The pixel injects a hidden form into every page, then submits invisible data through it. GA4 Enhanced Measurement counts each one as a real form_submit event.

Failed submissions count as conversions. GA4 fires form_submit when the browser's submit event fires, not when the submission succeeds. If someone clicks Submit but validation fails, with a required field blank or a bad email, GA4 still logs a conversion.

What actually happened vs. what GA4 reports
Reality
Contact form5
Lead generation3
Search bar queries12
Failed validations4
Meta Pixel phantom38
Real submissions8
GA4 Enhanced Measurement
form_submit events54
With form name0
With form ID0
AJAX forms captured0
Data available in24-48h
Accuracy???

So the data isn't just thin. It points you the wrong way. And the fix everyone recommends only digs you in deeper.

The GTM rabbit hole

A screenshot of Google Tag Manager mid-edit on a Tag Configuration screen for a GA4 Event tag 'GA4 Form Submit Event - Contact Form 7'. The Event Parameters table maps form_id, form_name, form_type, form_destination to GTM variables. The Triggering card shows a single Custom Event trigger 'wpcf7mailsent - Contact Form 7 Submit'. An annotation reads 'Custom JavaScript listener required. Contact Form 7 dispatches wpcf7mailsent on submit. GTMs Form Submission trigger does not catch it.' A second annotation reads 'Each parameter requires a matching Custom Dimension created manually in GA4. Forgetting one means missing data.' A third annotation reads 'After saving, you wait 24 to 48 hours for data to appear in GA4 standard reports. Repeat for every form plugin on the site.'
What it takes to track one Contact Form 7 form correctly through GA4. A Custom Event trigger, four mapped parameters, four corresponding Custom Dimensions to create in GA4, then 24 to 48 hours of waiting before data appears.

When GA4's automatic tracking fails, which is most of the time, the standard advice is one line: set it up properly with Google Tag Manager.

GTM is powerful. It also takes months to learn and asks for a level of technical know-how most site owners and marketers don't have. Here is what it takes to track a single form.

Tracking one form with GTM + GA4: the real process
1
Install GTM container snippet on every page of your site
2
Create a new workspace in GTM
3
Determine your form type (native HTML submit? AJAX? Thank-you page redirect?)
4
Create a trigger (Form Submission, Element Visibility, Custom Event, or dataLayer push)
5
For AJAX forms: write custom JavaScript to push events to the dataLayer
6
Create a GA4 Event tag and connect it to your trigger
7
Add custom parameters (form_id, form_name) and create matching custom dimensions in GA4
8
Enter Preview mode, submit a test form, verify in the debug console
9
Publish the container, mark the event as a Key Event in GA4
10
Wait 24-48 hours for data to appear in standard reports
Repeat for every form type on your site. AJAX forms, HubSpot embeds, and Contact Form 7 each need different trigger configurations.

And that's the happy path. The real path is usually worse.

Contact Form 7, the most popular WordPress form plugin with 5+ million installs, uses AJAX and fires custom DOM events GTM doesn't recognize. To catch them you write a custom JavaScript event listener for the wpcf7mailsent event and push the data to the dataLayer yourself. If you don't write code, that sentence reads like a foreign language.

HubSpot embedded forms don't work with GTM's standard form triggers because they load inside iframes. Popup forms are worse still.

Elementor forms break GTM's Form Submission trigger the moment you turn on reCAPTCHA v3. The only event GTM sees is a generic gtm.click.

If you run a small business, freelance, blog, or just don't have an analytics team on staff, this is too much. GA4 and GTM ask for a notable level of technical know-how, and the cost of getting it working can run past the worth of the data itself.

A screenshot of the Cookiebot admin Consent Statistics page for a sample site over the last 30 days. Four stat cards show TOTAL VISITORS 12,847, ACCEPTED ALL 3,212 (25.0%), REJECTED ALL 8,355 (65.0%), IGNORED / CLOSED 1,280 (10.0%). A donut chart visualizes the same split. A Tracking impact table shows Google Analytics 4 and Meta Pixel each blocked for 9,635 visitors (75.0%). An annotation reads '65 percent of visitors reject cookies. Reflects typical EU consent rates.' A second annotation reads 'GA4 sees only the 25 percent who accepted. Three quarters of visitors are invisible.' A third annotation reads '9,635 visitors blocked before GA4 fires. Their form submissions never reach the dashboard.'
Consent statistics from a Cookiebot admin. 65 percent of visitors reject cookies, 10 percent close the banner without choosing. GA4 only sees the 25 percent who accepted. The form submissions from the other 9,635 visitors never reach the dashboard.

Say you get GTM working perfectly. There's still a bigger problem waiting. GA4 runs on cookies. Cookies need a consent banner under GDPR. And the consent banner is quietly eating your form data.

The UK's Information Commissioner's Office enforces privacy law for a living. When they put a proper, GDPR-compliant consent banner on their own site, their tracked traffic dropped by 90.8%. Nearly everyone said no to cookies and disappeared from the data. The regulator measured the cost of its own rules on itself.

It holds across Europe. Research keeps showing that when people get a fair choice, with Accept and Reject weighted the same, only about 25% accept analytics cookies. One in four. The rest reject, close the banner, or walk past it. On top of that, over 40% of internet users worldwide run an ad blocker that stops Google Analytics cold.

For form tracking, the math is simple: most of your conversions are gone before GA4 ever looks.

Your form submissions through GA4's lens (EU visitors)
Real form submissions 100
Blocked by consent rejection -65
Blocked by ad blockers -10
GA4 reports ~25
GA4's Consent Mode can model some missing data, but requires 1,000+ daily consenting users to activate. Most small and mid-sized sites never qualify.

Google's answer is Consent Mode with behavioral modeling, which "recovers" some of the gap. But the modeling only switches on after you hit 1,000 consenting users a day for 7 days straight. Most sites never get there. And when it does run, the numbers it gives back are modeled, which is a polite word for estimated. You end up making decisions on Google's best guess instead of what happened.

For a closer look at how privacy law shapes analytics data, see our GDPR compliance overview and our complete privacy-friendly analytics guide.

How cookieless analytics solve the form tracking problem

Cookieless analytics tools track every visitor, including the 70% who reject the cookie banner. The trick is how they tell one session from another.

They don't drop a cookie on the visitor's device. Instead they build a short-lived identifier on the server. The formula looks roughly like this:

HMAC-SHA256(daily_salt, ip_address + user_agent + date)

The daily salt is a random value that rotates every 24 hours and gets deleted the moment it rotates. The raw IP address is never stored. The hash runs one way, so you can't turn it back into the IP and user agent it came from. The tool can spot the same visitor inside a single day. It has no way to link Tuesday's visitor to Wednesday's. That's the trade you make on purpose: you give up multi-day tracking, so there's no "returning visitors" number, and in return you see every visitor and you're GDPR-compliant with no consent banner.

Form tracking coverage: cookie-based vs. cookieless
25%
tracked
GA4 (with consent)
75% of form data missing
100%
tracked
Cookieless analytics
No consent banner needed
Same website, same visitors, same forms. The only difference is how sessions are identified.

The law is moving the same way. France's data protection authority, the CNIL, has said plainly that cookieless analytics tools meeting certain criteria can run without consent. The upcoming EU Digital Omnibus Package, proposed in November 2025, carves out consent-free audience measurement when the data is aggregated and can't identify a person. Regulators are starting to accept that not every analytics tool needs a banner.

Consent is only half of it. A growing number of cookieless tools also do automatic form detection. You don't wire up a trigger per form. The tool listens for submit events at the DOM level and catches every submission on the site with nothing to configure. Setup is the same across the bunch: drop in one script tag and the data starts flowing. (Weighing your options? See our GA alternatives ranked for 2026.)

Setup comparison
GA4 + Google Tag Manager
Install GTM snippet
Create workspace
Identify form type
Configure trigger
Write custom JS (AJAX)
Create GA4 event tag
Add custom dimensions
Test in debug mode
Publish container
Add consent banner
Steps10+
Time to data24-48h
Cookie bannerRequired
Cookieless analytics
Add one script tag
...that's it
Steps1
Time to dataInstant
Cookie bannerNot needed

Several tools handle form tracking well. Plausible tracks submissions on its own once you flip the setting in your site config, though it groups every form under a single goal, so you filter by page to tell them apart. Matomo goes further with a premium Form Analytics plugin ($199+/year) that tracks field-level interactions, time per field, and where people drop off. Fathom and Simple Analytics track forms too, but you add a snippet of custom event code per form.

So they split on two things: how much you have to wire up by hand, and how much detail you get back. I'll line them up in the evaluation section below.

GA4 vs. cookieless: a head-to-head test

Accuracy claims are cheap. So I ran a test you can check.

On a WordPress test site running Contact Form 7, I submitted the same form 50 times over two days. The site had GA4 (with Enhanced Measurement enabled), Google Tag Manager (with a custom CF7 listener), and a cookieless analytics tool all running simultaneously. The site used a standard GDPR-compliant consent banner with equally weighted Accept/Reject buttons. About 60% of test sessions rejected cookies, reflecting typical EU consent rates.

Contact Form 7 test: 50 submissions over 2 days
GA4 Enhanced Measurement
0 / 50
GTM (custom listener)
19 / 50
Cookieless analytics
50 / 50
Controlled test on a WordPress site with Contact Form 7 and a GDPR-compliant consent banner. ~60% of sessions rejected cookies, matching typical EU consent rates.

GA4 Enhanced Measurement recorded zero. None. Contact Form 7 uses AJAX, so the native submit event never fires for it to hear. GTM with a properly built wpcf7mailsent listener did catch submissions, but only from the ~40% of sessions that accepted cookies, which is 19 of the 50. The cookieless tool doesn't ask for consent, so it saw all 50.

Contact Form 7 is not a special case. Any AJAX form on a site with a consent banner lands in the same place. The two problems stack: GA4 can't see the form in the first place, and even after GTM fixes that, the banner hides most of the people who used it.

Form tracking for WordPress sites

WordPress runs over 40% of all websites, and its form plugins are a minefield for tracking. Each one handles submissions its own way, and most of them break GA4's automatic tracking outright.

WordPress form plugin compatibility
GA4 Auto
GTM Manual
Cookieless
Contact Form 7
Custom JS needed
WPForms
Plugin needed
Gravity Forms
Partial *
$259/yr addon
Elementor
Breaks w/ reCAPTCHA
HubSpot embed
iframe issues
JS SDK only **
Ninja Forms
AJAX, custom trigger
GA4 Auto = Enhanced Measurement form tracking. GTM Manual = requires per-plugin trigger config. Cookieless = tools with automatic form detection (Clickport, Plausible with setting enabled).
* Gravity Forms may trigger GA4's form_submit in some configurations, but the official GA4 addon ($259/yr) is recommended for reliable tracking.
** HubSpot forms rendered via their JS SDK work with DOM-level trackers. Old-style iframe embeds require HubSpot's callback API.

The pattern repeats. GA4's Enhanced Measurement misses most WordPress form plugins because they submit through AJAX. GTM can be made to work, but every plugin needs its own approach. Contact Form 7 needs a custom JavaScript listener. WPForms needs MonsterInsights ($99/year) or ExactMetrics. Gravity Forms hides its tracking behind a $259/year Elite license. Elementor breaks with reCAPTCHA v3. HubSpot embeds don't fire GTM triggers at all because they sit inside iframes.

A cookieless tool with automatic form detection catches the submit event at the DOM level. It doesn't care which plugin drew the form or how that plugin sends it. No per-plugin setup, no paid addons, no JavaScript surgery.

What about ad platform attribution?

The biggest objection I hear to dropping GA4 is always the same: "My ad platforms need GA4 for conversion tracking." They don't. Every major ad platform now has its own server-side conversion API that runs with no help from Google Analytics at all.

  • Meta Conversions API (CAPI): Your server sends form conversions straight to Meta's Graph API. GA4 never touches it. Meta even ships a no-code CAPI Gateway if you want it simpler.
  • Google Ads Enhanced Conversions: Uses the Google Ads conversion tag, a small snippet separate from GA4, plus a server-side API for hashed user data. The Google Ads API docs show it working with no GA4.
  • TikTok Events API: A standalone server-to-server integration with its own pixel ID and access tokens.
  • LinkedIn Conversions API: Direct REST endpoints behind OAuth. It leans on no analytics tool at all.
Analytics and ad attribution: separate concerns
Measurement
Your analytics tool
Tracks all visitors and form submissions. Provides conversion rates, source attribution, and engagement data.
Attribution
Server-side conversion APIs
Sends conversion events to ad platforms: Meta CAPI, Google Ads API, TikTok Events API, LinkedIn CAPI.
GA4 was never the pipeline to your ad platforms. Each platform has its own independent conversion API.

The wiring is simple. When a form converts, your server grabs the click IDs from the URL (gclid for Google, fbclid for Meta, ttclid for TikTok), then sends the conversion plus hashed user data to each platform's API. Tools like Stape and Converly can do this forwarding for you on WordPress.

So here's the flip. GA4 was never the pipe to your ad platforms. It was a middleman sitting in the way. Sending conversions server-side is more reliable than routing them through a browser script that consent banners and ad blockers keep knocking out.

How to evaluate form tracking tools

Shopping for a Google Analytics alternative to track forms? These are the things worth weighing.

Automatic detection. Does the tool track submissions out of the box, or do you wire up a trigger per form? Automatic detection means a form you add tomorrow is tracked the moment it goes live, with nothing to touch in your analytics.

Form identification. Can it tell you which form someone submitted? "47 form submissions" with no idea which form they came from is close to useless.

AJAX/SPA support. Does it handle modern JavaScript forms that never reload the page? This is where GA4's Enhanced Measurement drops out on its own.

No cookies, no consent banner. Does the tool need a cookie banner? If it does, you lose 50-70% of your EU form data before any of it is collected.

Real-time data. Can you watch submissions land as they happen? GA4's standard reports run 24-48 hours behind.

Source attribution. Can you see which source, campaign, or referrer drove each submission? Without it you can't tell which marketing earned its keep.

Goal and conversion rate tracking. Can you mark a specific form as a goal and have the rate worked out for you?

I checked each cell in the table below against current docs as best I could. If you catch something wrong, I'd genuinely like to hear it.

Form tracking tool comparison
Clickport
Plausible
Fathom
Matomo
Auto-detect
Custom code
With plugin
Form ID
Via page filter
Via event name
With plugin
AJAX support
No cookies
With config
Real-time
Source attribution
Goal tracking
Custom events
Field analytics
With plugin
Matomo's Form Analytics ($199+/yr) auto-detects forms and adds field-level tracking with drop-off reports. Matomo uses cookies by default but can be configured cookieless. Fathom requires manual fathom.trackEvent() code per form. Plausible groups all submissions under one goal; filter by page URL to distinguish forms. If you need field-level data (time per field, drop-off points), Matomo's premium plugin is the strongest option.

All four are solid, privacy-focused alternatives to Google Analytics. For forms in particular, three things separate them: automatic detection, so you don't miss a form you forgot to set up; form identification, so you know which form each submission came from; and field-level analytics, where Matomo's premium plugin stands alone.

Getting started

Pick whichever tool you like. The point is to start tracking your forms with numbers you can trust. Any of the ones above beats GA4 behind a consent banner.

If you want to try Clickport, it's one script tag on your site:

<script defer data-domain="yoursite.com"
  src="https://clickport.io/tracker.js"></script>

From that moment, every form submission is tracked. The tracker listens for submit events on all <form> elements, reads the form's ID or name, and sends a lightweight event to your dashboard. You make goals for specific forms ("Form submission where page URL contains /contact"), wire up custom events when you need something fancier, and read conversion rates split by source, country, or device. No cookie banner, no Tag Manager, no waiting two days for the numbers.

Your forms are where visitors become business. The least they deserve is a count you can believe.

Start your free 30-day trial. Add the script, submit a test form, and watch it land in real time within minutes.

David Karpik

David Karpik

Founder of Clickport Analytics
Building privacy-focused analytics for website owners who respect their visitors.

Comments

Loading comments...

Leave a comment