Cross-domain measurement, and why it usually half-works
When a user journey spans two domains you own — a marketing site and a separate booking platform, say — GA4 treats them as two sessions from two sources unless configured otherwise.
The configuration is straightforward. The failure modes are not.
How it works
With cross-domain measurement enabled, links between listed domains get a _gl parameter appended, carrying the client identifier. The receiving domain reads it and continues the session rather than starting a new one.
Two conditions must both hold: both domains listed in the configuration, and the parameter surviving the journey.
Why the parameter goes missing
The link is generated by JavaScript after page load. The decorator ran before the link existed.
The link is inside an iframe. Common with booking widgets, and it needs separate handling.
A redirect strips query parameters. Very common — a link to example.com/book that redirects to booking.example.com/start may drop everything after the question mark, silently.
A form POST rather than a link. No URL to decorate.
The user opens it in a new tab from a right-click menu in some browsers.
Each produces the same symptom: mostly-working cross-domain measurement with an unexplained population of self-referrals.
Diagnosing it
Look for your own domains in the referral report. Any appearance means session continuity is breaking somewhere.
Then walk the journey manually, watching the URL. When the _gl parameter disappears, that step is the problem. This is tedious and it is the only reliable method.
The belt-and-braces settings
Configure cross-domain measurement in the data stream, and add both domains to unwanted referrals. They do different jobs — one links the sessions, the other prevents a new one starting — and together they degrade more gracefully.
When to stop trying
If the second domain is a third-party platform you cannot modify, and the parameter does not survive, cross-domain measurement will not work properly. Accept it, exclude the referral so attribution is not actively wrong, and measure the second domain's outcomes separately.
A clearly-labelled gap is far better than a number everyone believes and nobody has checked.