Why does GA4 show the wrong (or missing) source/medium for a session that came from another domain?
Quick answer
When a visitor moves between two domains you control (a marketing site to a checkout domain, for example) without cross-domain measurement configured, GA4 treats the second domain as a brand-new, unrelated session - the original UTM-based source/medium is lost, and the new session gets attributed either to the first domain as a referral or to (direct)/(none) depending on browser referrer behavior. This is a configuration gap, not a bug, and it's fixed by explicitly linking the domains in GA4.
Why This Happens
Browsers don't inherently know that marketing-site.com and checkout.example.com belong to the same business - by default, GA4 (like any web analytics tool) treats a navigation between two different domains as a session boundary and a referral, because that's exactly what it looks like from the browser's perspective: traffic arriving from one domain to another.
GA4 solves this with the _gl linker parameter: when cross-domain measurement is configured, GA4 appends _gl= plus an encoded client/session ID to outbound links toward the linked domain, and the destination domain's GA4 tag reads that parameter to stitch the session together instead of starting fresh. If the domain isn't added to the cross-domain list, this parameter is never generated in the first place, so there's nothing for the second domain to read even if it's technically capable of reading it.
A related but separate cause is a referral exclusion gap: even with cross-domain configured, if the second domain isn't also added to GA4's Referral exclusion list, some traffic can still register as a self-referral (source = your own second domain) rather than joining the original session.
Fix It
Add every domain to the cross-domain measurement list
In GA4 Admin > Data Streams > your web stream > Configure tag settings > Configure your domains, add every domain a visitor might cross during a single journey (the marketing site, the checkout domain, any subdomain used for payments), not just the two you noticed a problem on.
Confirm the same GA4 property (and Measurement ID) is deployed on both domains
Cross-domain linking only works between data streams under the same GA4 property. If the second domain is tagged with a different GA4 property or Measurement ID entirely, no linker configuration will unify the sessions - that requires a property-level, not just tagging-level, decision.
Check that outbound links actually carry the _gl parameter
Inspect an actual outbound link from the first domain to the second in the rendered HTML or via a click - it should carry a _gl= query parameter. If it doesn't, the domain list configuration in the previous step likely wasn't saved or deployed correctly, or the link is being generated server-side in a way that bypasses gtag.js's link-decoration.
Add both domains to Referral exclusions as well
In the same Data Streams > Configure tag settings area, add every linked domain to the referral exclusion list so a legitimate cross-domain navigation isn't separately counted as a referral session on top of being correctly stitched.
How To Verify It Worked
Click from a page on the first domain to the second domain in an incognito window, then inspect the destination URL for a _gl query parameter before the page finishes loading - its presence confirms the linker is active; its absence means the domain configuration step above didn't take effect.
In GA4 DebugView, complete the same cross-domain click-through and confirm the session on the second domain shows the same ga_session_id/client thread as the first, with the original source/medium (e.g. google / cpc) intact rather than resetting to (direct) / (none) or the first domain's name as a referral.
Still Not Fixed?
We audit and fix GA4 implementations for a living - if this doesn't resolve it, the next step is usually a full event-by-event audit.
Talk to a GA4 Consultant