Why Form Submission Tracking Goes Wrong
Form submission is the most common conversion action in Google Ads lead generation campaigns. It is also one of the most frequently misconfigured. When your tracking counts spam submissions, bot fills, internal test submissions, or the thank-you page as a conversion, your data becomes unreliable — and Smart Bidding starts optimising for the wrong audience.
This guide covers how to set up accurate form submission tracking as part of a proper Google Ads conversion tracking setup — including the filters that keep spam and internal traffic out of your data.
The Two Core Methods
Method 1: Thank-You Page Conversion (Simplest)
After a successful form submission, redirect the user to a dedicated confirmation URL (e.g. /thank-you or /contact-received). Fire a Google Ads conversion tag on that page.
Pros: Easy to set up, works with any form builder, no JavaScript needed beyond the tag.
Cons: Users can navigate directly to the thank-you page without submitting. Refreshing the page re-counts as a conversion. The URL must be unique and only reachable via the form flow.
Mitigation: Add a server-side check — only serve the thank-you page with a 200 status after a successful POST submission. Return a redirect to the form for anyone accessing it directly.
Method 2: Form Submit Event (Most Accurate)
Rather than firing on a page view, fire the conversion tag when the form's submit event is confirmed by your server. This requires a data layer push after successful submission.
Your form handler on the server processes the submission, then on success sends a JavaScript response that triggers:
dataLayer.push({
event: "form_submission_confirmed",
form_type: "contact",
form_id: "main-contact-form"
});
In Google Tag Manager, create a Custom Event trigger for form_submission_confirmed and attach your Google Ads Conversion Tracking tag to it.
This approach only fires when the server has actually received and stored the submission — not just when the user clicks Submit.
Filtering Out Spam Submissions
1. Honeypot Fields
Add a hidden field to your form that real users never see or fill in. Bots that auto-fill all fields will populate it. On your server, reject any submission where the honeypot field is not empty.
<!-- Hidden from real users via CSS: display:none -->
<input type="text" name="website_url" tabindex="-1" autocomplete="off">
If the honeypot is filled, do not redirect to the thank-you page and do not fire the data layer event. No conversion fires. Simple and effective against basic bots.
2. Server-Side Validation Before Firing
Only trigger the conversion data layer push after your server validates:
- Email address is in a valid format (regex check)
- Required fields are not empty
- Honeypot is empty
- Submission rate from this IP is not excessive (rate limiting)
- Message content does not match known spam patterns
The conversion tag only fires on the confirmed success path — never on validation failure.
3. reCAPTCHA v3 Integration
Google reCAPTCHA v3 runs invisibly in the background and assigns each form submission a score from 0.0 (bot) to 1.0 (human). You set a threshold (typically 0.5) and only fire the conversion event for submissions that score above it.
Implementation: pass the reCAPTCHA token with the form POST, verify it server-side via Google's API, and only redirect to the thank-you page (or fire the success event) if the score passes your threshold.
Filtering Out Internal Traffic
Your team, agency, and developers regularly test forms. These should not count as conversions. Two methods to exclude them:
GTM Trigger Exclusion by IP
In GTM, create a variable that reads the user's IP address (using a custom JavaScript variable). Add a trigger exception to your conversion tag: do not fire when IP equals your office or agency IP range.
Limitation: this only works on IPv4 and is unreliable if your team uses dynamic IPs or VPNs.
Cookie-Based Exclusion
Set a first-party cookie on any device used for testing (e.g. internal_tester=true). Add a GTM trigger exception: do not fire when the cookie is present. Team members can set this cookie manually for their browsers.
This is the most reliable method for excluding internal traffic from conversion data.
Setting Conversion Counting to One
In your Google Ads conversion action settings, set the Count to "One" — this counts a maximum of one conversion per user within the conversion window, even if they submit the form multiple times.
This prevents someone who submits a test, then a real enquiry, from generating two conversions from a single ad click.
Excluding Test Submissions at the Google Ads Level
Google Ads lets you specify IP addresses to exclude from conversion tracking in account settings. Add your office IP addresses there as a backup layer of protection.
Verifying Your Setup
- Open GTM Preview Mode and submit a real test form — confirm the conversion tag fires exactly once
- Submit the form with the honeypot field filled — confirm the conversion tag does NOT fire
- Navigate directly to your thank-you page URL — confirm the conversion tag does NOT fire (if using server-side redirect protection)
- Wait 24 hours and compare Google Ads conversion count against actual enquiries received in your inbox or CRM
Summary
Accurate form submission tracking is the foundation of effective Google Ads conversion measurement. The key steps: use server-confirmed events rather than page views, implement honeypot spam filtering, exclude internal traffic via cookies, and set conversion counting to "One".
If your current form tracking has any of these gaps, the fix is straightforward — and the improvement in data quality feeds directly into better Smart Bidding performance.
For a complete tracking audit, see our Conversion Tracking Fix and Debugging service.
Need help setting up accurate form submission tracking? Contact Adslytics.
Need expert tracking setup?
Our Google Tag Manager experts have delivered 500+ tracking setups with a 98% success rate.
Get a Free Consultation →