Guides · · 9 min read
How to track form submissions and WhatsApp clicks in GA4 with Google Tag Manager (2026 guide)
A step-by-step guide to tracking every real enquiry in GA4 with Tag Manager: forms, WhatsApp and phone, Consent Mode v2, key events, importing into Google Ads and reconciling the numbers with your CRM.

If you don’t know how many real enquiries reach you each month, you can’t know what each customer costs you. And almost everything else —which campaign works, which page converts, which supplier delivers what it charges for— depends on that number.
Take a lift manufacturer we work with: in September 2026 its website received 62 form enquiries and 43 clicks to open WhatsApp. Two facts from that month explain why this guide exists:
- Four in ten contact actions were via WhatsApp. If only forms were tracked, almost half of the interest would be invisible.
- GA4 recorded 32 of the 62 enquiries, because it can only count people who accept cookies. That’s correct under the GDPR, but anyone reading GA4 without knowing it would think they had half the leads they actually have.
In this guide we set up complete tracking with Google Tag Manager (GTM) and Google Analytics 4 (GA4): forms, WhatsApp and phone, with consent, tested and connected to Google Ads. And, above all, reconciled with reality.
Is your website tracking enquiries properly? The free audit checks analytics, Tag Manager and cookies in 30 seconds.
Check my website free →What to track — and what not to
Before touching anything, decide what counts as an enquiry for your business. Not everything that can be tracked is a lead.
| User action | What it really is | GA4 event | Key event? | In Google Ads |
|---|---|---|---|---|
| Successfully submits a form | A real enquiry | generate_lead |
Yes | Primary conversion |
| Taps a WhatsApp link | An intention to get in touch | whatsapp_click |
Yes | Primary only once validated (see step 6) |
| Taps a phone link | An intention to call, not a call | phone_click |
Optional | Secondary |
| Downloads a catalogue or PDF | Interest, not contact | file_download |
No | No |
| Visits the contact page | Navigation | page_view |
No | No |
The rule we apply: a key event is something that, multiplied by ten, would grow the business. A download or a visit to “Contact” doesn’t pass that test; a submitted form does.
Before you start
- Admin access to GTM and GA4, owned by your company. If you don’t have it, start there (it’s the first question in how to audit your marketing agency).
- One tracking system only. If your site has the GA4 code pasted into the theme and GTM loads it too, you’ll count everything twice. Keep GTM only.
- A cookie banner compatible with Consent Mode v2.
- Know which plugin powers your forms (Contact Form 7, Gravity Forms, Elementor, HubSpot…). It changes how you track them.
Step 1. Install the Google tag in Tag Manager
In GTM, create a Google Tag with your GA4 measurement ID (G-XXXXXXXXXX) and assign it the Initialization - All Pages trigger. Every event you send later builds on it.
Step 2. Set up consent (Consent Mode v2)
In the European Union, Google requires Consent Mode v2 to use Google Ads measurement and audience features. It works with four signals:
| Signal | What it controls |
|---|---|
analytics_storage |
Analytics cookies (GA4) |
ad_storage |
Advertising cookies |
ad_user_data |
Sending user data to Google for advertising purposes |
ad_personalization |
Using data for personalised advertising (remarketing) |
By default, all four should be denied until the user accepts in the banner (our Consent Mode v2 and cookie banner guide covers it in depth). Most consent platforms have an official template in the GTM gallery that does this for you; if your banner is custom-built, send the default state with the Consent Initialization - All Pages trigger and update it when the user chooses.
You’ve already seen the practical consequence: GA4 will only see part of your leads. It isn’t a bug to fix; it’s a number to read correctly (we deal with it in step 7).
Step 3. Track your forms
There are three ways to do it. Only one is reliable on almost every website.
| Method | How it works | Upside | Problem |
|---|---|---|---|
| Thank-you page | Counts visits to /thank-you/ |
Simple | Inflated by reloads and direct visits; many forms don’t redirect |
| GTM “Form Submission” trigger | Listens for the form submit in the browser | No code | Fails with AJAX forms, which are the majority on WordPress |
| Plugin event in the data layer | The plugin signals a completed submission and GTM picks it up | Only counts valid submissions | Needs a small code snippet |
We recommend the third. The idea is simple: when the plugin confirms the form was submitted successfully, we write an event to the data layer (dataLayer) and GTM turns it into a GA4 event.
Contact Form 7 fires the wpcf7mailsent event once the message has been sent:
<script>
document.addEventListener('wpcf7mailsent', function (e) {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ event: 'form_submit_ok', form_id: String(e.detail.contactFormId) });
});
</script>
Gravity Forms (forms with AJAX enabled) fires gform_confirmation_loaded when the confirmation is shown:
<script>
jQuery(document).on('gform_confirmation_loaded', function (event, formId) {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ event: 'form_submit_ok', form_id: String(formId) });
});
</script>
Other plugins have their own equivalent (Elementor Pro, for example, fires submit_success): check their documentation. The snippet can go in the site’s theme or in a GTM Custom HTML tag fired on DOM Ready on pages with forms.
Then, in GTM:
- Create a Data Layer Variable called
form_id. - Create a Custom Event trigger with the event name
form_submit_ok. - Create a Google Analytics: GA4 Event tag with the event name
generate_leadand the parameterform_id={{form_id}}. Assign it the trigger above.
We use generate_lead because it’s Google’s recommended event name for enquiries: GA4 and Google Ads recognise it as such.
Step 4. Track WhatsApp and phone clicks
- In Variables › Built-In Variables, enable the click variables (at least Click URL).
- Create a Click - Just Links trigger, on “Some Link Clicks”, with the condition Click URL matches RegEx (ignore case):
wa\.me|whatsapp\.com|^whatsapp:
- Create a GA4 event tag called
whatsapp_clickwith the parameterlink_url={{Click URL}}. - Repeat with
^tel:to createphone_click.
Two warnings:
- Some floating WhatsApp buttons aren’t links: they open the chat via JavaScript. If the trigger doesn’t fire, use Click - All Elements with the button’s CSS class, or the event the plugin itself emits.
- A tap on a phone number isn’t a call. Plenty of people tap and hang up, or click on a desktop that can’t call. Measuring real calls needs call tracking (for example, Google Ads forwarding numbers). Until then, treat
phone_clickas a signal, not a result.
Step 5. Test before you publish
With GTM Preview mode open:
- Submit a real form:
generate_leadshould fire exactly once. - Submit the form with an error (a required field left empty): nothing should fire.
- Tap WhatsApp and the phone link: each event should appear with its URL.
- Repeat with cookies rejected and check GA4 respects the choice.
- Open DebugView in GA4 and confirm the events arrive with their parameters.
Publish the container with a version name that explains the change (“Form and WhatsApp tracking”). Six months from now, someone will thank you.
Step 6. Mark key events and bring them into Google Ads
In GA4: go to Admin › Data display › Events and mark generate_lead and whatsapp_click as key events (since 2024, GA4 calls “key events” what used to be “conversions”; the word “conversion” is now reserved for Google Ads). If the event doesn’t show yet because it’s new, you can create it from Key events › New key event by typing the exact name.
In Google Ads: link the account to GA4 and import the events from Goals › Conversions › New conversion action › Import › Google Analytics 4. Menus change often; if they don’t match, look for the equivalent.
The important decision is which ones will be primary (used by Google for bidding) and which secondary (for reporting only):
| Action | Recommendation | Why |
|---|---|---|
generate_lead |
Primary | It’s a real, verifiable enquiry |
whatsapp_click |
Primary, once validated | Compare clicks with the conversations your team receives for a few weeks. If most turn into conversations, use it for bidding |
phone_click |
Secondary | If you bid on taps that aren’t calls, Google will look for more taps, not more customers |
That’s what we did in the lift manufacturer case: forms and WhatsApp as primary conversions, and calls kept out of the bidding goals so the number isn’t inflated.
Step 7. Reconcile the numbers with reality
This is the step almost nobody takes, and the one that turns tracking into a decision-making tool. Every month, compare three numbers:
| Source | What it counts | Example (September 2026) |
|---|---|---|
| The form system or CRM | Every real enquiry, spam removed | 62 |
| GA4 | Only those from users who accept cookies | 32 |
| Google Ads | Only those attributed to ads | Per campaign |
With that table you know, for instance, that GA4 sees roughly half of your leads, and you can read its reports with that factor in mind. Three practices that help reconcile:
- Store the source in every form. Hidden fields with source, medium, campaign (
utm_*) and the Google Ads click identifier (gclid). That way every real enquiry arrives with its channel, even if the user rejects cookies. - Filter spam at both ends. In the form (honeypot field or captcha) and in GA4 (excluding artificial referral traffic). In the same case we found 230 sessions of artificial traffic in a single month: removing them changes the conclusions.
- Put the three numbers on one dashboard. A Looker Studio dashboard with real enquiries, GA4 key events and Ads conversions, month by month, prevents arguments and speeds up decisions.
Common mistakes
- Counting downloads, visits to “Contact” or clicks on the “Send” button as enquiries. They inflate the number and push Google to optimise for what you don’t care about.
- Relying on GA4 enhanced measurement for forms. It detects form interactions, but fires on the submit attempt and doesn’t recognise many AJAX forms properly. Useful as a guide, not for counting enquiries.
- Having GA4 installed twice (in the theme and in GTM). Everything comes out doubled.
- Not testing with cookies rejected. That’s the situation of a good share of your visitors.
- Bidding on phone taps as if they were calls.
- Not documenting. Without version names or a list of events, the next person starts from scratch.
Recommended naming
| Event | When it’s sent | Parameters |
|---|---|---|
generate_lead |
Form submitted successfully | form_id (and, optionally, lead_type) |
whatsapp_click |
Click on a WhatsApp link or button | link_url |
phone_click |
Click on a tel: link |
link_url |
file_download |
File download (automatic with enhanced measurement) | — |
In short
Good tracking isn’t installing GA4: it’s deciding what counts as an enquiry, recording it only when it really happens, respecting consent and reconciling the numbers with reality every month. Do that, and every euro of advertising has a cost per customer behind it.
Once it is live, run a website tracking audit to check that everything is recorded. If you’d rather we set it up and keep an eye on it, that’s exactly what we do in Analytics & dashboards, and the foundation of every digital advertising campaign we run.
Frequently asked questions
Do I need Tag Manager, or is GA4 enough?
To track AJAX forms, WhatsApp and phone reliably, Tag Manager is the most practical route: it lets you add and change tracking without touching the site's code, with versions and consent.
Why don't GA4 and my CRM match?
Because of cookie consent, ad blockers, spam and duplicate submissions. GA4 normally counts fewer than the CRM. What matters is knowing the ratio and checking it stays stable.
Can I track WhatsApp conversations, not just clicks?
Yes, if you use the WhatsApp Business API or an assistant connected to it: every conversation started can be recorded as an event. That's what we do when we set up an AI chat on WhatsApp.
How does your website score?
Audit it free in 30 seconds: over 20 business and technical checks, and what to fix first.


