UTM Parameters Across Platforms: GA4, Meta, LinkedIn, HubSpot, Mailchimp, Adobe

Look, here is the situation most marketing teams I talk to are stuck in: they run paid campaigns on Meta Ads, sequenced nurture emails through HubSpot, broadcast newsletters from Mailchimp, paid search through Google Ads, ABM on LinkedIn, and the executive team wants one report in GA4 that shows what is working.
Six platforms. Six different ways of handling UTM parameters. One destination report.
The reason your GA4 looks like a mess of “direct / none” traffic and duplicate sources is not because UTM tracking is broken. It is because every platform handles UTM parameters slightly differently, and most teams treat them all the same.
I built linkutm because I lived this pain for years. So this article is the consolidated reference I wish someone had handed me earlier: how each of the six platforms most marketers use actually treats UTM parameters, what to watch out for on each, and how to keep your data clean when you mix them.

Quick Reference: How Each Platform Handles UTM Parameters
Before the per-platform breakdown, here is the cheat sheet. Bookmark this table.
| Platform | Auto-tags? | Manual UTM supported? | Special parameters added | Common pitfall |
|---|---|---|---|---|
| Google Ads | Yes (gclid) | Yes (final URL suffix) | gclid | Manual UTMs get stripped if final URL suffix is not configured |
| Meta Ads (FB/IG) | No | Yes (URL parameters field) | fbclid | fbclid added to URL but not used by GA4 |
| LinkedIn Ads | No | Yes (destination URL) | li_fat_id | UTMs missing means traffic shows as direct/none in GA4 |
| HubSpot | Adds tracking parameters | Yes (tracking URLs feature) | _hsenc, _hsmi | Both HubSpot tracking and UTM coexist; do not conflict but inflate URL |
| Mailchimp | Optional (built-in GA tracking) | Yes (overrides auto) | mc_cid, mc_eid | Built-in tagging uses generic source=mailchimp_campaign |
| Adobe Analytics | No (destination platform) | Yes via processing rules | cid (Adobe’s preferred) | Adobe ignores UTMs unless you write a processing rule |
Three things stand out from this table. First, only Google Ads truly auto-tags. Second, every platform adds its own click-ID parameter that travels alongside UTMs. Third, Adobe Analytics does not use UTM at all out of the box. Real talk: most attribution problems trace back to one of these three facts.
GA4 Is the Destination, Not the Source
Quick foundation before the platform breakdown. GA4 does not generate UTMs. It only reads them.
When a user clicks a tagged URL, GA4 parses utm_source, utm_medium, utm_campaign, utm_content, and utm_term from the URL and populates the corresponding dimensions: Session source, Session medium, Session campaign, Session manual ad content, and Session manual keyword. That is it.
If your URL has no UTMs and no recognized referrer, GA4 records the session as (direct) / (none). If your URL has UTMs but uses inconsistent casing across campaigns, GA4 splits them into multiple rows. There is no automatic correction.
That means every platform-specific quirk below ultimately affects what shows up in GA4. The honest limitation here: GA4 cannot fix bad UTM hygiene at the source. You have to tag clean.
How Google Ads Handles UTM Parameters
Google Ads auto-tags every URL with the gclid parameter (Google Click ID). This is the part most people miss: gclid does the heavy lifting for Google Ads attribution inside GA4. Manual UTMs are optional and can conflict with gclid.
When you connect Google Ads to GA4 with auto-tagging on, GA4 attributes paid search traffic using gclid alone. If you also add manual utm_source=google&utm_medium=cpc, the manual values can override the auto-tagged values in GA4 reports, which double-counts and confuses paid search reporting.
The fix is the final URL suffix. This is a Google Ads field where you append custom parameters that ride alongside gclid without overriding it. Use it for utm_content or utm_campaign values you want in GA4 but cannot get from gclid alone.
Example final URL suffix:
utm_content=responsive_search_ad&utm_term={keyword}
The {keyword} token is a Google Ads dynamic insertion that fills in the matched keyword at click time.
Honest limitation: gclid is opaque. You cannot read it in a spreadsheet or pivot it without joining to the Google Ads API. For human-readable reporting, you still want utm_campaign and utm_content filled in.
Reference: Google Ads Help on auto-tagging and final URL suffix.

