UTM vs gclid vs fbclid vs ttclid: The Click ID Reference
Last updated · published
Two tracking systems ride on the same URL, owned by different people.
UTM parameters are yours. You choose the values, any analytics tool reads them, and a human can understand them.
Click IDs belong to the ad platform. Google appends gclid, Meta appends fbclid, TikTok appends ttclid. The values are opaque, and they are useful mainly when sent back to whoever issued them.
Run both. UTMs feed your reporting, click IDs feed the platform’s attribution, and neither substitutes for the other.
TL;DR
- UTMs are analytics-owned and portable. Click IDs are platform-owned and opaque.
- When a click carries both, GA4 uses the auto-tagged values for source, medium and campaign. Your UTMs land in the Manual dimensions.
- Apple strips click identifiers in Mail, Messages and Private Browsing by default. UTM parameters survive.
- Click ID lifetimes vary from 7 days to a year and platforms revise them, so check before building a persistence strategy.
- Platform totals will never match analytics totals. That is structural, not a bug to fix.
The Two Layers
UTM parameters came out of Urchin, which Google acquired in 2005. Six named query-string fields, values you pick, readable by any tool that knows the convention.
Click IDs are issued per click by the ad platform. The platform appends the value, its own tag reads it on your landing page, and it ties that click to its internal auction and conversion records. You cannot decode it and neither can your warehouse.
One answers “where did this visit come from, in language a marketer understands across every channel”. The other answers “which specific click in our system produced this conversion”. Most production ad URLs carry both.
The UTM Parameters
Google documents utm_source as required, with utm_medium and utm_campaign strongly recommended, and the rest optional. Treating all three as mandatory is a house convention rather than a platform rule, and it is a good one.
| Parameter | Purpose | Example |
|---|---|---|
utm_source | The platform sending the traffic | google, linkedin, newsletter |
utm_medium | The channel category | cpc, email, paid-social |
utm_campaign | The campaign or initiative | 2026-q2-launch |
utm_term | Paid search keyword | campaign+tracking |
utm_content | Creative variant or placement | cta-top, variant-b |
utm_id | Campaign ID for cost-data joins | 1234567890 |
GA4 also reads utm_source_platform, utm_creative_format and utm_marketing_tactic, which most teams never populate.
A few encoding rules that save pain later. Lowercase everything, because values are case-sensitive in the dimension reports even though channel definitions are not. Keep values short, since long ones truncate in some surfaces. Never put personal data in a UTM, because the URL lands in browser history, CDN logs and referrer headers. And stick to ASCII letters, digits, hyphen and underscore, so nothing gets double-decoded by an intermediate redirect.
The Click ID Reference
Lifetime means how long the platform will match that identifier to a conversion, not how long it survives in the browser.
| Parameter | Platform | Lifetime | Pairs with UTMs |
|---|---|---|---|
gclid | Google Ads | 90 days for offline upload | Yes |
gbraid | Google Ads, iOS web-to-app | Aggregate, group level | Yes |
wbraid | Google Ads, iOS app-to-web | Aggregate, group level | Yes |
dclid | CM360, DV360 | Per Floodlight config | Yes |
fbclid | Meta | 90 days as _fbc | Yes |
msclkid | Microsoft Advertising | 90 days for offline conversions | Yes |
ttclid | TikTok | 7-day click window by default | Yes |
li_fat_id | 30 days from last click | Yes | |
twclid | X | Per attribution window | Yes |
ScCid | Snapchat | Per attribution window | Yes |
yclid | Yandex Direct | 21 days for offline uploads | Yes |
epik | 1 year as cookie | Yes | |
mc_cid, mc_eid | Mailchimp | Per campaign, per subscriber | Yes |
_kx | Klaviyo | Per subscriber | Yes |
igshid | Instagram shares | Not an ads identifier | No |
Those windows move. TikTok, LinkedIn, Yandex and Pinterest have all revised theirs, so verify against current documentation before sizing a conversion-upload pipeline on any of them.
Platform Notes
Google. Auto-tagging appends gclid by default, and the tag stores it in a first-party cookie for conversion matching. After App Tracking Transparency, Google added gbraid for iOS web-to-app journeys and wbraid for app-to-web, both carrying aggregate rather than per-user signal. If your server-side pipeline captures only gclid, you are dropping iOS attribution silently. Capture all three.
Meta. The Pixel reads fbclid and builds the _fbc cookie in the format fb.<subdomainIndex>.<creationTimeMillis>.<fbclid>. Values older than 90 days stop matching. Note that GA4 does not parse fbclid at all, so Meta traffic needs explicit UTMs to appear correctly in your reports.
TikTok. ttclid is the Events API’s click key, with a 7-day click window by default set on the ad group. Pass it in the callback field for server-side events.
LinkedIn. li_fat_id appears when Enhanced Conversion Tracking is on, and it is the strongest identifier for the Conversions API. Capture it at landing and store it against the session.
Microsoft. msclkid auto-tagging is enabled by default, and the UET tag stores it in a first-party cookie specifically to survive Safari’s cookie limits. The format is a GUID followed by a digit.
Snapchat. Pass ScCid as click_id inside the event’s user_data, or send the full landing URL and let Snap extract it. Note the casing: ScCid, not sccid.
Instagram’s igshid is the odd one out. It marks a share path on organic outbound links and is not paid attribution. Strip it before it fragments your landing page reports, and never count it as Meta Ads traffic.
Email identifiers like mc_eid and _kx identify recipients for the sending platform. They make every landing URL unique, which fragments page reports, so exclude them in your data stream’s redaction settings rather than in the unwanted referrals list, which filters referral sources rather than query parameters.
What iOS Strips
Apple removes known click identifiers from URLs in Mail, Messages and Safari Private Browsing by default. That default is a setting: Settings, Safari, Advanced, Advanced Tracking and Fingerprinting Protection offers Off, Private Browsing and All Browsing, so a visitor can disable it entirely or extend it to every Safari session.
Apple publishes no list, so everything below is community testing.
Most consistently reported as stripped: gclid, fbclid, msclkid, dclid, twclid and mc_eid.
Reported inconsistently across releases: gbraid, wbraid, li_fat_id and yclid. ttclid does not appear on current lists.
Not stripped: every utm_ parameter. They label a campaign rather than identify a person, which is why they fall outside the criterion.
That asymmetry is the single best argument for tagging every link, including Google Ads links that already auto-tag. When someone forwards your ad URL by message, the click ID is gone and your campaign attribution still arrives. The link tracking protection breakdown has the full picture, including the dispute about whether recent Safari versions moved the default.
Precedence, and the Mistake It Causes
Here is the rule that surprises people: when a click carries both a click identifier and manual UTMs, GA4 uses the auto-tagged values for source, medium and campaign. Your manual values populate the Manual dimensions instead.
So tagging a Google Ads link utm_source=adwords does not relabel that traffic inside GA4. It creates a second set of values in a different set of dimensions, and a warehouse join that reads the wrong one.
Outside GA4, your UTMs are the only campaign data anyone has, which is why you still set them.
Why the Numbers Never Match
Three systems, three counts, all defensible.
The ad platform counts clicks, including bounces and taps where the page never loaded. Analytics counts sessions where the tag fired. Your CRM counts the subset that converted and got written to a record.
Add cross-device journeys, blockers, stripped identifiers and consent denials, and you have several competing definitions of the same campaign.
The fix is not reconciliation. It is plumbing each system with the right identifier so each reports correctly on its own terms, then comparing them in a warehouse where the differences are visible rather than mysterious.
One Campaign, Four Platforms
The same launch running on Google, Meta, TikTok and LinkedIn, with one campaign value across all four:
https://example.com/launch?utm_source=google&utm_medium=cpc&utm_campaign=2026-q2-launch&utm_content=headline-a&gclid=...
https://example.com/launch?utm_source=facebook&utm_medium=paid-social&utm_campaign=2026-q2-launch&utm_content=carousel-v2&fbclid=...
https://example.com/launch?utm_source=tiktok&utm_medium=paid-social&utm_campaign=2026-q2-launch&utm_content=spark-3&ttclid=...
https://example.com/launch?utm_source=linkedin&utm_medium=paid-social&utm_campaign=2026-q2-launch&utm_content=single-image-b&li_fat_id=...
The campaign value is identical everywhere, so the four roll up cleanly. Source and content differ because the channels differ. Each click ID is different because each platform issued its own.
That only holds while the values are governed. One marketer writing Linkedin, another LinkedIn-Sponsored, a third forgetting the campaign code, and six weeks later the campaign report has a dozen variants of one campaign. Terminus, the marketing taxonomy governance platform, constrains those values at link creation, which is the only point where the fix is free.
Four Pitfalls
Redirects that drop parameters. Any click tracker, shortener or affiliate hop between the click and your page has to forward the query string. Test every one, because parallel tracking means the user goes straight to the final URL while measurement happens separately.
Tracking template double-encoding. Nested template syntax can arrive with %26 where an ampersand belonged, breaking every parameter after the first. Test in the platform’s preview tool rather than by eye.
Casing drift. Three spellings of one source are three rows in your reports and three values in every join, even though the channel itself still resolves.
Stale _fbc values. Meta drops matches for click identifiers older than 90 days, so a long-lived cookie replayed months later matches nothing. Fall back to hashed identifiers for older sessions.
FAQ
What is the difference between a UTM and a gclid?
A UTM is a value you choose that any tool can read. A gclid is an opaque per-click identifier only Google can interpret. Most paid links carry both.
Do I need UTMs if auto-tagging is on?
Yes, for everything outside GA4: your CRM, your warehouse, your other analytics tools. Inside GA4 the auto-tagged values take precedence for source, medium and campaign.
Which values win when both are present?
The auto-tagged ones. Manual UTMs populate GA4’s Manual dimensions rather than the standard ones.
What is ttclid’s window?
Seven days for click-through by default, set on the ad group rather than on the identifier.
Does iOS strip gclid?
Yes, in Mail, Messages and Private Browsing by default. UTM parameters survive, and users can turn the behaviour off or extend it to all browsing.
What is the difference between gclid, gbraid and wbraid?
gclid is the per-click identifier used on desktop and consented mobile traffic. gbraid covers iOS web-to-app journeys and wbraid iOS app-to-web, both carrying aggregate signal after App Tracking Transparency. All three are accepted for conversion uploads in their own fields.
Can I see fbclid in GA4?
Not as a traffic dimension. GA4 ignores it. Capture it with a custom dimension if you need it, and set UTMs so Meta traffic reports correctly.
Will click IDs replace UTMs?
No. They are platform-specific and opaque. As long as you buy across several platforms and report in one place, you need the portable layer too.
Every account starts with a 21-day trial, no credit card required.