TL;DR
Most cross-domain advice written for Shopify solves a problem that stopped existing when checkout moved onto the merchant's own domain [4]. The hops that still break attribution sit outside the store: a quiz or funnel page on a separate domain, a redirect service between the ad click and the landing page, and a wallet flow you never tagged. GA4's cross-domain setup fixes the first one properly, as long as the same tag ID runs on both sides and nothing along the path drops the _gl parameter. The referral-exclusion list fixes a narrower problem, has a hard ceiling of 50 entries per stream, and does nothing retroactively. Anything that never reaches a browser tag has to be repaired on the server, from the order record.
Key Takeaways
- Without cross-domain measurement, each domain writes its own cookies, so one buyer becomes two users and two sessions in GA4 [1].
- The requirement people skip: every domain in the journey must carry the same Google tag ID, meaning the same web data stream. Two properties cannot be stitched this way [1].
-
Admin → Data collection and modification → Data streams → Web → Configure tag settings → Configure your domainsaccepts up to 100 conditions, evaluated with OR logic, and suppresses outbound-click events for the domains you list [1]. - The linker parameter rides on links and form submissions. Three documented ways it dies: a redirect that strips the query string, navigation triggered by JavaScript, and
Event.stopPropagation()on the click [1]. - Referral exclusions max out at 50 per stream and work by setting
ignore_referrer=true. Self-referrals and traffic arriving with_glare already ignored without a rule [2]. - On a custom-domain Shopify store, the whole journey including checkout runs on your domain, so storefront to checkout is not a cross-domain problem at all [4].
- Checkout-page tracking runs inside Shopify's sandboxed Web Pixels, and the Google tag deploys through the Google & YouTube app, which also sends Shopify-specific events carrying a
shopify_event_nameparameter [3].
Where a Shopify Funnel Really Loses the Source
The checkout.shopify.com exclusion you were told to add stopped being relevant when checkout moved onto the merchant's own domain [4]; we covered that shift and the headless exceptions in cross-domain tracking for Hydrogen and headless stores. This article is about the hops that are still real.
Three places, and only the first is a true cross-domain problem.
| Leak point | What the reader sees in GA4 | What fixes it |
|---|---|---|
| External landing page, quiz or funnel on its own domain | Two users, two sessions, purchase attributed to a referral from your own funnel domain | Cross-domain measurement: same tag ID plus a domain condition [1] |
| Redirect chain between the ad click and the landing page | Session source collapses to the redirector, or to direct if the query string was stripped | Shorten the chain, or make each hop forward the full query string [1] |
| Wallet and accelerated checkouts | Varies by wallet; check your own property rather than assuming | Server-side event with identifiers taken from the order |
The external landing page is the common one, and it is common because the tooling encourages it. Page builders, quiz apps, giveaway platforms and affiliate systems all like to own the first click. Each one that answers on its own hostname starts a fresh GA4 client ID for a person who is, as far as your reporting is concerned, brand new [1].
Affiliate links, link shorteners, QR redirects and vanity domains all sit between the ad and the store, and each hop is a chance for the parameters to be dropped. That failure looks identical to a person typing your URL. We went through the payout consequences of that in affiliate attribution on Shopify, where the same missing parameters decide who gets paid.
Wallet checkouts are the honest gap. What appears in your reports for those orders depends on the wallet and on your own configuration, and the safest move is to segment the orders in your own property and look, rather than repeat a claim you read somewhere. Our Shop Pay tracking piece covers what is actually verifiable there.
What Does GA4 Cross-Domain Measurement Actually Do?
It moves identifiers across the boundary in the URL.
When a visitor moves from one domain to another, the destination site cannot read the cookies the origin site wrote. GA4's answer is to append a linker parameter, _gl, to outbound links and form submissions pointing at the domains you have listed. The destination's tag reads that parameter and continues the same client ID and session instead of starting new ones [1].
Two conditions have to hold. The same Google tag ID, meaning the same web data stream, must be installed on every domain in the journey. And each domain must appear in the configuration. Google's documentation is direct about the consequence of skipping the setup: new cookies are created for each domain, and the single journey is reported as two separate users in two separate sessions [1].
One side effect catches people out. Once a domain is listed, GA4 stops treating clicks to it as outbound clicks, so those click events disappear from your reports [1]. That is correct behaviour, since the traffic is now internal, but if you built anything on outbound-click counts to your funnel domain, they go to zero on the day you configure this.
How Do You Configure It for an External Landing Page?
The prerequisite is the one people skip: the same Google tag has to run on the landing-page domain and on the store, which on the Shopify side is the tag that arrives through the Google & YouTube app [3]. With that in place, open Admin → Data collection and modification → Data streams → Web → Configure tag settings → Configure your domains, add the domains, then click a real link from the landing page and confirm a _gl parameter lands in the destination URL. Add one condition per domain. Conditions are combined with OR, and the stream accepts up to 100 of them [1].
If the linker cannot be used, for example because the navigation happens in code you do not control, Google documents a manual route: read the client ID on the origin with gtag('get'), append it to the destination URL yourself, and pass it into the config call on the receiving page [1]. It is more work and it breaks the moment someone edits the link, so treat it as the fallback rather than the plan.
Why Does _gl Keep Disappearing Between the Click and the Store?
Because something in the middle rewrote the URL.
Google names three specific failure modes, and every one of them shows up in real Shopify funnels [1]. A redirect that strips the query string kills the parameter before the destination tag can read it, which is what most link shorteners and affiliate redirectors do by default. Navigation triggered by JavaScript, rather than a plain anchor click, never gets the parameter appended in the first place. And Event.stopPropagation() on a click handler stops the tag's own listener from ever seeing the event, which is a favourite of pop-up and slide-out cart widgets.
The diagnostic is boring and it works. Click the link yourself, look at the address bar on the destination, and if _gl is absent, walk backwards through the hops until you find the one that dropped it. Then either remove that hop or configure it to forward the full query string.
There is a second-order effect here that is easy to miss. When _gl survives, GA4 treats the incoming traffic as internal and ignores the referrer automatically, no exclusion rule required [2]. So a broken linker does not only split the session. It also re-arms the self-referral you thought you had handled.
Referral Exclusions: The 50-Slot List and What It Cannot Do
Unwanted-referral rules are the blunter instrument, and they solve a narrower problem than most people ask of them.
A rule marks a referrer as unwanted, which sets ignore_referrer=true on the incoming traffic so the referral does not start a new session attribution [2]. Two categories are already handled for you: traffic from your own domain, and traffic arriving with a _gl parameter [2]. The list is capped at 50 entries per data stream [2].
Use it for the third parties you cannot tag: a payment page, a booking tool, an identity provider, anything that bounces the buyer through a host you have no code access to. Do not use it as a substitute for cross-domain measurement on a domain you own, because ignoring the referrer keeps the earlier source but still leaves the client ID split.
One detail from the same documentation reaches further than the feature itself. The key-event lookback window you choose also applies to session attribution [2]. Change one and you have changed the other, which is a quiet way for two reports to start disagreeing weeks after anyone touched a setting.
And the limit: none of this is retroactive. Sessions already recorded with the wrong source keep it. Google documents a second lag too: because of last-non-direct-click attribution, a user who first arrived via the excluded domain can still have later direct sessions credited to it after you add the rule [2].
What Survives When the Browser Tag Never Runs
Everything above depends on a tag executing in a browser that cooperates. Add an ad blocker, or a script that loads after the buyer has already moved on, and the browser-side capture never happens at all.
That is the case for repairing attribution from the order record instead of the page. The order carries a landing URL, and the landing URL carries whatever the ad platform appended when the buyer first arrived. WeltPixel Conversion Tracking reads it: when the browser-side capture is blocked, the app recovers the ad click ID from the order's landing URL and fills the gap [5]. A value the browser did capture always wins, so a channel that already has its click ID is never touched.
The same shape of repair is what stands between a Google Ads conversion and a blank row when the click identifier is missing on the page, which we worked through in Google Ads conversions without a GCLID. And orders that lose their source entirely end up in the bucket described in how Shopify attribution works, reported as direct because nothing better was available.
FAQ
Does cross-domain tracking work if my landing page uses a different GA4 property?
No. Cross-domain measurement requires the same Google tag ID, meaning the same web data stream, on every domain in the journey [1]. Two properties produce two sets of cookies and no way to carry a client ID between them. Move the landing page onto the store's stream, or accept the split.
How many domains can I add to a data stream?
Up to 100 conditions per web data stream, combined with OR logic [1]. Referral exclusions are a separate list with a lower ceiling of 50 entries per stream [2].
Will fixing this repair my old reports?
No. Cross-domain configuration and referral exclusions both apply going forward, and neither setting rewrites data already collected. Sessions already attributed to your funnel domain keep that attribution, and because of last-non-direct-click attribution, a user who first arrived via the excluded domain can still have later direct sessions credited to it after you add the rule [2].
What happens to my outbound-click events after I add a domain?
They stop for that domain. GA4 suppresses outbound-click events for domains listed in the cross-domain configuration, since the traffic is no longer treated as leaving your site [1]. Rebuild any reporting that counted those clicks on session or landing-page dimensions instead.
If your external funnel is already sending buyers to the store, install WeltPixel Conversion Tracking and check what the order records are carrying. The parameter is either in the landing URL or it is not, and that answer takes one order to get.
Sources
- [GA4] Set up cross-domain measurement, support.google.com/analytics/answer/10071811, accessed August 24, 2026
- [GA4] Identify unwanted referrals, support.google.com/analytics/answer/10327750, accessed August 24, 2026
- [GA4] Set up your Google tag on Shopify, support.google.com/analytics/answer/12183125, accessed August 24, 2026
- Shopify, Introducing checkout on your own domain, shopify.com/blog/introducing-checkout-on-your-own-domain, accessed August 24, 2026
- WeltPixel Conversion Tracking, Shopify App Store listing, apps.shopify.com/weltpixel-conversion-tracking, accessed August 24, 2026