Cross-domain tracking
One person,
not two strangers.
Cross-domain tracking keeps one visitor counted as one when they move between your websites on different domains, such as a blog on example.com and a shop on example-shop.com. Analytics recognises a returning browser by an ID in a first-party cookie, and a cookie belongs to one registrable domain: every subdomain of example.com can read it, example-shop.com can’t. So at the moment of the click, the tag adds the ID to the link (GA4’s _gl parameter) and the page on the other domain reads it back. Subdomains don’t need any of this. Below: how it works, a domain map that tells you what to link and writes the lists for GA4 and Builderify, and the usual reasons it stops working.
By the Builderify team
How cross-domain tracking works:
a cookie, a domain, a link.
MDN puts the cookie rule plainly: a cookie set for a domain is available to “that domain and all its subdomains”, and a page can only set one for its own domain or a parent of it, never a public suffix such as com, co.uk or github.io. Everything else follows from that.
Same domain
GA4 sets its cookies “on the highest level of domain possible”, so a page on blog.example.com writes them to example.com, where every subdomain can read them. Builderify does the same. Nothing to configure.
Different domains
No cookie can cross from one registrable domain to another. So at the moment of the click, the tag adds the visitor’s ID to the link, and the page on the other side reads it and keeps it. Google’s linker parameters expire after two minutes.
Someone else’s page
Your tag doesn’t run on a payment or booking page another company hosts, so there’s nothing to link. When the visitor comes back, that page can look like the site that sent them. GA4’s fix is the unwanted referrals list.
The Public Suffix List names the suffixes “under which Internet users can (or historically could) directly register names”: com and co.uk, and also platform addresses such as myshopify.com and github.io. The registrable domain is that suffix plus one label: example.co.uk, example-store.myshopify.com. Browsers refuse a cookie on the suffix itself, so two Shopify stores never share one.
The source domain’s “first-party measurement cookie values”, added at the click.
Both expire after two minutes, and both are read by the page they land on. Neither carries a name or an email: just the IDs analytics would have kept in a cookie anyway.
Which of your domains need linking?
Map them.
List every address your visitors move between, main site first: its subdomains, a shop, a booking or payment page. The map groups them by registrable domain, says what each needs, and writes the lists to paste into GA4 and Builderify.
Paths, ports and www. are ignored. Up to 12 addresses.
2 domains to link to example.com, and 2 hosted pages to list as unwanted referrals.
-
-
example.com Shared cookieexample.comblog.example.com
2 hosts under example.com read one cookie set on example.com: one visitor, no setup.
-
example-shop.com Link itexample-shop.com
A different domain from example.com, so no cookie crosses. List example-shop.com as a linked domain and add the snippet there.
-
example.co.uk Link itexample.co.uk
A different domain from example.com, so no cookie crosses. List example.co.uk as a linked domain and add the snippet there.
-
stripe.com Hostedcheckout.stripe.com
Stripe runs this page, so your own script isn’t on it. Nothing to link; list it in GA4 as an unwanted referral.
-
calendly.com Hostedcalendly.com
Calendly runs this page, so your own script isn’t on it. Nothing to link; list it in GA4 as an unwanted referral.
example-shop.com example.co.uk
example.com example-shop.com example.co.uk
checkout.stripe.com calendly.com
+− How the map decides
Each address is lower-cased, its scheme, path, port, trailing dot and leading www. are dropped, and it’s grouped by its registrable domain. Rather than the whole Public Suffix List (about 16,500 lines in October 2026), the map knows the 45 two-part suffixes Builderify itself uses, so the domain it prints is the one Builderify will store:
co.uk · org.uk · ac.uk · gov.uk · me.uk · ltd.uk · plc.uk · com.au · net.au · org.au · co.nz · org.nz · co.za · co.jp · ne.jp · com.br · com.mx · com.ar · com.tr · com.sg · com.my · com.hk · co.in · co.il · co.kr · com.cn · com.tw · com.ua · com.pl · com.ro · github.io · wixsite.com · myshopify.com · squarespace.com · webflow.io · netlify.app · vercel.app · pages.dev · herokuapp.com · blogspot.com · wordpress.com · framer.website · framer.app · carrd.co · hubspotpagebuilder.com
Three of the platform ones, squarespace.com, wordpress.com and hubspotpagebuilder.com, aren’t on the official list; the map still treats every site under them as separate, because each one belongs to someone else. A two-part suffix it doesn’t know, such as com.es, is mistaken for a domain, so check those by hand. Stripe, PayPal and Calendly are recognised as hosted pages; tick “I can’t add a script here” on any other.
GA4 cross-domain tracking
in five steps.
Google’s own example is “a customer website and a separate shopping cart domain”. The setup lives in the web data stream, not in your tag code, and the domain map above gives you both lists.
-
01
Use one tag everywhere
Install the same Google tag on every domain, with the same G- ID from the same web data stream. Google requires it: two IDs are two streams, and nothing links them.
-
02
Configure your domains
In Admin › Data collection and modification › Data streams, open your web stream, then Configure tag settings › Configure your domains. Accept any recommended domains, and add a condition for each domain the map lists, your main one included. Contains covers a domain and its subdomains. You need the Editor role; the limit is 100 conditions.
-
03
List unwanted referrals
Back in Configure tag settings, choose Show all › List unwanted referrals and add the hosted pages from the map: payment providers above all. Stripe’s own GA4 guide says to add checkout.stripe.com. Up to 50 per stream. Some hosted pages measure themselves instead: Calendly connects one GA4 Measurement ID per organisation, on its paid plans.
-
04
Leave subdomains alone
With the tag’s default cookie settings, Google says “activity is measured across subdomains without any extra configuration”. Only a subdomain whose tag sets a different cookie domain causes self-referrals.
-
05
Test it
Open a page, click a link to the other domain, and check that the address you land on contains _gl. If a form crosses domains, submit it too. Then look for one user, not two, in Realtime.
Measuring conversions on the far side, like a thank-you page on the shop? The guide to tracking conversions by URL covers the goal itself.
Cross-domain tracking not working?
Six usual suspects.
Start with one test: click through to the other domain and look at the address bar. Whether _gl never shows, shows and vanishes, or arrives and still makes two visitors tells you which of these it is.
-
01
_gl never appears
The link’s domain doesn’t match a condition in Configure your domains, or a script on the page stops the click from reaching the tag. Google’s linker listens for the click as it bubbles up to the page.
Fix Check the spelling and match type; test with a plain link on an empty page.
-
02
It appears, then vanishes
A redirect on the other side dropped the query string: http to https, bare domain to www, a language or country redirect.
Fix Link straight to the final address, or make the redirect keep _gl, as Google suggests.
-
03
Buttons and script redirects
Navigation “triggered by JavaScript as opposed to a direct response to a user action” isn’t decorated: a button that sets window.location, or a checkout button that fetches a URL first.
Fix Use a real link. Where you can’t, the destination needs the ID passed by hand.
-
04
Two different G- IDs
The shop was set up with its own property, or a theme ships a second tag. The destination can’t use an ID from another stream.
Fix One ID, one web data stream, on every domain.
-
05
The payment page “sends” sales
Buyers return from PayPal or Stripe, and the visit looks like a referral from the payment provider.
Fix Add the provider to List unwanted referrals. Linking wouldn’t help: your tag doesn’t run on their page.
-
06
Someone shared a linked URL
Copy a decorated address and it carries your ID to whoever opens it.
Fix Nothing to do. Google’s linker parameters expire after two minutes, so a shared link starts a fresh visitor.
Setting up the linker by hand in gtag.js instead? Forms are left out unless decorate_forms is true, and the destination accepts incoming links only once its own domains list has a value or accept_incoming is set.
Track visitors across domains
without GA4.
Builderify’s User Journey works the same way as GA4’s linker, with one setting instead of a data stream: list the other domain, put the same snippet on it, and a visitor who reads your blog and buys in your shop is one visitor with one path. It uses cookies to do it, so it isn’t cookieless; if you need that, the Google Analytics alternatives guide compares the tools that are.
Each new visitor costs 0.1 credits, out of 250 free each month; see pricing. Moving off GA4 altogether? Read how to replace Google Analytics without losing your history. And if the trip between domains starts at a short link in a post, the affiliate click guide explains why browsers send only the site a click came from, and direct traffic covers visits that arrive with no source at all. A button that moves people between domains with a script? Count it with a click goal instead.
What Builderify does
-
Subdomains share the visitor with no setup: the
_bdf_jidcookie (400 days) and the current visit’s cookie (30 minutes) are set on your registrable domain - Under Domains › Linked domains in User Journey settings, enter the other domain. Builderify keeps its registrable domain, and your website’s own domain joins the group automatically
-
A link onto another linked domain gets a
_bdfparameter the moment it’s pressed: the visitor ID, the visit ID and the time - The page on the other side takes over that visitor and visit, then removes the parameter from the address bar; it’s stripped from the URLs Builderify stores, too
- Moves between linked domains count as Internal, not as a referral, so a goal on the shop credits the journey that began on the blog
- A visitor carried across is charged once, 0.1 credits, not once per domain
- Settings show the hosts the snippet reported pages from in the last 30 days, grouped by domain, so you can see it’s on each one
Know this first
-
Only links are carried: an
<a href>pressed with a mouse, a finger or the Enter key. Form submissions, buttons that navigate with JavaScript, andwindow.open()aren’t - The same Builderify snippet has to be on both domains. A page without it can’t read the parameter
- The parameter is good for two minutes from the press, so a copied link starts its own visitor instead of borrowing yours
- A redirect that drops the query string drops the visitor with it. Link to the final address
- With Wait for cookie consent on, visitors accept analytics on each domain separately, and the journey carries over only if they do so within those two minutes
- Pages you can’t add the snippet to, such as Stripe Checkout or Calendly, aren’t tracked, and there’s no unwanted-referral list. A return within the 30-minute visit continues it; a later one starts a new visit credited to that site
Cross-domain tracking, before you ask.
Cross-domain tracking keeps one visitor counted as one when they move between your websites on different domains, such as example.com and example-shop.com. Analytics cookies can't cross from one domain to another, so the tag adds the visitor's ID to the link at the moment of the click and the page on the other domain reads it back.
Usually not. GA4 sets its cookies on the highest domain it can, so blog.example.com and shop.example.com share them with example.com, and Builderify does the same. You only need it between different registrable domains, such as example.com and example.co.uk.
Click through to the other domain and check the address bar for the _gl parameter. If it never appears, the domain is missing from Configure your domains, the sites use different G- IDs, or a script navigates instead of a real link; if it appears and then vanishes, a redirect is dropping it.
No: you can't add your tag to a payment page another company runs. List the payment domain as an unwanted referral in GA4 instead, as Stripe's own guide recommends for checkout.stripe.com, so returning buyers aren't credited to the payment page.
Yes. Subdomains share the visitor automatically, and links between domains you add under Linked domains in User Journey settings carry the visitor in a _bdf parameter that is valid for two minutes. Install the same snippet on every domain; form submissions and JavaScript redirects aren't carried.
Sources
Read on 13 October 2026.
- Analytics Help [GA4] Set up cross-domain measurement
- Analytics Help [GA4] Identify unwanted referrals
- Google for Developers Measure activity across multiple domains
- Google for Developers Configure and customize cookies
- MDN Set-Cookie: the Domain attribute
- Public Suffix List publicsuffix.org, and the list itself (version of 7 October 2026)
- Stripe Docs Analyze your conversion funnel (Checkout and GA4)
- Calendly Help Calendly + Google Analytics
Stop losing the visitors
you already paid for.
More leads from the traffic you already have, and follow-up that sends itself. Free to start. No card, no monthly fee.