snorklee
Sign in Start free
Features AI traffic Pricing Manifesto Docs Audit Contact Sign in Start free

Technical deep-dive

Your Shopify store probably sets cookies before consent. Here's how to prove it in five minutes.

Turn on Shopify's cookie banner. Open the Network tab in a private window. Count the requests that fire before your first click. For a lot of stores, the number isn't zero — and that's the gap regulators actually look at.

Fred GaveauJune 16, 2026~9 min read

Here is a test you can run right now, on your own store, without any tool other than your browser:

  1. Open your storefront in a fresh private/incognito window.
  2. Before clicking anything on the cookie banner, open DevTools and look at the cookies that already exist and the network requests that already left.
  3. Now click Reject. Watch what gets deleted — and what keeps firing anyway.

If you've never done this, the result is often surprising. Not because Shopify is doing something wrong — it isn't — but because of the gap between what you configured in the admin and what the browser actually does on page load.

The blind spot: what you declare ≠ what the browser does

There are two very different things, and almost everyone conflates them.

The declaration. In your Shopify admin, you enable the consent banner, you tick the boxes, you wire up the Customer Privacy API. On paper, you're set.

The behavior. What a real browser does when a real visitor loads your page: which cookies get written to disk, which pixels fire, which third-party domains get contacted — and crucially, when, relative to the consent click.

The declaration lives in your admin. The behavior lives in the visitor's browser. A regulator auditing a site doesn't read your admin settings — they open the page, watch the network, and read the cookie jar. The browser is the source of truth. This isn't specific to Shopify; it's true of every web stack. But Shopify's defaults, themes, and app ecosystem make the gap easy to miss.

One disclaimer up front: I'm not a lawyer, and nothing here is legal advice or a compliance verdict. This is about what's technically observable in your browser. What it means for your specific situation is a question for qualified counsel.

A typical storefront load, on a timeline

before any click consent decision after acceptance
Schematic, not a measured statistic. The point is the shape: events land on both sides of the consent marker. Run the audit below to get the real timeline for your store.

The five real technical causes

1. Shopify's own cookies, and the "necessary vs analytics" grey zone

