
UTM parameters get lost because each tool between the ad and the CRM has to pass them on, and most don't by default. Redirects drop the query string, visitors click to a second page, forms don't capture the values, and booking tools and CRM syncs don't map them. The fix is to capture UTMs on the first page, store them, and write them to the contact once.
Picture a B2B services firm running LinkedIn and Google ads to a landing page. The page links to a pricing page, which has an embedded scheduling widget, and bookings sync to the CRM through an automation. The ads are tagged carefully. Three months later, most new deals in the CRM show "Direct" or "Offline" as their source, and the marketing team can't say which campaign filled the calendar. Every tool worked. None of them handed the campaign data to the next one.
Why do UTM parameters get lost between tools?
UTMs live in the URL of the first page a visitor lands on, so they disappear as soon as the visitor moves on, unless something saves them. Every handoff after that is a place where they can fall off.
The common breaks, in the order a visitor meets them:
Redirects. A link shortener, a www redirect or a regional redirect that doesn't forward the query string sends the visitor to a clean URL. Google's auto-tagging help page warns of the same problem for its own click ID: if your site uses redirects, the parameter has to reach the final landing page.
The second page. The visitor reads the landing page, then clicks to pricing or a contact page. That new URL has no UTMs.
The form. The form sends name, email and company, but nothing reads the UTMs from the page and sends them too.
The booking tool. An embedded or linked scheduler is a separate application. It only knows the campaign if you pass the values to it.
The sync. The automation that creates the CRM contact maps the fields someone thought of on the day, and campaign fields weren't among them.
Overwrites. A later visit or a second form fill replaces the original values, so the first campaign is lost even when capture works.
You can't rely on the referrer to fill the gap. The default browser Referrer-Policy is strict-origin-when-cross-origin, which sends only the origin, not the full URL, to another site. The query string with the UTMs isn't part of it.

What are UTM parameters, and which ones should you use?
UTM parameters are tags added to a link's URL that tell analytics and CRM tools where a visit came from. Google Analytics asks for three on every tagged link: utm_source, utm_medium and utm_campaign.
Google Analytics' URL builder guide lists the full set:
utm_source: the referrer, for example google, newsletter or linkedin.
utm_medium: the marketing medium, for example cpc, email or social.
utm_campaign: the campaign, promotion or slogan.
utm_term: the paid keyword.
utm_content: which creative or link within the same campaign.
utm_id, utm_source_platform, utm_creative_format and utm_marketing_tactic: optional extras for campaign IDs, the buying platform, the ad format and the targeting.
Google also notes that parameter values are case sensitive: utm_source=google and utm_source=Google count as two sources. A short written naming convention (lowercase, fixed values for medium, one campaign name per campaign) prevents most reporting clean-up later.
Ad platforms add their own click IDs as well. A GCLID, short for Google Click Identifier, is the parameter Google Ads adds to the landing page URL when auto-tagging is on. Treat click IDs the same way as UTMs: capture them on landing and store them with the contact.
How do you carry UTMs from the landing page to the form?
Read the UTMs when the visitor first lands, save them in the browser for the session, and put them into hidden form fields when the visitor submits. That way it doesn't matter how many pages they click through before converting.
A hidden field is a form field the visitor doesn't see that sends a value with the submission. HubSpot's guide to hidden form fields says they can capture URL parameters such as utm_campaign and store them in contact properties. Most form tools have an equivalent.

