Webflow UTM tracking for the native Form Block, on every page
Drop a few hidden inputs into your Webflow Form Block and TraceLead fills them with where the visitor first came from: the Google ad, the newsletter, the search, the referral. The source arrives in Webflow's form submissions, the notification email and any Zapier, Make or webhook step that reads the form.
No card needed. No lead caps on any plan.
- Webflow: Tested on every release against the builder's markup
- How we test
Added by TraceLead's hidden fields. The name and email stay in your form.
- Channel
- Paid search
- Source / medium
- google / cpc
- Campaign
- brand-uk
- Click ID
- gclid
Why Webflow form hidden fields arrive blank
Webflow's Designer has no hidden-field element, so the usual advice is an Embed with a script that copies utm_source from the address bar into an input. It holds a value only if the visitor sends the form on the page they landed on.
Most move on first: from a case study to /contact, or back a week later by typing your address. The submission comes through with every campaign field empty.
-
Monday
Clicks a Google ad, lands on
/pricing?utm_source=google&utm_medium=cpc&utm_campaign=brand-uk&gclid=…, leaves. -
Thursday
Types your address, opens
/contact, sends the Webflow form.
| Hidden field | Read from the URL | Filled by TraceLead |
|---|---|---|
| tl_channel | empty | paid_search |
| tl_source | empty | |
| tl_utm_campaign | empty | brand-uk |
| tl_gclid | empty | Cj0KCQjw… |
| tl_landing_page | /contact | /pricing?utm_source=google&utm_medium=cpc |
TraceLead keeps the first visit in a first-party cookie on your domain once your banner allows it, and fills the inputs on whichever page the Form Block sits.
How to add UTM tracking to a Webflow form
Four steps in Webflow. Both ways of adding the inputs can sit on the same form.
The full Webflow guide-
Add the TraceLead tag in Head code
In Site settings → Custom code → Head code, paste the TraceLead script tag and your consent call, then publish. Custom code needs a paid Webflow site plan.
-
Put hidden inputs in an Embed element
Drag an Embed element inside the Form Block and paste the inputs you want. The
tl_names match TraceLead's default mappings:<input type="hidden" name="tl_channel"> <input type="hidden" name="tl_source"> <input type="hidden" name="tl_utm_campaign"> <input type="hidden" name="tl_landing_page"> -
Or use a Text Field with a custom attribute
Prefer a readable name in submissions? Add a Text Field named, say,
Source. Under Element settings → Custom attributes adddata-traceleadwith the valuesource, hide it with a class set todisplay: noneand leave it optional. The snippet fills any input carrying that attribute, whatever its name. -
Publish and check a submission
Open the published page with
?utm_source=test&utm_medium=cpc, accept the consent banner, send the form and open the entry in Site settings → Forms. In the browser console,tracelead('diagnostics', console.log)shows how many inputs each mapping matched.
Webflow lead source in every submission
Each input appears as its own column in the submission and its own line in the notification email. Pick the ones you want; leave out the rest.
Make the Embed element part of a Symbol and every form on the site carries the same inputs, CMS template pages included.
Also available: utm_term, utm_content, Microsoft, Meta, LinkedIn, TikTok and X click ids, and optionally the last touch and the number of visits before the enquiry.
| Input name | Holds | Example |
|---|---|---|
| tl_channel | The channel the first visit came from | paid_search |
| tl_source | Where it came from | |
| tl_medium | How it came | cpc |
| tl_utm_campaign | The campaign name from your UTM tags | brand-uk |
| tl_gclid | Google Ads click id, for offline conversion import | Cj0KCQjw… |
| tl_referrer_host | The site that sent the visit | chatgpt.com |
| tl_landing_page | The first page seen, sensitive parameters removed | /pricing? |
| tl_first_touch_at | When the first visit happened | 2026-10-05T09:14:02Z |
Attribution without personal data. No names, emails, form values, IP addresses or user agents. Ever.
No privacy workarounds. Nothing before consent, no fingerprinting, no ad-blocker bypass, no cross-site identity.
Made in the UK. GBP pricing, UK consent rules in mind, and a person who answers email.
Questions, answered
Anything else? Email us and a person replies.
How do I add a hidden field to a Webflow form?
The Designer has no hidden-field element. Drag an Embed element inside the Form Block and paste plain inputs such as <input type="hidden" name="tl_channel">, or add a Text Field with the custom attribute data-tracelead and hide it with a class set to display: none.
Why do my Webflow form hidden fields arrive blank?
Something has to fill them. A script that copies UTM tags from the address bar only helps when the form is sent on the page the visitor landed on. TraceLead keeps the first visit after consent and fills the inputs on any page; if they are still blank, check that consent was given and that the names match your mappings.
Where do I see the lead source in Webflow?
In Site settings → Forms, in the form notification email, and in anything that reads the submission, such as Zapier, Make or a webhook. Webflow sends every named input with the form.
Do I need a paid Webflow plan?
Yes, for the TraceLead tag. It goes in Site settings → Custom code → Head code, and custom code needs a paid Webflow site plan.
Does it work on CMS template pages and Symbols?
Yes. Pages built from a CMS template work the same way, and you can make the Embed element part of a Symbol so every form on the site carries the hidden inputs.
Does TraceLead see the form answers?
No. Submissions go through Webflow's own handler. The snippet only writes into the hidden inputs and notices the submit, so your dashboard counts the lead under the form's id, wf-form- plus its name, with its channel and campaign.
Your next Webflow submission, with its source.
Paste the tag in Head code, drop an Embed element into the Form Block and publish.
No card needed. Cancel any time.
Embed element, inside the Form Block:
<input type="hidden" name="tl_channel">
<input type="hidden" name="tl_source">
<input type="hidden" name="tl_utm_campaign">
<input type="hidden" name="tl_gclid">