Browsers strip your click IDs and leave your UTMs
Published 2026-11-06
Most teams treat a missing click ID as a tagging fault: auto-tagging switched off, a redirect that drops the query string, a landing page that rewrites the URL. Some of those clicks lost the ID on purpose. Three browsers remove click IDs from the URL as the visitor arrives, and none of them touches your UTM parameters.
We ran one ad-click URL through the two strip lists that are published. Firefox in Strict mode and Brave both remove Google’s, Meta’s and Microsoft’s click IDs. Neither removes LinkedIn’s, Snapchat’s, Reddit’s or Pinterest’s. All three UTMs survive in both. The visit still shows up in analytics with its campaign. The ad platform can’t match it to a click.
When each browser strips, and what it reads
Read from each vendor’s own source on 6 November 2026. Every cell is in facts above with its source.
| Browser | When it strips | Which list | What a script on the landing page can read |
|---|---|---|---|
| Firefox | Only in Strict Enhanced Tracking Protection, in normal and private windows. Off in the default Standard mode | Published: 22 parameters in Mozilla Remote Settings | Whatever survived the strip |
| Brave | By default, on every cross-site GET navigation while Shields are up. Same-site links are exempt | Published: 65 parameters for every site, plus rules for Instagram, X and YouTube | Whatever survived the strip |
| Safari | Private Browsing, or all browsing if the user turns on Advanced Tracking and Fingerprinting Protection | Not published. WebKit’s post uses known_tracking_param as its example | Third-party scripts get no query string at all, kept parameters included |
What this does not cover: Chrome and Edge, which we found no published navigation strip list for, and browser extensions, which carry their own lists. The worked example below applies each browser’s published rules; it is not a capture from a live browser session.
One URL, two strip lists
The URL a visitor might land on if every platform tagged the same click. The 11 click IDs come from 9
platforms. Google’s _gl is the GA4 cross-domain linker, not an ad ID, and is there because Brave lists
it.
https://shop.example/landing?utm_source=google&utm_medium=cpc&utm_campaign=bf26
&gclid=…&gbraid=…&wbraid=…&srsltid=…&msclkid=…&fbclid=…&ttclid=…
&li_fat_id=…&ScCid=…&rdt_cid=…&epik=…&_gl=…
A Python script checked each parameter against both lists as downloaded on 6 November.
| Parameter | Whose | Firefox (Strict) | Brave |
|---|---|---|---|
gclid | Google Ads | stripped | stripped |
gbraid | Google Ads (iOS app) | stripped | kept |
wbraid | Google Ads (iOS web) | stripped | stripped |
srsltid | Google Merchant Center free listings | kept | stripped |
msclkid | Microsoft Advertising | stripped | stripped |
fbclid | Meta | stripped | stripped |
ttclid | TikTok | kept | stripped |
li_fat_id | kept | kept | |
ScCid | Snapchat | kept | kept |
rdt_cid | kept | kept | |
epik | kept | kept | |
_gl | Google Analytics cross-domain linker | kept | stripped |
utm_source, utm_medium, utm_campaign | UTM | kept | kept |
Firefox removes 5 of the 11 click IDs and Brave removes 6. They agree on 4: Google’s gclid and
wbraid, Meta’s and Microsoft’s. Four survive both lists: LinkedIn’s, Snapchat’s, Reddit’s and
Pinterest’s.
Three details in that table are worth a second look.
- Firefox’s strip list has not grown since March 2023. The last record that added parameters was
modified on 13 March 2023.
ttclidis not on it, though Brave strips it. - Brave keeps
gbraidand stripswbraid. Google’s Data Manager API treats both as Google Ads click IDs, next togclid. The two lists disagree on one of Google’s three. - Brave strips
_gl. That is not an ad click ID. It is how GA4 carries one session from your site to a checkout on another domain. In Brave, a visitor who moves fromshop.exampletopay.examplebecomes two users and two sessions, and the checkout session starts without the campaign that brought the visitor. Same-site moves, likewww.shop.exampletocheckout.shop.example, are exempt.
Two ways to lose the ID, and only one you can fix
The browsers do two different things, and the difference decides what you can recover.
Firefox and Brave rewrite the URL before the request leaves the browser. Brave’s filter acts on the
request itself, and Firefox strips on redirects too, so a click that passes through the platform’s
redirect loses the ID on the way. Your server never receives the parameter. Server-side tagging does not help,
because the value never reached a server. Meta’s advice to read fbclid from the HTTP request is sound,
and in these two browsers there is nothing to read.
Safari does that, and then it hides the rest from scripts. After a cross-site navigation in Private
Browsing, a third-party script that reads location.search gets an empty query string. Google’s own
setup page loads the Google tag from www.googletagmanager.com, another site’s domain. So in Safari
Private Browsing the UTMs Safari kept are in the URL, and a tag installed that way may still not see
them. Your server does see them, because they were sent with the request. Safari 26 added a related rule
for all known fingerprinting scripts: they cannot read query parameters or the referrer.
That gives the rule. A parameter removed before the request is gone for everyone. A parameter hidden from scripts is still in your server’s access log and in anything your own first-party code reads from the request.
What it costs
For Google, the cost is stated plainly: Google calls the GCLID required for Google Ads website conversion tracking. A conversion from a stripped click can still reach Google Ads through other identifiers. Google’s Data Manager API accepts a hashed email, the landing page IP address or a lead ID in place of a click ID. Without one of those it is a signal loss the platform reports as fewer conversions, or fills with a model.
Analytics doesn’t see the same gap. The UTMs arrive, so the session keeps its campaign, and GA4 and the ad platform disagree about a click that both of them saw. Read the gap between them as partly tracking prevention, not only as attribution-model difference.
What to do differently
- Capture the query string on your server, on the first request. Store every click ID and UTM that
arrives, against the visitor, before any script runs. This recovers what Safari hides from scripts. It
cannot recover what Firefox and Brave removed, so count those separately: landings with a
utm_mediumofcpcand no click ID, split by browser. - Send a second match key with every conversion. A hashed email or phone through Google’s Data Manager API, Meta’s Conversions API or Microsoft’s equivalent is the only way a stripped click still matches. On LinkedIn, Snapchat, Reddit and Pinterest the click ID alone still survives Firefox and Brave.
- Keep checkout on the same site, or stop relying on
_gl. A checkout on a subdomain is same-site and Brave leaves the linker alone. A checkout on a payment provider’s domain loses it, and with it the campaign on the session that converts.
Option two is what most platforms already push you towards. When the click ID is gone and no hashed email matches, the platform falls back to a model of the conversions it could not see. How much traffic does an account need before that model even switches on?
Sources
- Firefox's query-stripping list in Mozilla Remote Settings has three records. Strip list: gclid, dclid, msclkid, _openstat, yclid, wickedid, twclid, _hsenc, __hssc, __hstc, __hsfp, hsctatracking, wbraid, gbraid, ysclid (record last modified 13 March 2023), and mc_eid, oly_anon_id, oly_enc_id, __s, vero_id, _hsenc, mkt_tok, fbclid (12 April 2022). The third record, last modified 14 September 2023, adds googleadservices.com to the allow list and strips nothing. verified 2026-11-06
- In Firefox's default preferences, URL query string stripping is off in normal browsing (privacy.query_stripping.enabled: false) and in private browsing (privacy.query_stripping.enabled.pbmode: false). Stripping also applies to redirects when it is on (privacy.query_stripping.redirect: true). verified 2026-11-06
- Firefox's Strict Enhanced Tracking Protection setting includes qps (query parameter stripping enabled) and qpsPBM (query parameter stripping enabled in private windows). verified 2026-11-06
- Firefox 102.0 (28 June 2022) release notes: Firefox now mitigates query parameter tracking when navigating sites if you have enabled strict mode for Enhanced Tracking Protection. verified 2026-11-06
- Brave's query-filter list applies 65 parameters to every URL (*://*/*), among them gclid, wbraid, dclid, fbclid, msclkid, ttclid, twclid, srsltid and _gl. gbraid, li_fat_id, ScCid, rdt_cid, epik and utm_ parameters are not on it. Separate rules strip igsh, igshid and stkn on Instagram, a, ref_src, ref_url, s and t on Twitter and X, and si on YouTube. verified 2026-11-06
- Brave's query filter only acts on GET requests, exempts same-site requests and same-site redirects, keeps a parameter whose value is empty, and runs when Brave Shields are allowed for the site. It is on by default unless an administrator policy sets it. verified 2026-11-06
- Brave's request handler applies the query string filter only when Brave Shields are allowed and tracking query parameter filtering is enabled, and treats filtering as enabled unless the preference is controlled by policy. verified 2026-11-06
- Safari's Private Browsing removes a subset of query parameters identified as used for cross-site tracking granular to users or clicks when the user navigates between different websites. This happens before navigation, so the values are never sent over the network. Parameters used only for campaign attribution pass through. The post names no actual parameter; its example is known_tracking_param. verified 2026-11-06
- WebKit: after a cross-site navigation in Safari Private Browsing, all third-party scripts that read the full URL (location.search, location.href, document.URL) get a version with no query parameters or fragment. Safari also hides cross-site document.referrer from scripts in Private Browsing. verified 2026-11-06
- WebKit: all the Private Browsing protections are also available in regular browsing, through Advanced Tracking and Fingerprinting Protection set to All Browsing on iOS, iPadOS and visionOS, or Use advanced tracking and fingerprinting protection on macOS. verified 2026-11-06
- WebKit Features in Safari 26.0 (15 September 2025): Safari prevents known fingerprinting scripts from reading state that could be used for navigational tracking, such as query parameters and document.referrer. verified 2026-11-06
- Google's gtag.js setup page loads the Google tag from https://www.googletagmanager.com/gtag/js. verified 2026-11-06
- Google describes the GCLID as a URL parameter passed with ad clicks, turned on by auto-tagging, and required for Google Ads website conversion tracking. verified 2026-11-06
- Google's Data Manager API takes the Google Ads click ID in adIdentifiers as gclid, gbraid or wbraid. An event needs at least one of: an ad identifier, the landing page IP address, leadId, matchId, or user data such as a hashed email. verified 2026-11-06
- Google Merchant Center key event tracking adds a result id parameter, srsltid, to the URLs customers click through from free listings. verified 2026-11-06
- Google Analytics cross-domain measurement passes the cookie IDs from one domain to another in the _gl URL parameter. Without it, one visitor across two domains counts as two users and two sessions. verified 2026-11-06
- Meta's ClickID is the fbclid URL query parameter, and Meta recommends reading it server-side from the HTTP request URL's query string. verified 2026-11-06
- Microsoft Advertising: with auto-tagging, msclkid is appended to the landing page after an ad click, and Microsoft asks Conversions API senders to capture and store it. verified 2026-11-06
- TikTok's click ID, ttclid, is appended to the landing page URL when a user clicks a TikTok ad, and can be up to 1,000 characters long. verified 2026-11-06
- LinkedIn appends the click ID li_fat_id to landing page URLs when a user clicks a LinkedIn ad, once Enhanced conversion tracking is on in the Insight Tag. verified 2026-11-06
- Snap's Conversions API sc_click_id is the value stored in the landing page URL's ScCid query parameter. verified 2026-11-06
- Reddit's click ID, rdt_cid, is appended to the landing page URL when a user clicks through a Reddit ad. verified 2026-11-06
- Pinterest's epik is a unique click identifier passed as a query parameter in the URL after a click on a Pinterest ad. verified 2026-11-06