Tracking & GTM
Make every booked call count.
GTM · GA4 · Google Ads · Meta · Calendly · HubSpot · Typeform · GoHighLevel
If Google Ads says zero conversions and your calendar says otherwise, your tracking is lying. We find where data leaks, fix it and prove it.
Sound familiar?
Tick what applies. Be honest, nobody is watching.
0
Lucky you. Run the free scan to be sure.
Start with the Tracking Audit.
A fixed-price review of your GTM container, GA4 property, ad conversions, consent setup and booking flows. It takes a few working days and ends with a prioritized fix list, ranked by what it's costing you.
Book a Tracking Audit- Read-only access, no passwords
- Evidence for every finding
- Yours to keep, whoever does the fixes
Flip the banner. Watch the tags.
This is what a correct Consent Mode v2 setup does with each choice. Try all three.
A sandbox. Your real cookie choice is untouched.
gtag("consent", "update", ...)
- ad_storage granted
- analytics_storage granted
- ad_user_data granted
- ad_personalization granted
What each tag does
-
GA4
Full hits with cookies. Sessions, pages and events attributed.
-
Google Ads
Conversion sent with the click ID. Counted against the ad.
-
Meta Pixel + CAPI
Pixel and Conversions API fire, deduplicated by event ID.
Accepted: all four signals flip to granted, and every tag that waited now fires.
How a booking inside someone else's iframe becomes a conversion.
GTM can't see inside Calendly. But Calendly can tell your page what happened. Scroll to follow one booking.
-
Calendly iframe
calendly.com
Visitor confirms a booking inside someone else's frame.
-
postMessage
calendly.event_scheduled
The tool announces completion to the parent page.
-
Listener on your page
origin checked
GTM or a small script catches the message.
-
dataLayer
booking_confirmed
One clean, named event. No personal data.
-
GA4, Ads, Meta
real conversion
Sent on as a conversion with the right IDs.
window.addEventListener("message", (e) => {
if (e.origin !== "https://calendly.com") return;
if (e.data.event !== "calendly.event_scheduled") return;
dataLayer.push({ event: "booking_confirmed", provider: "calendly" });
});
What we fix.
01 Booking and embedded form conversions
Problem ✕
Calendly, HubSpot, Typeform and GoHighLevel run inside iframes on their own domains. GTM on your page can't see a booking confirmed inside someone else's frame.
What we do
Listen for the tool's own completion messages, push a clean event to the dataLayer, and send it to GA4 and your ad platforms as a real conversion.
You get ✓
One named conversion per booking or submission, visible in Google Ads and GA4.
02 Consent Mode v2 fix and verify
Problem ✕
The cookie banner and GTM aren't talking. Tags fire before consent, or never fire after it. Either way, ad data goes missing or you're out of compliance.
What we do
Set correct defaults, wire the banner's choices to consent updates in GTM, and test every combination: accept, reject, partial.
You get ✓
A recorded test of each consent state, so you can see data flowing when it should and stopping when it shouldn't.
03 GA4 and GTM for single-page and AI-built sites
Problem ✕
Sites built in React, Lovable or Bolt change pages without reloading. GA4 counts the first page and misses the rest.
What we do
Fire a proper page view on every route change, with the right title and path, without double counting.
You get ✓
Real page paths, real engagement, funnels that make sense.
04 Google Ads enhanced conversions for leads
Problem ✕
Google matches fewer conversions to ad clicks than it could, and leads that close weeks later never get credited.
What we do
Send hashed lead details with the conversion so Google can match it, and set up the path for importing closed deals later.
You get ✓
Better-matched conversions and smarter bidding signals. Hashing happens before data leaves the browser.
05 Meta Pixel + Conversions API dedup audit
Problem ✕
The Pixel and the Conversions API both send the same lead. Without a shared event ID, Meta counts it twice or throws away the better one.
What we do
Check event IDs, match quality and parameters on both sides, then fix deduplication.
You get ✓
One lead counted once, with the best available match data.
06 Attribution leak fix
Problem ✕
A customer pays on Stripe or PayPal, or books on a scheduling domain, then lands back on your thank-you page. GA4 credits the payment provider as the source.
What we do
Configure unwanted referrals and cross-domain settings so the original source survives the round trip.
You get ✓
Revenue and leads credited to the campaign that earned them, not to checkout.stripe.com.
Fixed means we watched it fire.
We don't hand over "should work now". Every fix is tested in Google Tag Assistant, GA4 DebugView, Google Ads diagnostics or Meta Events Manager, and recorded. You get the proof with the handover.
- ✓ 01 Before and after screenshots of each conversion
- ✓ 02 A short screen recording of every test
- ✓ 03 A plain-English changelog of what changed in your GTM container, with version notes
Want to see clean tracking in action?
Open the Tracking Inspector. Every click you've made on this page is already there as a named event.
- Waiting for your first event...
Your containers. Your data. Your accounts.
We work inside your GTM, GA4, Google Ads and Meta accounts as an added user. Nothing lives in an account we control. When we're done, you remove us and nothing breaks.
Questions people ask first
Can you fix it without changing our site?
Often, yes. Most tracking fixes live in GTM. If a site change is needed, we'll tell you exactly what and why.
We use a different booking tool.
If it shows a confirmation, we can almost always track it. Tell us on the scoping call.
Is this GDPR-safe?
Consent comes first. We set things up so tags respect each visitor's choice, and we test that they do.
Do you manage our ads too?
No. We make sure the data your ads rely on is right. Your ads person will thank us.
Stop guessing which ads work.
Book a Tracking AuditNot ready to talk?
Scan your site free →