TrackingDesk

privacy·attribution·data

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.

BrowserWhen it stripsWhich listWhat a script on the landing page can read
FirefoxOnly in Strict Enhanced Tracking Protection, in normal and private windows. Off in the default Standard modePublished: 22 parameters in Mozilla Remote SettingsWhatever survived the strip
BraveBy default, on every cross-site GET navigation while Shields are up. Same-site links are exemptPublished: 65 parameters for every site, plus rules for Instagram, X and YouTubeWhatever survived the strip
SafariPrivate Browsing, or all browsing if the user turns on Advanced Tracking and Fingerprinting ProtectionNot published. WebKit’s post uses known_tracking_param as its exampleThird-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.

ParameterWhoseFirefox (Strict)Brave
gclidGoogle Adsstrippedstripped
gbraidGoogle Ads (iOS app)strippedkept
wbraidGoogle Ads (iOS web)strippedstripped
srsltidGoogle Merchant Center free listingskeptstripped
msclkidMicrosoft Advertisingstrippedstripped
fbclidMetastrippedstripped
ttclidTikTokkeptstripped
li_fat_idLinkedInkeptkept
ScCidSnapchatkeptkept
rdt_cidRedditkeptkept
epikPinterestkeptkept
_glGoogle Analytics cross-domain linkerkeptstripped
utm_source, utm_medium, utm_campaignUTMkeptkept

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. ttclid is not on it, though Brave strips it.
  • Brave keeps gbraid and strips wbraid. Google’s Data Manager API treats both as Google Ads click IDs, next to gclid. 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 from shop.example to pay.example becomes two users and two sessions, and the checkout session starts without the campaign that brought the visitor. Same-site moves, like www.shop.example to checkout.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

  1. 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_medium of cpc and no click ID, split by browser.
  2. 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.
  3. 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