How Meta Ads (Facebook and Instagram) Handle UTM Parameters
Meta Ads does not auto-tag for GA4. You add UTMs manually in the URL parameters field at the ad level or use Meta’s dynamic URL parameters to template them.
Meta supports dynamic URL parameters that get replaced at click time. The most useful ones:
utm_source=facebook&utm_medium=cpc&utm_campaign={{campaign.name}}&utm_content={{ad.id}}&utm_term={{adset.name}}
At click time, Meta replaces {{campaign.name}} with the actual campaign name, {{ad.id}} with the ad ID, and so on. This means every ad in the same campaign automatically inherits consistent UTMs without manual entry.
Meta also appends its own fbclid parameter to every outbound click. GA4 ignores fbclid, so it does not affect your reports. It does inflate the URL length, which can break tools that truncate URLs.
Honest limitation: {{campaign.name}} produces whatever the campaign was named in Meta Ads Manager. If your campaign is “Q2 2026 Test – Final v3”, that ugly string lands in your utm_campaign field in GA4. Decide your campaign naming scheme in Meta first, or your GA4 reports will read like internal notes.
Reference: Meta Business Help Center on URL parameters and dynamic parameters.
How LinkedIn Ads Handle UTM Parameters
LinkedIn Ads does not auto-tag. UTMs must be added manually to the destination URL at the ad level. There is no URL parameters field separate from the destination URL, like Meta has.
This is the single most common reason LinkedIn traffic shows up as (direct) / (none) in GA4, someone built the campaign, set the destination URL to https://yoursite.com/landing-page, and never appended UTMs.
The correct format:
https://yoursite.com/landing-page?utm_source=linkedin&utm_medium=cpc&utm_campaign=abm_q2_2026&utm_content=sponsored_content_video
LinkedIn also adds li_fat_id and a few other parameters for clicks. GA4 ignores all of them. They do not break anything, but they do clutter URLs.
LinkedIn does not support dynamic parameters the way Meta does. You either tag each ad manually or you use a bulk import tool to generate tagged URLs in advance.
Honest limitation: LinkedIn’s campaign tracking is the most manual of any major paid platform. There is no auto-fill, no template, no defaults. This is exactly the kind of repetitive work where a UTM builder saves hours per week if you run B2B ABM at any volume.
Reference: LinkedIn Marketing Solutions Help on conversion tracking and URL parameters.
How HubSpot Handles UTM Parameters
HubSpot is interesting because it reads UTM parameters AND adds its own. When a visitor lands on a HubSpot-hosted page from a tagged URL, HubSpot:
- Reads the five standard UTM parameters and stores them on the contact record.
- Adds
_hsenc(encoded email) and_hsmi(HubSpot mailing ID) when the click came from a HubSpot email. - Records the original source in the contact’s “Original source drill-down” property.
This means a URL clicked from a HubSpot marketing email will look like:
https://yoursite.com/?utm_source=hubspot_email&utm_medium=email&utm_campaign=product_launch&_hsenc=p2ANqtz-...&_hsmi=98765432
The _hsenc and _hsmi parameters do not conflict with UTMs. HubSpot uses them for its own attribution; GA4 ignores them. The URL just gets longer.
HubSpot also has a built-in Tracking URL Builder under Reports > Analytics Tools > Tracking URL Builder. It generates UTM-tagged URLs and stores them in a library. It is fine for HubSpot-only teams. It does not enforce naming conventions, so if two team members use it independently you end up with utm_source=facebook and utm_source=Facebook in the same report.
Honest limitation: HubSpot’s tracking URL builder is HubSpot-aware but stack-blind. It does not know about your Google Ads or Mailchimp campaigns. For a single source of truth across the stack, you need a tool that lives outside HubSpot.
Reference: HubSpot Knowledge Base on tracking URLs and the _hsenc/_hsmi parameters.

