{"id":1314,"date":"2026-08-19T00:52:30","date_gmt":"2026-08-18T22:52:30","guid":{"rendered":"https:\/\/www.sabatka.net\/cs\/?p=1314"},"modified":"2026-09-05T07:27:25","modified_gmt":"2026-09-05T05:27:25","slug":"cookie-lifetime","status":"publish","type":"post","link":"https:\/\/www.sabatka.net\/en\/cookie-lifetime\/","title":{"rendered":"Cookie Lifetime: Why GA4 Shows More Users Than You Actually Have"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Everyone has heard of cookies \u2014 we click through the consent banner on every website. Few people can actually explain what a cookie is, let alone the difference between a first-party and a third-party cookie. Yet this exact mechanic is what attribution, remarketing, and GA4&#8217;s ability to recognize a returning customer all depend on. And in some browsers, cookie lifetime is far shorter than most marketers assume.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button scroll_to_subscribe\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/www.sabatka.net\/en\/kontakt\/\">Contact me<\/a><\/div>\n\n\n\n<div class=\"wp-block-button linkedinShare\"><a class=\"wp-block-button__link wp-element-button\">Share on LinkedIN<\/a><\/div>\n<\/div>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">How many visitors does this actually affect? Across the projects I manage, I track browser share in traffic over time.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"939\" height=\"595\" data-src=\"https:\/\/www.sabatka.net\/wp-content\/uploads\/2026\/08\/browser-usage-en-2.png\" alt=\"\" class=\"wp-image-1326 lazyload\" data-srcset=\"https:\/\/www.sabatka.net\/wp-content\/uploads\/2026\/08\/browser-usage-en-2.png 939w, https:\/\/www.sabatka.net\/wp-content\/uploads\/2026\/08\/browser-usage-en-2-300x190.png 300w, https:\/\/www.sabatka.net\/wp-content\/uploads\/2026\/08\/browser-usage-en-2-768x487.png 768w\" data-sizes=\"(max-width: 939px) 100vw, 939px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 939px; --smush-placeholder-aspect-ratio: 939\/595;\" \/><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Across the (mostly Czech) sites I manage, the median Safari share is around 16 percent \u2014 roughly every sixth visitor. On some sites (with an Apple-leaning audience), it climbs to 24 percent, close to one in four. Firefox accounts for about 4 percent.<br>Why track Safari and Firefox specifically? Because these two browsers are the toughest on cookies \u2014 I&#8217;ll get into exactly how in a moment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One scope note upfront: this article focuses specifically on cookie lifetime. I know visitor identity also fragments for other reasons \u2014 typically access from multiple devices or multiple browsers. I&#8217;m deliberately leaving those aside to keep the topic manageable. So assume the real fragmentation in your data is somewhat worse than what I describe below.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">How Cookies and Storage Actually Work<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before we get into why cookies disappear, a quick primer: who actually sets them, and who they belong to.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A cookie can be set by the JavaScript in your tracking code, or by an HTTP header in the server&#8217;s response. And it can belong to the domain the visitor sees in the address bar (first-party), or to a completely different domain (third-party). A concrete example: you&#8217;re browsing <a href=\"http:\/\/shop.com\" target=\"_blank\" rel=\"noopener\">shop.com<\/a> \u2014 a cookie belonging to <a href=\"http:\/\/shop.com\" target=\"_blank\" rel=\"noopener\">shop.com<\/a> is first-party. If the same page also sets a cookie via the Facebook pixel&#8217;s HTTP header, that cookie belongs to <a href=\"http:\/\/facebook.com\" target=\"_blank\" rel=\"noopener\">facebook.com<\/a> \u2014 and that&#8217;s third-party.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The combination of these two axes determines how vulnerable a cookie is to browser intervention:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th>First-party (your domain)<\/th><th>Third-party (someone else&#8217;s domain)<\/th><\/tr><\/thead><tbody><tr><td><strong>JS-set<\/strong> (set by JavaScript)<\/td><td>The <code>_ga<\/code> cookie, where GA4 stores the visitor identifier \u2014 the most common case on the web<\/td><td>Classic third-party ad pixels \u2014 blocked in Safari and Brave; Firefox isolates them into a separate &#8220;cookie jar&#8221; per site (partitioning \u2014 the effect on cross-site tracking is the same); still work in Chrome<\/td><\/tr><tr><td><strong>HTTP-set<\/strong> (set by the server)<\/td><td>A cookie from server-side tracking, set by the server via the <code>Set-Cookie<\/code> header \u2014 typically with the <code>HttpOnly<\/code> attribute, so JavaScript can&#8217;t access it at all<\/td><td>Third-party trackers via HTTP header \u2014 practically non-functional today<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Google Analytics&#8217; tracking cookie is a JS-set first-party cookie \u2014 JavaScript sets it. That&#8217;s exactly why most of what follows in this article applies to it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you already know this mechanic, feel free to skip ahead \u2014 it won&#8217;t affect the rest of the article. Let&#8217;s get into why cookies vanish sooner than their coded expiration date, no matter what you set.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Cookie Lifetime in Safari, Firefox, and Chrome<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The cookie expiration date you set in code is only a ceiling. How long a cookie actually survives is decided by each browser on its own terms \u2014 and the differences are significant.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Safari: JS Cookies Survive a Maximum of 7 Days<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Safari&#8217;s ITP (<a href=\"https:\/\/webkit.org\/tracking-prevention\/\" target=\"_blank\" rel=\"noopener\">Intelligent Tracking Prevention<\/a>) has a hard limit: it purges JS-set cookies after 7 days. No debate, full stop. And when a visitor arrives via a link carrying a known tracker&#8217;s parameters in the URL \u2014 typically a click from an ad with <code>gclid<\/code> or <code>fbclid<\/code> in the address (a technique called link decoration) \u2014 the limit gets even tighter: 24 hours.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On top of that, since version 14 (2020) Safari inspects DNS records to detect CNAME cloaking (when a cookie hides behind your own subdomain, typically in server-side tracking setups), and since version 16.4 (2023) it also compares IP addresses: if the server setting the cookie in the HTTP response doesn&#8217;t match even the first half of the main domain&#8217;s IP address (this rule only kicks in without CNAME detection, i.e. with an empty CNAME chain), the cookie gets hit with the same 7-day limit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Apple turned on <a href=\"https:\/\/webkit.org\/blog\/17333\/webkit-features-in-safari-26-0\/\" target=\"_blank\" rel=\"noopener\">Advanced Fingerprinting Protection<\/a> by default for all browsing in Safari 26 (September 2025). Fingerprinting is a technique for identifying a visitor without cookies at all: a script reads a combination of browser and device properties \u2014 screen resolution, fonts, how graphics get rendered \u2014 and assembles them into a practically unique &#8220;fingerprint.&#8221; Safari now restricts known fingerprinting scripts (typically off-the-shelf libraries websites deploy for this purpose) from accessing that data, and it also won&#8217;t let them store a long-lived cookie or localStorage entry \u2014 so there&#8217;s nowhere to persist the fingerprint. In private browsing, it additionally strips tracking parameters from URLs. This is documented behavior from WebKit&#8217;s own blog; the precise impact on specific measurement tools isn&#8217;t clear yet.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Firefox: Doesn&#8217;t Delete Cookies, Isolates Them<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Firefox takes a different approach \u2014 as part of <a href=\"https:\/\/support.mozilla.org\/en-US\/kb\/enhanced-tracking-protection-firefox-desktop\" target=\"_blank\" rel=\"noopener\">Enhanced Tracking Protection<\/a>, it uses a mechanism called Total Cookie Protection. It doesn&#8217;t block third-party cookies; instead, it isolates each site into its own &#8220;cookie jar&#8221; (partitioning) \u2014 which amounts to the same outcome for cross-site tracking. But it leaves first-party tracking cookies alone; there&#8217;s no 7-day limit here like in Safari.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Chrome: You Can Set Cookies for Up to 400 Days<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Chrome behaves differently than you&#8217;d expect if you&#8217;ve heard that &#8220;cookies are dying.&#8221; You can set a cookie to expire up to <a href=\"https:\/\/developer.chrome.com\/blog\/cookie-max-age-expires\" target=\"_blank\" rel=\"noopener\">400 days<\/a> out, and despite years of announcements, Chrome still doesn&#8217;t block third-party cookies \u2014 Google officially killed Privacy Sandbox, the project meant to change that, in October 2025, and there&#8217;s currently no timeline for third-party cookies going away in Chrome. So the phrase &#8220;cookies are dying&#8221; applies in full force mainly to Safari and Brave.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Brave: The Strictest of All<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Brave typically makes up a small share of traffic \u2014 and in GA4 you usually won&#8217;t even see it listed separately, since it identifies itself as Chrome. But when it comes to cookies, it&#8217;s the strictest of the bunch: it caps JS-set cookies at 7 days just like Safari, limits HTTP-header cookies to 6 months, and blocks third-party storage entirely \u2014 a third-party site gets only temporary <a href=\"https:\/\/brave.com\/privacy-updates\/7-ephemeral-storage\/\" target=\"_blank\" rel=\"noopener\">ephemeral storage<\/a> that disappears the moment the visitor leaves.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">People Delete Cookies Too<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">On top of browser behavior, add device switching and manual cookie deletion \u2014 according to older studies, a third of users deleted cookies at least once a month (<a href=\"https:\/\/www.comscore.com\/Insights\/Press-Releases\/2007\/04\/comScore-Cookie-Deletion-Report\" target=\"_blank\" rel=\"noopener\">comScore 2007<\/a>), and nearly two-thirds of tracking cookies ended up blocked or deleted (<a href=\"https:\/\/www.globenewswire.com\/news-release\/2018\/03\/29\/1455753\/0\/en\/Flashtalking-Publishes-Industry-s-first-Cookie-Rejection-Index-for-Independent-Accurate-Analysis-of-Cookie-Rejection-Rates.html\" target=\"_blank\" rel=\"noopener\">Flashtalking 2018<\/a>). I haven&#8217;t found more recent research.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Treat those numbers as an illustration of the trend, not a current fact.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Your Own Consent Banner Can Delete Cookies Too<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">One more thing worth noting: your own consent banner can delete cookies too, if that&#8217;s enabled in its settings \u2014 before you start hunting for a browser bug, it&#8217;s worth checking so you don&#8217;t blame Safari for something you&#8217;re doing to yourself (<a href=\"https:\/\/www.sabatka.net\/en\/5-most-common-bugs-in-cookie-bar-configuration\/\">consent banner misconfigurations can skew your data in other ways too<\/a>).<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-794e3cfa wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\">\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1024\" height=\"1024\" data-src=\"https:\/\/www.sabatka.net\/wp-content\/uploads\/2026\/04\/null-did-you-know.png\" alt=\"V\u011bd\u011bli jste? \u2014 informa\u010dn\u00ed panel\" class=\"wp-image-936 lazyload\" data-srcset=\"https:\/\/www.sabatka.net\/wp-content\/uploads\/2026\/04\/null-did-you-know.png 1024w, https:\/\/www.sabatka.net\/wp-content\/uploads\/2026\/04\/null-did-you-know-300x300.png 300w, https:\/\/www.sabatka.net\/wp-content\/uploads\/2026\/04\/null-did-you-know-150x150.png 150w, https:\/\/www.sabatka.net\/wp-content\/uploads\/2026\/04\/null-did-you-know-768x768.png 768w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/1024;\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<h3 class=\"wp-block-heading\"><strong><strong>Lab note<\/strong><\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s like the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Half-life\" target=\"_blank\" rel=\"noopener\">half-life<\/a> of a radioactive sample \u2014 a cookie&#8217;s lifetime isn&#8217;t set by the date you code into it, but by whatever the browser allows. Your audience decays the same way, day by day. In Safari, though, it&#8217;s decay with an ultimatum: whoever doesn&#8217;t return within 7 days doesn&#8217;t decay partially \u2014 they decay completely.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">The Real-World Impact of Cookie Lifetime<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The result: the actual cookie lifetime is dictated by whichever rule is strictest for that particular visitor. On sites with a higher share of Safari or Firefox traffic, that lifetime shrinks significantly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And watch out for localStorage: it won&#8217;t save you in Safari \u2014 ITP wipes any script-writable storage (including localStorage) after 7 days of browser use without interacting with the site. Chrome and Firefox don&#8217;t clean it out this way, but you&#8217;re dealing with this problem because of Safari in the first place \u2014 so don&#8217;t expect more persistence from it.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Numbers From Practice<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">How much does one real person actually multiply in your data? A few years ago, I analyzed traffic on an intranet where I knew the user ID behind every single visit \u2014 and where people logged in repeatedly from the same devices. You couldn&#8217;t ask for better conditions for cookies to survive. Even there, the number came out at roughly <strong>2.1 GA4 users per one real person<\/strong> (one real person = one unique user ID).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For public websites \u2014 without logins, with a higher share of Safari and mobile traffic \u2014 I&#8217;d expect a noticeably higher number, easily three or more GA4 users per real visitor. I haven&#8217;t measured that one; it&#8217;s an estimate based on the mechanisms described above.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s why GA4 shows more users than you actually have: nobody vanished from your data. Everyone&#8217;s just being counted more than once.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">The Impact on Measurement and Marketing<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">All of this stays academic until you run it against your own purchase cycle. What actually happens when a cookie dies before the customer&#8217;s path to purchase is complete?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Multi-visit attribution breaks.<\/strong> GA4 links visits from the same visitor via the <code>_ga<\/code> cookie (client_id). If the cookie dies between a visit from a campaign and the visit where the conversion happens, GA4 won&#8217;t connect the two. The conversion gets attributed to the last source \u2014 often direct \u2014 and the customer looks brand new in your data, even though they&#8217;ve known your brand for weeks. (Direct traffic has other, far more common causes too \u2014 poorly tagged UTM parameters or redirects that don&#8217;t preserve them. Cookie decay is one contributing factor, not the whole explanation.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Affiliate commissions disappear.<\/strong> Affiliate systems commonly set a 30-day cookie window. If it&#8217;s a JS-set first-party cookie (the common setup today), that window is effectively 7 days in Safari \u2014 the remaining 23 days exist on paper only. A third-party affiliate cookie doesn&#8217;t work in Safari at all.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The conversion window for ad platforms shrinks.<\/strong> <code>gclid<\/code> and <code>fbclid<\/code>, which Google Ads and Meta Ads use to measure conversions, get stored in <code>_gcl_aw<\/code> \/ <code>_fbc<\/code> \u2014 JS-set first-party cookies that typically get hit with an even stricter 24-hour limit in Safari: they&#8217;re created right after a click from a domain ITP classifies as a tracker (<a href=\"http:\/\/google.com\" target=\"_blank\" rel=\"noopener\">google.com<\/a>, <a href=\"http:\/\/facebook.com\" target=\"_blank\" rel=\"noopener\">facebook.com<\/a>), with a click ID in the URL \u2014 exactly the conditions of the link decoration rule. Platforms compensate for some of this loss through modeling via enhanced conversions \u2014 more on that in the section on moving beyond cookies.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Remarketing splits into two layers with different impact.<\/strong> Classic remarketing via third-party cookies doesn&#8217;t work in Safari at all \u2014 and hasn&#8217;t since 2020, not &#8220;after 7 days.&#8221; Audiences built from first-party data (GA4 audiences, lists built from <code>gclid<\/code>) do work, but they lose anyone who doesn&#8217;t return within 7 days.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A\/B tests get noisier.<\/strong> A visitor whose cookie has expired might get a different test variant on their next visit than the one they saw the first time. That doesn&#8217;t break the test \u2014 but the added noise extends how long it takes to reach statistical significance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">None of these impacts is a catastrophe on its own. Added together, they hurt.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Evaluating Measurement Setups<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you want a cookie that actually survives, it needs to be:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Set via an HTTP header (not JavaScript)<\/li>\n\n\n\n<li>First-party \u2014 ideally on the exact same domain (e.g. <a href=\"http:\/\/www.myshop.com\" target=\"_blank\" rel=\"noopener\">www.myshop.com<\/a>)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The simplest setup \u2014 classic client-side Google Tag Manager (GTM) plus GA4 \u2014 has exactly the cookie lifetime described in the previous section. Nothing more, nothing less. It&#8217;s also the simplest and cheapest option, and for plenty of sites with a short purchase cycle, it&#8217;s entirely sufficient.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once a company starts considering server-side tracking cookies (<a href=\"https:\/\/www.sabatka.net\/en\/co-to-je-server-side-mereni-sgtm\/\">I covered what server-side tracking is and why it matters<\/a> in a separate article), it typically runs into three variants of server-side Google Tag Manager (sGTM) \u2014 and each solves a different piece of the problem:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Setup<\/th><th>Safari lifetime<\/th><th>Blocking resistance<\/th><th>Complexity \/ cost<\/th><\/tr><\/thead><tbody><tr><td>Classic GTM + GA4 (client-side)<\/td><td>7 days (JS cookie), third-party cookies don&#8217;t work at all<\/td><td>Low \u2014 blocked by both ITP and ad blockers<\/td><td>Low<\/td><\/tr><tr><td>sGTM on a subdomain, default Cloud Run deployment<\/td><td>Still 7 days \u2014 the CNAME cloaking trap (see below)<\/td><td>Medium \u2014 bypasses script blocking, not the ITP limit<\/td><td>Medium<\/td><\/tr><tr><td>Google Tag Gateway<\/td><td>No change \u2014 still 7 days (solves script blocking, not the ITP limit)<\/td><td>High for the Google stack, zero for everything else<\/td><td>Low to medium<\/td><\/tr><tr><td>sGTM behind your own infrastructure with matching IP<\/td><td>Full coded expiration (up to 400 days in Chrome)<\/td><td>High across tools<\/td><td>High<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The closer you get to having the server set the cookie instead of JavaScript, the less the ITP 7-day limit affects you.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Here&#8217;s a trap that catches almost everyone who sets up server-side tracking on their own: sGTM on a subdomain via the default Google Cloud Run deployment.<\/strong> It looks like a solution \u2014 the cookie is now &#8220;set by your server.&#8221; Except the default way of connecting a subdomain to Cloud Run goes through a CNAME record pointing to a Google server (<a href=\"http:\/\/ghs.googlehosted.com\" target=\"_blank\" rel=\"noopener\">ghs.googlehosted.com<\/a>) \u2014 and that&#8217;s exactly the pattern Safari has flagged as CNAME cloaking since version 14, cutting the cookie&#8217;s lifetime down to 7 days. And even if you connect the subdomain directly via an A record to Google&#8217;s IP, a second safeguard catches it starting in version 16.4: Safari compares the server&#8217;s IP address against the main domain&#8217;s IP, and if not even the first half of the address matches, the cookie takes the same hit. The client thinks they&#8217;ve fixed it. They haven&#8217;t.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Google Tag Gateway is a newer offering from Google \u2014 and it&#8217;s worth being precise here, because the name invites a wrong assumption. Gateway doesn&#8217;t solve the ITP 7-day limit or the trap described above; JavaScript still sets the cookies, so Safari trims them to 7 days exactly as before. It solves a different problem: script and request blocking (ad blockers, signal loss), by routing everything through your own domain. From a cookie lifetime standpoint, it&#8217;s not a fix. It also does nothing at all for tools outside the Google stack (Meta, affiliate systems, CDPs).<br>I consider Google Tag Gateway a solid option for companies that measure almost exclusively through Google and are mainly fighting blocking.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The last option \u2014 sGTM behind your own infrastructure with the same IP as your main domain \u2014 solves the problem most completely.<br>If you&#8217;re already using Cloudflare or a similar CDN, or a Cloud Load Balancer, this can be relatively straightforward. If not, this path is fairly demanding.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">What Makes Sense for Whom<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before you decide to change anything, work out three numbers: how long your purchase cycle is, what share of Safari you have in your audience, and how much you&#8217;re willing to invest.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">An online store where people buy within two days of their first visit is dealing with a completely different problem than a B2B company with a three-month decision cycle. For the first, Safari&#8217;s 7-day limit barely matters \u2014 most conversion paths fit inside it. For the second, it can wipe out attribution for customers who return repeatedly over the course of weeks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You&#8217;ll find your Safari share in GA4&#8217;s browser report over the last 90 days. If it&#8217;s under 10 percent and your purchase cycle is short, stick with the classic GTM + GA4 setup \u2014 the investment in server-side tracking won&#8217;t pay off, unless you have another solid reason: typically fighting ad blockers or needing better conversion data quality for campaigns.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If your Safari share is high (typically B2C brands with an Apple-leaning audience) and you also have a longer cycle or rely heavily on remarketing and affiliate, server-side tracking makes sense \u2014 but choose based on the previous section, not on whatever the first agency pitches you. Google Tag Gateway is enough if you measure almost exclusively through Google. Otherwise, plan for the more demanding option.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the end, budget decides between &#8220;good enough to patch it up&#8221; and &#8220;let&#8217;s solve this properly&#8221; \u2014 both answers are legitimate, as long as you&#8217;re working from numbers, not anxiety.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Moving Beyond Cookies<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cookies aren&#8217;t the only way to connect a visit to a conversion.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Most tools today can connect visits and conversions through hashed personal data \u2014 email, phone number, or a login user ID. Google Ads has enhanced conversions for this, Meta has advanced matching, and GA4 has the User-ID feature; <a href=\"https:\/\/www.sabatka.net\/en\/who-reads-forms-on-your-website-and-do-you-know-about-it\/\">I covered how platforms hash personal data<\/a> in the context of web forms. More advanced companies go a step further and connect customer identity across sources (website, CRM, online store) in a customer data platform (CDP) \u2014 that&#8217;s called identity resolution, and it deserves an article of its own.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you have a longer purchase process, this is a direction well worth considering: identity built on login or email doesn&#8217;t depend on whether a cookie survived the week.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Whether your attribution and remarketing actually work, or just look like they work, comes down to two things: cookie lifetime and how well you handle visitor identity. A cookie on its own isn&#8217;t a durable identifier \u2014 it&#8217;s a fragile thing whose survival is largely dictated by the browser, not by your settings in some admin panel. If your purchase cycle runs longer than a week, your Safari measurement is systematically lying to you \u2014 typically for every sixth visitor, and on some sites every fourth.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;ll take a look at your Safari share and purchase cycle length and tell you whether it&#8217;s worth changing your setup \u2014 and if so, how.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button scroll_to_subscribe\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/www.sabatka.net\/en\/kontakt\/\">Contact me<\/a><\/div>\n\n\n\n<div class=\"wp-block-button linkedinShare\"><a class=\"wp-block-button__link wp-element-button\">Share on LinkedIN<\/a><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Everyone has heard of cookies \u2014 we click through the consent banner on every website. Few people can actually explain what a cookie is, let alone the difference between a first-party and a third-party cookie. Yet this exact mechanic is what attribution, remarketing, and GA4&#8217;s ability to recognize a returning customer all depend on. And [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1315,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,28,10,34],"tags":[],"class_list":["post-1314","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-digital-analytics","category-google-analytics-ga4","category-google-tag-manager-gtm","category-server-side-gtm"],"_links":{"self":[{"href":"https:\/\/www.sabatka.net\/en\/wp-json\/wp\/v2\/posts\/1314","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sabatka.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sabatka.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sabatka.net\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sabatka.net\/en\/wp-json\/wp\/v2\/comments?post=1314"}],"version-history":[{"count":9,"href":"https:\/\/www.sabatka.net\/en\/wp-json\/wp\/v2\/posts\/1314\/revisions"}],"predecessor-version":[{"id":1401,"href":"https:\/\/www.sabatka.net\/en\/wp-json\/wp\/v2\/posts\/1314\/revisions\/1401"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sabatka.net\/en\/wp-json\/wp\/v2\/media\/1315"}],"wp:attachment":[{"href":"https:\/\/www.sabatka.net\/en\/wp-json\/wp\/v2\/media?parent=1314"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sabatka.net\/en\/wp-json\/wp\/v2\/categories?post=1314"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sabatka.net\/en\/wp-json\/wp\/v2\/tags?post=1314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}