Signal Google Ads bids on for leads
- Before
- form_submit — fires on the attempt, including failed submissions
- After
- generate_lead — fires on a confirmed enquiry
Design studioClient work
Rebuilding lead tracking on a Webflow site I never logged into: 27 changes, each with its own undo, and 15 of 15 negative tests passing.
The brief
A B2B design studio on Webflow gets its leads from an enquiry form and a booking page, and could not measure either. The old Tag Manager container listened for form events from a site build that no longer existed, so the conversion had quietly stopped firing. Google Ads was bidding on form_submit, which fires on the attempt — including rejected submissions — not on a delivered enquiry. Bookings went unmeasured: 321 sessions reached the booking page in 90 days, five reached confirmation. A second Google Ads account with no code of its own fired on every page including 404s.
Client details anonymised. Figures read from live platform APIs in August 2026.
Handover
Delivery noteDelivered Aug 2026
I never had CMS access. The only site-side change — the GTM container snippet — went out as paste-ready instructions the client pasted and published himself. The container build, Analytics and Ads changes I did directly through their APIs.
I rebuilt lead tracking with a layered, deduplicated listener: the primary signal is the endpoint answering success, with a DOM fallback, a once-per-page guard, survival across in-page navigation, and no personal data in the data layer. I made generate_lead a GA4 key event and restructured Ads — generate_lead primary, form_submit secondary — switching only after a live enquiry proved the new event end to end. Ads tags are now held off 404 pages by the page’s own structural identifier. Booking measurement came from zero with a postMessage bridge: the booking widget runs in a sandboxed cross-origin iframe that browsers forbid from navigating the top window, so the documented redirect could never fire. The stray second Ads account rode the Google tag as a destination, so no code removal could stop it; I traced it and had it detached.
Before → after
Client work Done for real clients. Client details are anonymised.
All five written acceptance conditions met on the live site. Fifteen of fifteen negative tests passed: the hidden second form does not fire, a failed submission does not fire, a page loaded after success does not re-fire. Every change carries its own one-step undo. Enquiries count on confirmed success, bookings on real confirmation, no Ads tag fires on a 404, and the stray account is gone.
Signal Google Ads bids on for leads
Google Ads tags firing on 404 pages
Booking measurement
Written acceptance conditions met
5 of 5
How a Greek herbal-tea brand carried one Shopify variant ID across Merchant Center, GA4/Ads and Meta and lifted GA4 order coverage from 29% to 80%.
The first answer is free, within one working day. Or write directly: next@taskfordaniel.com