How Mailchimp Handles UTM Parameters
Mailchimp is the platform most likely to surprise marketers because of its Google Analytics link tracking toggle in campaign settings.
When this toggle is on, Mailchimp auto-generates UTM parameters on every link in the email:
utm_source=[generic_default]&utm_medium=email&utm_campaign=[Campaign Title from Mailchimp]
The utm_source defaults to a generic identifier set in your Mailchimp account, often something like [Audience Name]. The utm_campaign is the Mailchimp campaign title verbatim.
This works, but only as well as your Mailchimp campaign naming. If your campaigns are titled “Untitled – Copy 3” inside Mailchimp, that lands in GA4 as your campaign name. Most teams do not realize this until they open GA4 and see it.
Mailchimp also adds its own mc_cid (campaign ID) and mc_eid (email ID, encoded recipient identifier) parameters separately. These are Mailchimp-internal and do not affect GA4.
If you turn the Google Analytics link tracking toggle off, Mailchimp sends untagged URLs and you tag them manually in the email HTML. This is the route I recommend when you want full control over UTM values across multiple email tools.
Honest limitation: Mailchimp’s built-in tagging is convenient but lazy. The defaults give you traceable but ugly campaign names. Either rename every Mailchimp campaign carefully or turn the auto-tagging off.
Reference: Mailchimp documentation on Google Analytics link tracking.
How Adobe Analytics Handles UTM Parameters
Adobe Analytics does not use UTM parameters by default. Adobe uses its own cid parameter (campaign ID) and expects a different URL syntax:
https://yoursite.com/?cid=email_q2_launch_2026
That single cid value gets mapped to a “tracking code” dimension in Adobe Analytics, which then can be exploded into campaign, channel, and creative via Marketing Channel Processing Rules or Classifications in the Adobe Admin Console.
To make Adobe read UTM-tagged URLs, you have two options:
- Build a processing rule that copies
utm_source,utm_medium, andutm_campaigninto the equivalent Adobe variables on hit ingestion. - Append both
cidandutm_*parameters to outbound URLs and let each analytics platform read what it understands.
Option 2 is what most multi-tool stacks do. Your URL ends up with both:
https://yoursite.com/?cid=email_q2_launch_2026&utm_source=email&utm_medium=newsletter&utm_campaign=q2_launch
Both Adobe and GA4 read what they need.
Honest limitation: Adobe Analytics is its own world. Most marketing teams use it because enterprise IT chose it, not because they prefer it. If your stack is Adobe-primary, talk to your Adobe admin about processing rules before you standardize on UTMs alone.
Reference: Adobe Experience League documentation on tracking codes and marketing channels.
The Cross-Platform Consistency Problem
Here is the thing nobody warns you about until it bites: every platform above lets you choose your own UTM values. None of them enforces consistency across
platforms.
These are the consistency failures I see most often:
- Casing inconsistency: One campaign uses
utm_source=Facebook(from the social manager in Meta), another usesutm_source=facebook(from the email designer in HubSpot). GA4 treats these as two separate sources and splits attribution. - Medium drift: Same channel tagged as
utm_medium=cpcin Google Ads,utm_medium=paidin Meta, andutm_medium=ppcin LinkedIn. Your paid channel is now three rows in GA4. - Campaign name fragmentation:
utm_campaign=q2_launchvsutm_campaign=Q2-Launchvsutm_campaign=q2 launch(the last one breaks because spaces get URL-encoded to%20). - Redirects stripping UTMs: Some link shorteners and some ESP redirect chains drop URL parameters. Always test the end URL to confirm UTMs survive.
A single typo in a single template means weeks of split data in GA4. And once the data is in, you cannot retroactively merge Facebook and facebook without complex BigQuery joins.

