The brief
I run Arsyn’s Meta ads, and the lead campaigns use Meta’s own forms. But some people who see the ads go to the website instead, and from there they call, email, WhatsApp or fill in the contact form. The aim was simple: every way someone can get in touch from the website recorded as its own event, in GA4 and in Meta, before the website is used as a destination for paid traffic.
What I did
One Tag Manager container for everything. GA4 and the Meta Pixel both load through Tag Manager, so any new event can be added without touching the WordPress theme.
A listener for Contact Form 7. The site’s form plugin doesn’t talk to Tag Manager on its own. A small custom HTML tag listens for the plugin’s “mail sent” event, which only fires when a submission actually goes through, and pushes a cf7_submit event to the data layer with the form ID. That one event drives both the GA4 generate_lead event and the Meta Lead event, so the two platforms count the same thing.
Click tracking for calls, emails and WhatsApp. Link-click triggers for tel:, mailto: and WhatsApp links fire GA4 events (click_call, click_email, click_whatsapp) and a Meta Contact event. A separate trigger on the “Send an enquiry” button records cta_enquiry, so it’s clear how many people started an enquiry and how many finished one.
Kept the IDs in variables. The GA4 measurement ID sits in a constant and the form ID in a data layer variable, so the set-up is easy to read and easy to change later.
Results
Google rates the container “Good”, and every enquiry route on the site now arrives in GA4 and Meta as a named event, with form submissions counted only when the form actually sends. The lead campaigns run on Meta's own forms today; when a campaign sends people to the website instead, it can optimise on real enquiries from day one rather than on page views.
In short
Five ways to get in touch, each one tracked as its own event in both GA4 and Meta, ready for the first campaign that sends people to the website.

