Squarespace UTM tracking when the form block reads only the URL
Squarespace lets you add the TraceLead tag, but the form block's hidden fields read only the page address. This page sets out what that means for UTM tracking on Squarespace and the route that gets the first campaign, click id and landing page into a lead: a form in a Code block.
No card needed. No lead caps on any plan.
- Squarespace: Documented pattern, not covered by an automated test
- 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
The Squarespace form hidden field reads only the URL
A form block hidden field is filled from a parameter in the page address, named with an SQF_ prefix, and from nothing else. Your ads and newsletters use utm_ tags, the visitor rarely enquires on the page they landed on, and visits from search or social carry no parameters at all.
TraceLead keeps the first touch from an earlier page, but cannot hand it to the form block. We say so rather than ship a workaround we cannot test on every release. The Squarespace entry in our ledger is a guide.
- Form block hidden fields take their value from the page address only, not from a script.
- The TraceLead tag goes in Code injection, so your dashboard counts sessions by channel after consent.
- A plain HTML form in a Code block renders on your page, so the snippet fills its hidden inputs as on any site.
- An embedded form (Typeform, Jotform, Google Forms, HubSpot) in a Code block takes the values in the URL that loads it.
How to set up UTM tracking on Squarespace
A documented setup in four steps. Check it with a test entry on your own site before you rely on it.
The Wix and Squarespace guide-
Add the tag in Code injection
In Settings → Advanced → Code injection → Header, paste the TraceLead script tag and your consent call. Code injection is not on every Squarespace plan; check that yours includes it. Add the published domain to your site's allowed domains in TraceLead.
-
Add a Code block where the form goes
On your contact page, replace the form block with a Code block. What you put in it renders on your page, inside the reach of the snippet.
-
Paste a form with hidden tl_ inputs
Your own HTML form that posts to your CRM or form backend, with a hidden input per value:
<form action="https://your-form-backend.example/submit" method="post"> <!-- your visible fields --> <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"> </form>Or mount a Typeform or Jotform form with the short script in the embedded forms guide, or embed a HubSpot form.
-
Send a test entry
Open a page other than the contact page with
?utm_source=test&utm_medium=cpc, accept cookies, click through to the form and send it. The entry should carrytestas its source.
Squarespace lead source in each enquiry
Each hidden input arrives as a plain value beside the visitor's answers, wherever your form posts. Pick the ones you want; leave out the rest.
For an embedded builder, name its hidden fields without the prefix (channel, source), as the embedded forms guide shows.
| Hidden 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 does a Squarespace form hidden field get its value?
Only from the page address: Squarespace reads a URL parameter named after the field with an SQF_ prefix. A script cannot set it, so a first touch recorded on an earlier visit never reaches it.
Can TraceLead fill the Squarespace form block?
No. TraceLead would have to write into the hidden field from page code, and the form block does not take values that way. Use a plain HTML form or an embedded form in a Code block instead.
Where do I paste the TraceLead tag on Squarespace?
Settings → Advanced → Code injection → Header. Paste the tag and your consent call there. Code injection is not on every Squarespace plan; check that yours includes it.
How do I track the lead source on Squarespace?
Put a form TraceLead can reach in a Code block: your own HTML form with hidden tl_ inputs that posts to your CRM or form backend, or a Typeform, Jotform, Google Forms or HubSpot form mounted as the embedded forms guide shows. Both render on your page, so the first touch from any earlier visit is there when the visitor enquires.
What does the tag do without a fillable form?
After consent it counts sessions by channel and campaign on your TraceLead dashboard, so you still see where traffic comes from. Leads with their source need one of the form routes.
Does TraceLead store what visitors type into the form?
No. TraceLead never reads form answers and never stores names, emails or IP addresses. The form posts to wherever it posted before, and nothing is stored before consent.
Get the source into your Squarespace enquiries.
Add the tag in Code injection, then put a form TraceLead can reach in a Code block.
No card needed. Cancel any time.
Squarespace → Settings → Advanced → Code injection → Header
TraceLead tag + consent call
Code block on the contact page:
<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">