UTM parameters often reach the first WordPress landing page and disappear before the visitor submits a form. That breaks campaign reporting even though analytics may still show sessions.
A reliable setup stores UTMs when the visitor lands, carries them across the journey, writes them into hidden form fields, and maps them into the CRM or email notification.
Quick diagnostic map
Use this map before changing tags or plugins. It keeps the investigation tied to the actual signal path instead of guessing inside dashboards.
| Signal | Meaning | First check |
| Query parameter | Start of the signal path | Append test UTMs |
| Cookie or storage | Middle layer that often breaks | Follow journey |
| Hidden field | Conversion moment to verify | Inspect hidden fields |
| CRM field | Reporting destination | Check CRM |
Test the full visitor journey
Do not test only the landing page. Follow the path a real visitor takes: landing page, internal pages, modal or form page, submission, email, CRM, and reporting.
Use obvious fake values so they are easy to spot.
Store first touch and latest touch intentionally
Some teams need first-touch attribution, some need latest-touch, and many need both. If every page overwrites the cookie, you may lose the original source. If nothing updates, you may miss retargeting or email clicks.
Name fields clearly so reporting teams know what each value means.
Watch forms loaded after page load
Popup, embedded, and multi-step forms can appear after the tracking script has already populated fields. In that case, populate hidden fields after the form renders or listen for the plugin's ready event.
This is common with modal forms and page builders.
Where UTMs vanish
- HTTP to HTTPS redirect strips query strings.
- Landing page links omit parameters.
- Cache serves stale hidden fields.
- Form plugin does not save hidden fields.
- CRM integration excludes custom fields.
Fields to capture
- utm_source
- utm_medium
- utm_campaign
- utm_term
- utm_content
- gclid
- fbclid
- landing_page
- referrer
Useful test commands
Use browser tools and command-line checks together. Browser tools show client-side events. Server and API checks show what survives after WordPress handles the submission.
new URLSearchParams(location.search)
When to get help
If the tracking path is tied to paid spend, lead routing, healthcare privacy, or CRM reporting, do not leave it half-tested. HandL WP can trace the path across WordPress, forms, GTM, pixels, server-side events, and CRM fields. If this is active on a production site, fix WordPress UTM tracking.
Helpful official references
Test attribution through every multistep form boundary
Use the UTM parameters in WP Forms multistep session test to cover validation, AJAX navigation, duplicate tabs, consent state, expiry, final entry storage, CRM delivery, and click ID matching.
Keep first-touch and latest-touch WPForms values separate
Use the WPForms first-touch and latest-touch CRM mapping test to define overwrite rules, cover returning visits and consent, validate hidden fields server-side, and reconcile one submission across WordPress and the CRM.
Debug WPForms first touch across subdomains
For journeys that land on one host and submit on another, use the WPForms UTM subdomain and first-touch debug to test consent, cookie scope, hidden fields, signed webhooks, CRM merges, and blank-value protection.
Test attribution when campaign tabs share storage
Run the WPForms UTM duplicate-tab localStorage race test to prove one campaign tab cannot overwrite another tab's journey and hidden fields.
Protect attribution when the stored data shape changes
Run the WPForms attribution storage schema migration test before renaming UTM, click ID, landing page, consent, or journey fields used by returning visitors.
Test attribution after consent is revoked
Run the WPForms consent-revoked attribution purge test to verify disallowed campaign and click identifiers leave browser storage, hidden fields, entries, and downstream requests.
Define storage scope for WPForms attribution fields
Use the WPForms UTM hidden-field storage scope test to assign first-touch, latest-touch, click ID, landing page, consent, expiry, and purge rules across memory, sessionStorage, localStorage, cookies, hidden inputs, entries, and CRM records.