October 8, 2026 · 5 min read
A Cross-Domain Tracking Bug That Looked Like a Traffic Drop
A client panicked over a sudden traffic collapse that wasn't a traffic problem at all — it was a cross-domain linker misconfiguration mislabeling real sessions as self-referral.
A client emailed me in a panic on a Monday morning convinced their referral traffic had collapsed over the weekend. Direct traffic had spiked by almost the same amount their referral traffic had dropped, which was the first clue — traffic rarely actually moves between those two channels in a real-world shift that clean. It usually means a measurement problem, not a behavior problem.
What was actually happening
The client ran a marketing site on one domain and a checkout flow on a second domain, linked together for the user journey but configured as two separate GA4 data streams without the cross-domain measurement settings properly extended to a subdomain change made the previous week. Users clicking from the marketing site to checkout were landing on the second domain with no linker parameter attached, so GA4 started a brand new session and, lacking a referrer it recognized as part of the same property, classified a chunk of those sessions as direct instead of continuing the original session's channel attribution.
The 'traffic drop' wasn't a drop at all. It was the exact same users, now split into two sessions each, with the second half of their journey reclassified into direct traffic. Total user count barely moved. The channel attribution was just wrong, and because direct and the original referral channel happened to shift by similar magnitudes, it read at first glance like a straightforward traffic story instead of a measurement break.
A traffic 'drop' that's mirrored by a traffic 'spike' somewhere else in the same report is almost never a real behavior change. It's a measurement system reclassifying the same users.
The fix and the lesson
- Re-added the second domain to the cross-domain measurement configuration list, which had been dropped during an unrelated stream cleanup.
- Verified the linker parameter was actually being appended to outbound links using DebugView, not just checking the settings page.
- Added a standing check: any domain change or subdomain migration triggers a mandatory cross-domain config review, not an optional one.
- Taught the client's team to check whether a 'drop' in one channel is mirrored by a 'spike' in another before escalating it as a real traffic event.