How to Enforce UTM Consistency Across Your Stack
The fix is not more discipline. Discipline fails at scale. The fix is to centralize UTM creation outside any single platform.
Here is the workflow I built linkutm to support:
- Define your taxonomy once: a written rules document listing accepted
utm_sourcevalues (all lowercase),utm_mediumvalues (a fixed list:email,cpc,social,display,affiliate,referral), and autm_campaignnaming pattern (e. g.,[quarter]_[product]_[audience]). - Build links in one place: use a UTM builder that enforces your rules, blocks invalid values, and templates campaign names so spelling drift cannot happen.
- Distribute tagged links to platform: paste the linkutm-built URL into Meta’s URL parameters, LinkedIn’s destination URL, HubSpot’s email body, Mailchimp’s campaign with auto-tagging off, and Google Ads’ final URL suffix.
- Audit weekly: pull GA4 source/medium report and confirm no duplicates. Any duplicate is a process gap that needs fixing in step 1.
linkutm’s UTM builder handles steps 1, 2, and 3 in one place. Naming convention rules block typos at creation. Templates auto-fill the values that should never change. The link library is the single source of truth across all six platforms above.
I am biased because I built it, so here is the honest part: any tool that enforces rules and centralizes creation will do the job. Spreadsheets work if your team is disciplined. The advantage of dedicated tooling is that it removes the human inconsistency that breaks at scale.

Frequently Asked Questions
Do UTM parameters work in every marketing platform?
UTM parameters work in any platform that lets you customize the destination URL. That covers Google Ads (via final URL suffix), Meta Ads, LinkedIn Ads, HubSpot, Mailchimp, and most email and ad platforms. Adobe Analytics reads UTMs only if you write processing rules to translate them. Platforms that do not let you customize URLs (some affiliate networks, some pop-up tools) cannot pass UTMs at all.
Is GCLID the same as utm_source for Google Ads?
No, but they overlap. GCLID is Google’s own click ID, auto-tagged on every Google Ads click. GA4 uses GCLID to attribute paid search even without UTMs. utm_source is a separate manual tag. If both exist, GA4 may prefer the manual UTM value over the GCLID-derived source, which can double-count. Use the final URL suffix for custom UTM_content without overriding GCLID.
Why are LinkedIn Ads showing as direct/none in GA4?
LinkedIn Ads does not auto-tag URLs with UTMs. If your destination URL has no utm_source and utm_medium, GA4 has no way to identify the click as LinkedIn-sourced and records it as direct/none. Fix: add ? utm_source=linkedin&utm_medium=cpc&utm_campaign=[name] to every LinkedIn destination URL.
Can HubSpot tracking URLs break GA4 attribution?
No. HubSpot’s _hsenc and _hsmi parameters are ignored by GA4. They coexist with UTMs in the same URL without conflict. The URL just gets longer, which is fine.
Does Mailchimp need both Google Analytics link tracking and manual UTMs?
No, pick one. If you turn Mailchimp’s built-in Google Analytics link tracking on, it auto-generates UTMs and overwrites any manual ones in the email HTML. If you want full control over utm_source and utm_campaign values, turn the toggle off and tag URLs manually. The toggle-on path is fine for solo teams; toggle-off is better for multi-tool stacks where consistency across email and paid matters.
Do I need different UTMs for each platform?
You need different utm_source values per platform (one each for google, facebook, linkedin, mailchimp, hubspot_email). You should reuse the same utm_campaign value across platforms for the same initiative so GA4 can aggregate channel-level data into one campaign report. utm_medium should map to a consistent channel-type taxonomy: cpc for all paid search, social for organic social, paid_social for paid social, email for email, and so on.
Wrap Up
Six platforms, six quirks, one report. The platforms will keep doing what they do. Your job is to layer one consistent taxonomy on top of them so GA4 stops showing you fragmented data.
Start with a written rules doc, build every campaign link through one tool that enforces those rules, and audit GA4 source/medium weekly. That is the entire system.
To build tagged links that follow your rules across every platform, try linkutm’s UTM builder. Free tier covers small teams. The whole point is to remove the human inconsistency that breaks GA4 attribution.