Most of the time your UTMs are working; they just say the wrong thing. The most common error is utm_medium=social on paid ads, which sends paid LinkedIn traffic into Organic Social in Google Analytics and into Organic social or “Other campaigns” in HubSpot, never Paid social. Check the medium on your live ads first, then check whether the parameters survive to your forms and CRM.
First, rule out the expected gaps
Not every missing UTM is a fault. Check these before you rebuild anything:
- Native lead forms never carry UTMs. A LinkedIn Lead Gen Form or a Meta Instant Form fills inside the platform. There’s no web session, so there’s nothing for a UTM to attach to. Those leads come through lead sync instead.
- Old records predate the fix. If you changed your tagging last week, contacts created before that keep the old values.
- Some traffic is genuinely untagged. People who see an ad and later type your URL arrive as direct traffic. No UTM setup will catch that.
- Reporting lag. Analytics and CRM reports can trail live traffic by a day or so. Wait before judging a change.
Causes, most to least likely
1. Paid traffic carries an organic medium
Analytics tools sort traffic into channels by reading utm_medium. In Google Analytics 4, the default channel group treats a medium as paid only when it contains “cp”, is exactly “ppc” or “retargeting”, or starts with “paid”. A medium of “social” lands in Organic Social. HubSpot’s traffic source rules work the same way. A medium of “social” with a source that exactly names a recognized network, such as “linkedin”, is Organic social. If the source isn’t an exact match (“LinkedIn Ads”, say), the visit usually falls into Other campaigns. Paid social needs a medium containing “paid”, “ppc” or “cpc”, or a source or medium containing “paidsocial”.
This catches many teams out because LinkedIn’s own developer example uses utm_medium=social.
How to confirm: In GA4, open the Traffic acquisition report and set the dimension to Session source / medium. Look for linkedin / social or facebook / social with real volume during a paid campaign. In HubSpot, check whether paid campaigns show up under Organic social or Other campaigns.
2. The same value is spelled several ways
Google Analytics states that UTM values are case sensitive: utm_source=google and utm_source=Google are different sources. LinkedIn, linkedin and linkedin.com become three rows. When several people or an agency build links by hand, this drift is almost certain.
How to confirm: Export a month of source and medium values from GA4 or your CRM. Sort them and look for near-duplicates.
3. A redirect strips the parameters
Some redirects drop everything after the question mark. Common culprits are http to https, a missing or extra “www”, a trailing slash rule, or a link shortener. The ad platform shows clicks, but the CRM shows contacts with no UTMs and no click IDs, across every channel pointing at that domain.
How to confirm: Click one of your live ads (not the preview). When the landing page loads, check the address bar. If the UTMs are gone, a redirect removed them.
4. The form has no hidden fields for UTMs
Analytics can see the UTMs while your CRM saves none. That happens when a form, often an embedded or third-party form, has no hidden fields to capture them. Any visitor who browses a second page before converting also loses them unless a script stores the first values.
How to confirm: Land on the site with a test UTM, submit the form and look at the new CRM record. Empty UTM fields with analytics showing the session means the form is the break.
5. Missing values show as “(not set)”
Google Analytics says missing UTM parameters result in “(not set)” in reporting. It recommends always using utm_source, utm_medium and utm_campaign together. Links that only carry a source, or that use a dynamic value which returned blank, fill reports with “(not set)”.
How to confirm: Filter GA4 for “(not set)” in Session campaign and see which source it pairs with.
6. Dynamic values aren’t set up, or don’t apply
Hand-typed campaign names break the moment someone renames a campaign. Dynamic values fill in automatically, but each platform has limits:
- LinkedIn: dynamic UTM tracking fills values such as campaign ID, campaign group ID, account ID and creative ID or name. It doesn’t work on Message Ads or Conversation Ads.
- Google Ads: ValueTrack parameters such as
{campaignid},{adgroupid}and{keyword}fill in at click time. There is no campaign-name parameter, so use the ID.{keyword}is blank when an ad matched without a keyword, as in Performance Max.
How to confirm: Open the tracking template or URL parameters at account and campaign level in each platform. Check whether new ads inherit them or each ad carries its own hand-built URL.
The recommended UTM standard
PipeHalo recommends this standard. It follows the Google Analytics and HubSpot rules above so paid traffic always classifies as paid.
| Parameter | Value |
|---|---|
| utm_source | linkedin, google, bing, facebook, instagram (lowercase) |
| utm_medium | paid_social or cpc |
| utm_campaign | the platform’s campaign ID, e.g. 123456789 |
| utm_content | ad or creative ID |
| utm_term | keyword (search) or audience name (social) |
Use paid_social for LinkedIn, Meta and other social platforms, and cpc for Google and Microsoft search. Both pass the GA4 paid test. paid_social also contains “paid”, which HubSpot needs for Paid social.
The fix, step by step
Do the cheapest, most reversible steps first.
- Fix the medium on live ads. Change
utm_medium=socialtopaid_socialon every paid social campaign. This takes minutes and corrects all new traffic. - Write the standard down. Put the table above in a shared doc. Lowercase only, no spaces, hyphens or underscores used the same way everywhere.
- Set templates at the highest level. In LinkedIn, set dynamic UTMs at account or campaign level. In Google Ads, set a tracking template with ValueTrack at account or campaign level so new ads inherit it. Keep Google auto-tagging on so the gclid still flows. If you use HubSpot ads attribution, keep its
hsa_parameters too. - Fix redirects. Ask your web team to make every redirect keep the query string. Point ads at the final URL, not one that redirects.
- Add hidden fields to every form. Capture
utm_source,utm_medium,utm_campaign,utm_content,utm_term, plus click IDs: gclid, li_fat_id and fbclid. Store first-touch values in a cookie so they survive a second page view. - Map native lead forms through lead sync. For LinkedIn and Meta lead forms, pass the campaign ID through your lead sync into the CRM, since UTMs can’t.
- Clean the CRM. Use a workflow to lowercase source and medium values and merge known variants.
How to tell the fix worked
- Same day: a click on a live ad lands with all five parameters intact.
- Within a week: paid LinkedIn and Meta traffic shows in Paid Social in GA4 and Paid social in HubSpot, and the old linkedin / social row stops growing.
- Within 30 days: fewer than 15% of new paid contacts lack UTMs or carry a campaign value that matches none of your campaigns. That is where PipeHalo starts flagging.
- Ongoing: each source appears in one spelling only, and “(not set)” rows for paid traffic are close to zero.
Past data won’t reclassify itself. Note the date you fixed it so trend reports aren’t misread.
How PipeHalo catches this
PipeHalo’s “broken or missing UTMs” check runs every morning against your connected ad accounts and CRM. It looks at people who came in from each ad platform in the last 30 days and counts those with no UTMs, no utm_campaign, or a utm_campaign that matches none of your campaigns. It flags the platform when at least 5 people and 15% of them are affected, and marks it high at 40%. The flag shows the counts, examples of values that didn’t match, and “What to try” steps. PipeHalo keeps checking every day, and an open flag clears itself once the share drops back under the line. It needs HubSpot or Salesforce connected. Every plan includes a CRM connection. See all 15 checks on the features page and how pipeline by channel depends on clean source data, or try the live demo.
Related questions
Are UTM parameters case sensitive?
Yes. Google Analytics treats utm_source=google and utm_source=Google as two different sources. Use lowercase everywhere.
Why does my paid LinkedIn traffic show as organic social?
Your utm_medium is probably “social”. GA4 and HubSpot only treat a medium as paid when it signals paid, for example paid_social or cpc.
Do LinkedIn Lead Gen Forms pass UTMs?
No. The form fills inside LinkedIn, so there is no web visit to carry UTMs. Use lead sync to bring the campaign into your CRM instead.