Shopify writes a set of first-party cookies more or less on load: _shopify_y, _shopify_s, _y, _s, plus cart and session cookies like cart, _secure_session_id, _shopify_essential. Some are genuinely necessary — a cart cookie makes the cart work. Others are analytics-flavored (the _y/_s family feeds Shopify's storefront analytics). The label "strictly necessary" is doing a lot of work here, and where exactly the line falls is contested. The practical takeaway: don't assume every Shopify cookie is in the "no consent needed" bucket just because Shopify set it.

2. The Customer Privacy API reports consent — it doesn't enforce it by itself

Shopify's Customer Privacy API (window.Shopify.customerPrivacy) is a good, real tool. It exposes the visitor's consent status — analyticsProcessingAllowed(), marketingAllowed() — and fires a visitorConsentCollected event when the visitor decides. But exposing a signal is not the same as blocking. It's up to each script, theme, and app to read that signal and gate themselves on it. A pixel that never checks customerPrivacy will fire regardless. The API hands you the consent state on a plate; whether your code actually waits for it is a separate question.

3. Pixels hard-coded at page load by older scripts or apps

This is the classic one. A Meta (Facebook) Pixel, a TikTok pixel, or a Google tag was pasted directly into theme.liquid two years ago, or installed by an app that injects it on every page. It runs in <head>, immediately, before the banner is even rendered. Shopify's modern Customer Events / web pixels sandbox exists precisely to route these through the consent layer — but a legacy hard-coded tag bypasses all of it. It doesn't know the banner exists.

4. A refusal that isn't fully propagated

Two failure modes here. First: cookies that were already written before the decision aren't deleted when the visitor refuses — they just sit there. Second: a script reads the consent state once, early, caches "no decision yet," and fires anyway because it never re-checks after the visitor clicks Reject. The banner says "rejected." The network says otherwise.

5. Third-party resources outside the banner's scope

Embedded YouTube videos (youtube.com), Google Fonts pulled from Google's CDN, a chat widget, a reviews widget, a map embed — each of these can set cookies or contact a third-party server on load, and many consent banners don't cover them at all because they're not "tags," they're embedded content. They sit in a blind spot of their own.

What you observe vs what you configured

Before any click
requests + cookies
After "Reject"
some still fire
After "Accept"
everything
Schematic of the three scenarios you'll test below. The bar lengths are illustrative — yours will differ. The shorter the first two bars, the closer your store's real behavior is to its declared behavior.

The five-minute DIY audit

This is the part worth bookmarking. No tooling, no extension, no account. Just your browser's DevTools and fifteen minutes the first time, five every time after. Steps are written for Chrome; Firefox and Safari are nearly identical.

  1. Open a clean private window Use Incognito (Ctrl/ + Shift + N). A clean profile means no leftover cookies skewing the result. Don't load your store yet.
  2. Open DevTools first Press F12 (or + Opt + I). Go to the Network tab. Tick Preserve log and Disable cache. Open it before you load the page so you catch the very first requests.
  3. Load your storefront — and stop. Don't click. Let the page settle. Do not touch the banner. This is scenario one: before any consent.
  4. Read the cookie jar Go to Application ▸ Storage ▸ Cookies (Firefox: Storage ▸ Cookies) and pick your domain. List everything already there. Each one of these was set before you decided anything.
  5. Read the network Back in Network, filter by domain. Type facebook, then tiktok, then google-analytics, googletagmanager, doubleclick, youtube. Any hit means a third party was contacted before consent. Note them.
  6. Scenario two: click "Reject" Now refuse. Then re-open the Cookies panel. Did the pre-set cookies disappear? Often they don't. Re-check the Network filters — do pixels still fire after the refusal? Note the difference.
  7. Scenario three: fresh window, click "Accept" Close everything, open a new Incognito window, reload, and this time accept. This is your baseline for "what fires with full consent" — useful to see what should have been gated in scenarios one and two.
Pro tip

In the Network tab, sort by the Time/Waterfall column and find the request triggered by your consent click. Everything above it that loaded a third-party domain happened before consent. That single view is the whole story.

Cookies you'll typically see, and when they land

Names and lifetimes vary by theme and Shopify version, so treat this as a field guide, not gospel. Categories are widely-used conventions, not legal classifications.

CookieTypically setUsual purpose
_shopify_y / _yon loadStorefront analytics, ~1 year
_shopify_s / _son loadAnalytics session, ~30 min
_shopify_sa_p / _shopify_sa_ton loadMarketing / attribution analytics
cart, cart_sig, cart_tsfunctionalThe shopping cart itself
_secure_session_idfunctionalCheckout / session
_tracking_consent, _cmp_aconsentStores the consent decision itself
_fbpon load*Meta Pixel — should wait for consent
_ga, _gidon load*Google Analytics — should wait for consent

* _fbp, _ga and friends are the ones to scrutinize: if they appear in scenario one (before any click), that's exactly the gap this article is about.

What to do about it — without dramatizing

None of this is a five-alarm fire. It's a config and hygiene problem, and it's fixable. Realistic moves, roughly in order of leverage:

FAQ

Does Shopify's consent banner block tracking on its own?
Not by itself. It collects and exposes the consent decision through the Customer Privacy API. Whether a given script honors that decision depends on how that script was integrated — through Customer Events (gated) or hard-coded (not gated).

Are Shopify's own cookies a problem?
Many are genuinely functional (the cart can't work without one). The grey area is the analytics-flavored ones. The honest answer is that the "necessary vs analytics" line is contested — which is exactly why observing the real behavior beats assuming.

Is this a Shopify-specific issue?
No. The same declared-vs-observed gap exists on WordPress, custom stacks, everywhere. Shopify actually ships strong primitives (Customer Privacy API, Customer Events). The gap is in configuration and third-party code, not the platform.

The shift in how you think about tracking

The one idea to keep: a tracking setup is only as good as its observed behavior, not its declared configuration. A ticked box in an admin panel is a claim. The network tab is the evidence. The two drift apart constantly — a new app, a theme update, a pasted snippet — and nobody notices because nobody looks.

So look. Five minutes in DevTools tells you more about what your store actually does than any settings page ever will. Run it on your own store today. Then run it on a competitor's — you'll never read a cookie banner the same way again.