Forms don't redirect by default
A native Webflow form submits in the background and swaps in a success message on the same page. A page-view trigger never fires, and a plain click trigger counts failed and spam attempts as leads.
This is for teams who build on Webflow and run Google or Meta ads to it, whether the goal is demo requests or ecommerce orders. Webflow makes design easy, but its forms and checkout don't hand ad platforms clean conversion data out of the box. I install GTM properly, track forms and orders reliably, and add server-side events where they help.
Proper Webflow tracking means installing GTM in the site-wide custom code, tracking native forms by their success state rather than a thank-you page, and capturing Webflow Ecommerce orders with value on the order confirmation page. Adding server-side events from Webflow's form and order webhooks makes Google Ads and Meta CAPI data more complete.
The events I set up on Webflow, and where each one is sent.
A native Webflow form submits in the background and swaps in a success message on the same page. A page-view trigger never fires, and a plain click trigger counts failed and spam attempts as leads.
Scripts can go in site-wide custom code, page settings or Embed elements, and old pixels added by previous designers tend to linger in all three. Custom code also only runs on the published site, so the Designer preview tells you nothing.
Webflow Ecommerce doesn't push GA4-style ecommerce events to a dataLayer. Without custom work, purchases arrive without value, items or a transaction ID, so you can't deduplicate or report revenue properly.
Every Webflow project has a webflow.io staging domain. If the tags fire there too, test submissions from your team end up as conversions in Google Ads and Meta.
Cookie banners are often dropped in as a separate script that has no connection to the tags. Tags either fire before consent or never fire at all, and Consent Mode v2 signals are missing.
| Event | When it fires | Sent to |
|---|---|---|
generate_lead | Native form shows its success message | GA4, Google Ads, Meta Pixel + CAPI |
contact_click | Click on a mailto: or tel: link | GA4, Google Ads |
book_call_click | Click on a booking button or scheduler link | GA4, Meta Pixel |
view_item | Product page viewed | GA4, Meta Pixel (ViewContent) |
add_to_cart | Add to cart button clicked | GA4, Meta Pixel + CAPI |
begin_checkout | Checkout page loaded | GA4, Meta (InitiateCheckout) |
purchase | Order confirmation page loaded | GA4, Google Ads, Meta Pixel + CAPI |
I check what's installed in site settings, page settings and embeds, and test what your forms and checkout currently report.
We agree on the conversions that matter, such as a demo request, a quote form or a purchase, and how each one should be valued.
I set up GTM, the form and ecommerce events, consent and, where it helps, server-side GTM fed by Webflow webhooks.
Because custom code only runs on the published site, I publish and test real submissions and test orders on your live domain.
You get a short document listing every tag and event, and what to watch when you redesign pages.
A Webflow form doesn't load a new page when it's submitted; it hides the form and shows the success block. I use a small listener that watches for that success state, then pushes a generate_lead event with the form name to the dataLayer. Failed submissions show the error block instead, so they're not counted.
If you'd rather have a thank-you page, Webflow's form settings let you set a redirect URL. That works too, but people who refresh or bookmark that page can inflate your numbers, so I usually prefer the success-state method.
For stores, I build the ecommerce events myself, reading product and order details from the page, so GA4, Google Ads and Meta all receive the same order ID and value.
Webflow can also send webhooks when a form is submitted or an order is placed. Routing those to server-side GTM gives Meta CAPI a server copy of each lead or purchase. A shared event ID lets Meta deduplicate it against the browser pixel.
Paste the GTM head snippet into the head code and the noscript snippet into the body code in your site-wide custom code settings, then publish. Custom code needs a paid site plan and only runs on the published site, not in the Designer.
Usually because the conversion is set to fire on a thank-you page that never loads; native Webflow forms show a success message instead. Track the success state or set a redirect URL in the form settings, then point the Google Ads conversion at that event.
Not with a built-in toggle for full CAPI events. I send server events through server-side GTM, using the browser dataLayer and, where useful, Webflow's form and order webhooks, with deduplication against the Pixel.
Yes. I fire the purchase event on the order confirmation page with the order ID, total and items, and send it to GA4, Google Ads and Meta. The order ID stops the same order being counted twice.
I add a hostname condition so tags only fire on your live domain, not the webflow.io staging address. It's a small change that keeps test submissions out of your ad data.
Use a consent platform that supports Google Consent Mode v2 and load it before your tags, either through GTM or site-wide custom code. I then check that tags respect each consent state before going live.

Step-by-step GTM setups for tracking WhatsApp clicks, phone taps and form submissions in GA4, with event names, triggers and a testing checklist.

Duplicate tags, loose triggers and missing transaction IDs quietly corrupt your conversion data. Here is how to find and fix the most common GTM mistakes.

A plain-English guide to Google Consent Mode v2: the four signals, basic vs advanced mode, who needs it, and how to set it up and test it in GTM.
Get a free audit of your tracking and ad account. Usually replies within 1–2 hours.