foco
Back to Blog

Cross-Domain Tracking in GA4: Why 30% of Your Journeys Show as Direct

April 14, 2026 7 min read

Your customer clicks a Google Ad, lands on your marketing site, then moves to your checkout subdomain to complete purchase. GA4 shows the conversion as "Direct / (none)".

This happens when the session ID doesn't carry across domains. GA4 treats the checkout visit as a new session with no source attribution. Your paid media looks like it's underperforming while Direct traffic gets inflated credit.

I see this in 60% of GA4 audits for e-commerce brands with separate checkout domains, SaaS companies with app.domain.com subdomains, or any business where the customer journey spans multiple domains.

Why Cross-Domain Tracking Breaks

GA4 stores session data in first-party cookies. When a user moves from marketing.com to checkout.com, the browser treats these as separate origins. The GA4 cookies from the first domain aren't accessible on the second domain.

Without the original session cookie, GA4 generates a new client ID and session ID on the second domain. The connection to the original traffic source is lost. The conversion gets attributed to the last touchpoint the user can "remember" -- which is often Direct.

The Subdomain Problem

Even subdomains can break tracking if not configured correctly. A user journey from www.company.com to app.company.com should maintain the same session since they share the root domain. But GA4's default cookie settings often don't span subdomains.

I audited a B2B SaaS where 40% of trial signups were attributed to Direct traffic. The actual flow: user clicks LinkedIn ad → lands on www.company.com → clicks "Start Trial" → gets redirected to app.company.com/signup. GA4 lost the thread at the subdomain boundary.

URL Parameters Get Lost

Cross-domain links often strip UTM parameters. A user clicks an email with ?utm_source=newsletter&utm_campaign=spring_sale, lands on the main domain, then clicks through to the checkout subdomain. If the checkout link doesn't preserve those parameters, GA4 has no source information to work with.

Parameter stripping is invisible to most tracking setups

Your original domain receives and processes the UTM parameters correctly. But if those parameters aren't passed along when users move to other domains in your ecosystem, the downstream conversions lose all source attribution. This shows up as inflated Direct traffic, not as a tracking error.

How to Diagnose Broken Cross-Domain Tracking

Check Your Conversion Attribution

Pull a conversion report in GA4 for the last 30 days. Filter for your key conversion event (Purchase, Sign Up, etc.). Look at the source breakdown.

If "Direct / (none)" accounts for more than 15-20% of conversions, cross-domain tracking is the first thing to investigate. True direct traffic (people typing your URL into their browser) is rarely that high for most businesses.

Trace a User Journey

Open your site in an incognito window. Start from a UTM-tagged URL: yoursite.com?utm_source=test&utm_medium=cpc&utm_campaign=audit. Complete a typical user journey that crosses domains.

Open GA4's DebugView (Configure → DebugView) while doing this. You should see all events tied to the same ga_session_id. If you see a new session start when moving between domains, cross-domain tracking is broken.

Compare Source Reports Across Domains

If you have GA4 installed on multiple domains, check whether the source attribution is consistent. A user who starts on the marketing site via Google Ads should show as "google / cpc" in reports for both the marketing domain and the checkout domain.

Inconsistent attribution between domains means the session thread is breaking at the domain boundary.

The Technical Fix

Configure Cross-Domain Measurement in GA4

In your GA4 property settings, go to Admin → Data Streams → [your web stream] → Configure tag settings → Configure your domains.

Add all domains and subdomains where users might land: marketing.com, checkout.com, app.company.com, www.company.com.

This tells GA4 to treat these as part of the same site for tracking purposes.

Update Your gtag Configuration

In your Google Tag Manager or gtag implementation, add the linker parameter:

gtag('config', 'GA_MEASUREMENT_ID', {
  linker: {
    domains: ['marketing.com', 'checkout.com', 'app.company.com']
  }
});

This configures automatic link decoration. When users click links to other domains in your list, gtag automatically appends a _gl parameter containing the client ID and session information.

If you're using Google Tag Manager, the GA4 Configuration tag has a "Configure your domains" field under "More Settings." Add all your domains there.

Also ensure your GA4 Event tags inherit settings from the Configuration tag. If you have standalone Event tags with their own measurement IDs, they need the same cross-domain configuration.

The automatic link decoration only works if your cross-domain links go through gtag's click handler. Links that redirect through JavaScript or server-side redirects won't get decorated automatically.

For programmatic redirects, manually append the linker parameter:

// Get the linker parameter
const linkerParam = gtag('get', 'GA_MEASUREMENT_ID', 'linker_param');

// Append to your redirect URL
window.location = `https://checkout.com/cart?${linkerParam}`;
Test link decoration in the Network tab

After configuring cross-domain tracking, click a cross-domain link on your site. Look at the destination URL in the browser address bar. You should see a _gl parameter with a long encoded string. That parameter contains the session data needed to maintain attribution.

Common Implementation Mistakes

Forgetting Subdomains

Teams often configure company.com and checkout.company.com but miss www.company.com or app.company.com. Every subdomain users might land on needs to be in the configuration.

Mixed HTTP/HTTPS

If some of your domains use HTTP and others use HTTPS, specify the protocol in your domain list: https://secure.company.com instead of just secure.company.com.

Server-Side Redirects

Payment processors and third-party checkout systems often redirect through their own domains before landing back on your confirmation page. Those intermediate redirects break the session thread.

If you can't control the redirect flow, consider using the Measurement Protocol to manually send conversion events with the original session data.

Different GA4 Properties

Some teams use separate GA4 properties for different domains. Cross-domain tracking only works within a single GA4 property. If marketing.com uses Property A and checkout.com uses Property B, they'll never share session data.

Advanced: Server-Side Cross-Domain Tracking

For complex multi-domain setups, server-side GTM provides more control over cross-domain session management.

With sGTM, you can:

  • Manually pass client IDs between domains via secure server-to-server communication
  • Store session data in a shared backend system instead of relying on browser cookies
  • Handle attribution for flows that go through third-party systems (payment processors, SSO providers)

This requires custom client and tag templates in sGTM, but it works reliably even when browser-based solutions fail.

How to Validate the Fix

Check DebugView Again

Repeat the user journey test after implementing cross-domain tracking. In GA4 DebugView, you should see the same ga_session_id throughout the entire journey, even when moving between domains.

Monitor Direct Traffic Attribution

After the fix has been live for 7-14 days, check whether Direct traffic attribution has decreased. The conversions that were previously attributed to Direct should now show their actual source.

Verify UTM Preservation

Click through a UTM-tagged URL across your domains. Check whether the campaign attribution persists through to conversion. The source/medium should remain consistent even after crossing domain boundaries.

Attribution recovery takes time to show up

Cross-domain tracking fixes apply to new sessions, not historical data. It takes 2-4 weeks of clean data to see the full impact on your attribution reports. Don't expect immediate changes in historical campaign performance.

The Attribution Impact

On the B2B SaaS engagement I mentioned earlier, fixing cross-domain tracking revealed that LinkedIn campaigns were driving 34% more trial signups than GA4 had been reporting. The "underperforming" LinkedIn spend was actually their best customer acquisition channel.

The fix also corrected their understanding of organic vs. paid performance. What looked like strong organic trial signup volume was actually paid traffic that lost attribution at the subdomain boundary.

This is why cross-domain tracking matters beyond just having clean data. Attribution drives budget allocation. If 30% of your conversions are misattributed to Direct, you're probably under-investing in the channels that are actually driving those conversions.

The technical implementation isn't complex. But the measurement implications affect every marketing decision you make based on GA4 data.

Think your attribution data might be wrong?

Get a measurement review

Share this article