What the capture step needs
A small script on every page that reads UTMs and click IDs from the URL on arrival and saves them in a first-party cookie or session storage.
First touch kept separately from last touch. Save the first values once and don't overwrite them; update a separate set on each new tagged visit.
Hidden fields on every form filled from that stored data, not only from the current URL.
One list of field names used by the website, the forms, the scheduler and the CRM.
If the booking or checkout step sits on a different domain, Google Analytics needs cross-domain measurement, which adds a _gl parameter to links between your domains so the visit counts as one user. That keeps your analytics sessions joined; it doesn't write anything to your CRM.
How do you keep UTMs through a booking tool like Calendly?
Pass the stored UTMs to the scheduler explicitly, then read them back from the booking data. A scheduler can only report the campaign it was given.
Calendly is a common case. Its conversion tracking guide supports five parameters: utm_source, utm_medium, utm_campaign, utm_content and utm_term. Values must be 255 characters or less, or they may not be tracked. Its embed guide shows how to pass UTM values into an embedded scheduler, including pulling them from the page URL with a short script. Calendly's developer FAQ says the values are then available in the webhook payload and the List Event Invitees endpoint, under tracking.
Two practical points follow:
Pass the stored values, not the current URL. By the time a visitor opens the scheduler on the pricing page, the URL has no UTMs. Use the values saved on landing.
Map the tracking fields in your sync. If an automation in n8n, Zapier or Make creates the CRM contact from the booking webhook, add the tracking fields to that mapping. This is the step most often skipped.
How do you make the CRM keep the right source?
Store first-touch and last-touch campaign fields as separate properties on the contact, write the first-touch set once and never overwrite it, and match new submissions to existing contacts before creating new ones.
Three rules keep the data usable:
Write-once first touch. The original source should be set by the first submission or booking and protected from later updates, whether by a workflow condition or by only filling empty values.
Deduplicate on the way in. A booking that creates a second contact splits the history: the form fill has the UTMs and the booking has the meeting. Clean Your CRM Data Before You Add AI covers matching rules and ownership.
Copy the source to the deal. Reports on revenue usually run on deals, not contacts. When a deal is created, copy the contact's first-touch fields onto it so the report doesn't depend on later contact changes.
If you are still choosing a CRM, HubSpot vs GoHighLevel for Service Businesses Adding AI compares how the two handle forms, bookings and automation.
How do you test that attribution survives the whole journey?
Run a tagged test visit through every path a real buyer takes and check each tool for the values at the end. Do it before a campaign launches and after any change to the site, forms or automations.
Build a test link for each live channel with a unique campaign value, such as utm_campaign=test_linkedin_nov.
Click from the real ad preview or post, not a typed URL, so redirects and shorteners are included.
Browse to a second page before converting.
Submit the form and check the hidden fields arrived on the contact.
Book through the scheduler and check the tracking fields in its booking record or webhook.
Check the CRM contact and deal for first-touch and last-touch values.
Visit again with a different tag and confirm the first-touch values didn't change.
Delete or mark the test records so they don't sit in reports.
Write down where each test failed. The answer is usually one or two specific handoffs, not the whole stack.
How we approach it at Vizio AI
We start by drawing the journey as it is: every ad, link, redirect, page, form, scheduler, automation and CRM object a lead passes through. Then we run tagged test visits along each path and mark where the values stop.
The fixes are usually small and specific: one capture script, one set of field names shared across tools, hidden fields on every form, the tracking fields added to the sync, and write-once rules in the CRM. Only when the data arrives intact do we build reporting on top, as in our public work on a Marketing Data Dashboard and a Digital Marketing Analytics Dashboard.
This is part of the funnel and data work of our Growth Studio.
Sources
Google Analytics Help, URL builders: Collect campaign data with custom URLs: https://support.google.com/analytics/answer/10917952
Google Analytics Help, Set up cross-domain measurement: https://support.google.com/analytics/answer/10071811
Google Ads Help, About auto-tagging: https://support.google.com/google-ads/answer/3095550
MDN Web Docs, Referrer-Policy header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Referrer-Policy
HubSpot Knowledge Base, Set property values with hidden form fields: https://knowledge.hubspot.com/forms/pass-contact-property-values-with-hidden-form-fields
Calendly Help Center, How to track conversions with UTM parameters: https://calendly.com/help/how-to-track-conversions-with-utm-parameters
Calendly Help Center, How to source track your Calendly embed with UTM parameters: https://help.calendly.com/help/embed-options#how-to-source-track-your-calendly-embed-with-utm-parameters
Calendly Developer, Frequently asked questions: https://developer.calendly.com/frequently-asked-questions
Vizio AI, Clean Your CRM Data Before You Add AI: https://www.vizio.ai/resources/blog/crm-data-cleanup
Vizio AI, HubSpot vs GoHighLevel for Service Businesses Adding AI: https://www.vizio.ai/resources/blog/hubspot-vs-gohighlevel
Vizio AI, Marketing Data Dashboard: https://www.vizio.ai/works/marketing-data-dashboard-unified-insights-for-scalable-growth
Vizio AI, Digital Marketing Analytics Dashboard: https://www.vizio.ai/works/digital-marketing-analytics-dashboard
Vizio AI, Growth Studio: https://www.vizio.ai/studios/growth-studio











