Why Does UTM Data Disappear at Form Submission?
UTM data disappears at form submission because UTM parameters live in the page URL, not in the form. A form only sends the fields it contains, so unless something keeps the UTMs and sends them with the submission, the lead arrives with no source. Tools like Trakt store UTMs in the browser and record each submission with them.
- No hidden fields on the form. Nothing exists to capture the UTMs in the first place.
- Hidden fields that don't read from the URL. The fields exist but come through blank.
- UTMs lost between the landing page and the form page. The visitor navigates, the URL changes, the parameters are gone.
- Missing or wrong CRM field mapping. The form captured the values, but the CRM never stored them.
The UTM data chain, in four steps
The UTM in the URL is read into a hidden form field, submitted with the form, and stored in a mapped CRM property.
Every cause below is a break in exactly one of those links, so the fastest way to fix it is to find which link is broken, not to rebuild the whole setup.
Where Is Your UTM Data Getting Lost?
Match the symptom you see to the link in the chain that is broken:
| What you see | Broken link | Most likely cause |
|---|---|---|
| No UTM fields exist anywhere in the form HTML | URL to form | Cause 1: no hidden fields |
| Fields exist, but the CRM value is blank | URL to form | Cause 2: fields don't read the URL |
| Works on the landing page, blank on the contact page | URL to form | Cause 3: UTMs lost between pages |
| UTM values appear in the form's submission log but not in the CRM | Form to CRM | Cause 4: field mapping |
The 4 Causes of Lost UTM Data, and the Fix for Each
Cause 1: No hidden fields on the form (the most common)
Your form has no hidden fields for utm_source, utm_medium, utm_campaign, utm_content, or utm_term.
How to diagnose it: inspect the form HTML and look for <input type="hidden"> elements with UTM-related names. If you don't find any, this is your problem.
How to fix it: add a hidden field for each UTM parameter. Each field should:
- Be type
hidden - Have a name that matches what you want stored in your CRM (for example,
utm_source) - Default to the value of the URL parameter with the same name
That last part is where it gets slightly technical, because each form builder handles it differently:
- HubSpot forms: add a hidden field and set it to pre-populate from the URL parameter
utm_source. - Gravity Forms: use the "Parameter" field type and set the parameter name to
utm_source. - Typeform: add
utm_sourceas a hidden field in the form settings. - Contact Form 7: add a hidden field with
[hidden utm_source default:query_post_meta], or use a plugin such as CF7 UTM Tracker.
Repeat it for all five UTM parameters, then test by filling out the form after clicking a link that carries UTMs.
Cause 2: Hidden fields exist but aren't set to read from the URL
You added the hidden fields and they still show blank in the CRM. The fields are there, but nothing pulls the URL parameters into them when the page loads.
How to diagnose it: land on the page with UTMs in the URL, submit a test form, and check the lead record. A field that is blank (not missing) means the field exists but isn't reading the URL.
How to fix it: most builders give hidden fields a "default value" or "prefill" option. Set it to "query parameter" and enter the parameter name, for example utm_source. Where the builder supports custom code, a small script on page load does the same job by reading the URL and filling the fields:
document.addEventListener("DOMContentLoaded", function () {
const params = new URLSearchParams(window.location.search);
["utm_source", "utm_medium", "utm_campaign", "utm_content", "utm_term"].forEach(function (key) {
const field = document.querySelector('input[name="' + key + '"]');
if (field && params.get(key)) {
field.value = params.get(key);
}
});
});
Cause 3: UTMs exist on the landing page but not on the page with the form
Your ad sends traffic to /landing-page, but the form lives on /contact. The visitor clicks through from one to the other, and by the time they reach the form the URL has changed and the parameters are gone.
How to diagnose it: check your ad destination URLs. Do they point straight at the page that holds the form, or is there a step through another page first?
How to fix it, two options:
- Point your ads directly at the page containing the form. This is the simplest fix.
- Store the UTMs in a first-party cookie when the visitor first lands, then read from the cookie on later pages. This also covers the visitor who clicks an ad, browses your site for a few minutes, and then fills out a form on a completely different page. It needs a small script, or a tool that handles cookie persistence for you.
Cause 4: CRM field mapping is missing or wrong
The hidden fields exist, read the URL correctly, and the data is being submitted, but the CRM record still shows blank source fields.
How to diagnose it: check the raw submission data, which most form tools keep in a submissions log. If the UTM values are in the submission but not in the CRM, the break is in the mapping.
How to fix it:
- HubSpot native forms: each hidden field has to map to a custom HubSpot contact property. HubSpot doesn't map hidden fields automatically, so set the mapping in the form field settings.
- Zapier or Make workflows: open the workflow, find the step that creates the CRM contact, and check whether the UTM fields are included. Hidden fields added after you built the workflow don't appear on their own, so edit the trigger step and re-select your form fields.
- Salesforce: UTM values typically map to custom Lead fields, so make sure the field API names match what your form tool sends.
If you want each submission recorded with its UTMs, pre-register for Trakt.
How to Test That UTMs Reach Your CRM
Run this test after any fix, before you send real traffic:
- Build a test URL with the Trakt UTM Builder, for example
yoursite.com/contact?utm_source=test&utm_medium=email&utm_campaign=attribution-test. - Open that URL in a browser, or in an incognito window.
- Fill out the form with your own contact details or a test email.
- Check the form's submission log. Do the UTM values appear?
- Check the CRM record. Do the custom source fields show the same values?
If step 4 works but step 5 doesn't, the problem is CRM mapping. If step 4 shows blanks, the problem is the hidden fields or how they read the URL.
Common Gotchas
- URL-encoded UTMs. Some ad platforms encode UTM values, so a space becomes
%20. Make sure your CRM field accepts URL-encoded strings, or decode them before storing. - "Direct" doesn't mean the same thing everywhere. Google Analytics and your CRM define "direct" differently. A lead showing as "direct" in HubSpot doesn't mean they typed your URL. It means no UTM was captured. If this is your main symptom, why leads show as direct covers it in depth.
- Form caching. Some WordPress caching plugins serve a cached copy of the form page that never runs the JavaScript reading the UTMs. If your setup looks correct but isn't working, test with caching disabled.
Why Manual Hidden-Field Setup Breaks Over Time (And How Trakt Handles It)
Everything above works, and it also has a maintenance problem. The fix is not a one-time job:
- Every new form needs the hidden fields added again. The setup lives on each form, not on the site.
- Every new landing page needs a check. Someone has to confirm the form on it was built correctly.
- The setup drifts. Forms get added and changed, and nobody notices a form has stopped capturing UTMs until the leads arrive blank.
How Trakt closes the gap
Trakt scans your site and injects the hidden UTM fields into every form it finds, including forms added after you set it up. It also persists the UTMs in a first-party cookie, so the source is still there when a visitor fills out a form on a different page than the one they landed on. There is no checklist to maintain and no per-form configuration to forget.
Manual Hidden Fields vs. Trakt, By Requirement
| Requirement | Manual (DIY) | Trakt |
|---|---|---|
| Hidden fields on each form | Added by hand, one form at a time | Injected automatically into every form it detects |
| Forms added after setup | Each one needs the fields added again | Covered automatically, including new forms |
| UTMs across pages | Needs a custom script or cookie logic | First-party cookie persistence handled for you |
| Checking new landing pages | A manual checklist someone has to remember | No per-page check needed |
| Testing the result | Same either way: submit a test form and check the CRM record | Same either way: submit a test form and check the CRM record |
Frequently Asked Questions
Why aren't my UTM parameters showing up in HubSpot?
Most often because the form has no hidden fields for them, or the hidden fields aren't mapped to custom HubSpot contact properties. HubSpot doesn't map hidden fields automatically, so each one needs to be mapped in the form field settings. Check the form's submission log first: if the UTM values are there but not on the contact record, the problem is the mapping rather than the form.
Do UTM parameters get submitted with a form automatically?
No. UTM parameters live in the page URL, and a form only submits the fields it contains. Unless the form has hidden fields set to read the UTM values from the URL, they are never sent, and nothing errors, which is why the gap usually goes unnoticed until leads arrive in the CRM with no source.
How do I keep UTMs when the form is on a different page than the landing page?
Either point your ads directly at the page that contains the form, or store the UTMs in a first-party cookie when the visitor first lands and read from the cookie on later pages. The cookie approach also covers visitors who browse several pages before filling out a form, but it needs a small script or a tool that handles the persistence for you.
Why do my UTMs work in testing but not for real visitors?
A caching plugin is a common culprit. Some WordPress caching plugins serve a cached copy of the form page that never executes the JavaScript reading the UTMs from the URL. If your setup looks correct but isn't working, test with caching disabled, and check whether URL-encoded values (such as %20 for a space) are being rejected by the CRM field.
How do I test that UTM tracking is working end to end?
Build a test URL with UTMs, open it in an incognito window, submit the form with a test email, then check two places: the form's submission log and the CRM record. UTM values in the log but not the CRM means a mapping problem. Blanks in the log mean the hidden fields aren't reading the URL.


