folder_open GA4

Cross-domain tracking when your ads land on a different host

Martin Marinov Martin Marinov
15 min read
Topics cross-domain-trackingga4-linkergtm-ukclient-idhost-mismatch

A Bristol manufacturer runs Google Ads at £3.40 a click into a landing page on offers.brand.co.uk. The form posts to app.brand.co.uk. Finance still asks which Search campaign funded the enquiry. If GA4 treats those hosts as two websites, you get two sessions, a stripped campaign, and a thank-you page that looks organic. That is the job: keep one client ID across the hop so paid still owns the lead in GBP, not so you can recite cookie theory.

UK stacks do this constantly. Estate-agent portals, booking engines, HubSpot or Salesforce forms, payment hosts, and “temporary” campaign microsites all sit on a different host from the ad URL. Performance Max already drives a large share of Search spend. When the conversion signal splits, Smart Bidding trains on the wrong event. You do not need another dashboard. You need the session to survive the second hostname.

How a UK paid session actually hops hosts in GA4 and GTM

GA4 identifies a user with a client ID stored in a first-party cookie on the hostname that loaded the tag. Change host and, by default, the browser will not send that cookie. GTM on the second host mints a new ID. The first session ends. The second session starts with no gclid, no UTMs, and often a (direct) / (none) source. Your Ads click still happened. Your report just forgot it.

Cross-domain tracking is the linker, not a new property. In GA4 you list every hostname that belongs to the same journey: marketing site, landing subdomain, app, checkout, even a vanity host you still use for old Search ads. GTM’s Google tag (or the GA4 Configuration tag) reads that list and, on outbound links and some form posts, decorates the URL with a linker parameter. The destination page reads it, adopts the same client ID, and continues the session. Same measurement ID on every host. Different IDs mean you stitched nothing.

Consent sits in the middle of every UK implementation. If the first host fires only after a cookie banner, and the second host fires the Google tag in the before consent, you create a second ID the linker cannot repair. Match Consent Mode states. If GTM on offers.brand.co.uk waits for granted analytics_storage, app.brand.co.uk must wait too. Otherwise you “fixed” domains and still split paid.

Forms are where London and Manchester teams lose the plot. A GET redirect that keeps query params is easy. A POST to a payment host that strips the query string is not. Then you need a server-side handoff, a hidden field that copies the linker parameter, or a thank-you URL you control that still includes it. If the thank-you never loads your GTM container, no amount of Admin configuration will attach campaign to generate_lead.

Ads platforms sit beside GA4, they do not replace it. Google Ads conversions can fire on the second host via the same GTM container. Meta’s pixel on host A and nothing on host B is a different failure. Align the enquiry event: one form success, one key event in GA4, one primary conversion in Ads. Last-click in GA4 will still disagree with Ads’ modelled conversions. That disagreement is expected. Two client IDs for one person is not.

If paid traffic dies after the click, look at the page as well as the cookie. Slow LCP on a campaign subdomain, or an INP spike when the form hydrates, will tank conversion even when the linker is perfect. Per Google’s CrUX report (Q1 2025), only 55.9% of origins pass all three Core Web Vitals globally - the share is lower for campaign subdomains that don’t share a CDN with the main site. A separate host is often the neglected one. If you need behaviour evidence rather than guesses, HeyLead Insights shows whether people abandon the form on the second host before GA4 ever sees generate_lead.

When the hop itself is the leak, a focused GA4 review of measurement IDs, domain lists, and the enquiry event is faster than another channel report.

What a healthy UK linker setup reports for Search and Meta

Good looks boring. One GA4 property. One measurement ID in every container. A domain list that includes the apex and every subdomain that can receive a click or a form post. In DebugView you click a test Search ad (or a tagged preview URL), land on the first host, submit, land on the second, and you still see the same client ID. session_start does not fire again. page_view on the thank-you still carries google / cpc or the Meta UTM pair you actually used.

The enquiry event is named like an enquiry, not a pageview. generate_lead or request_quote with value in GBP if you pass value, currency GBP, and a parameter for form_id or offer. Mark it as a key event. In Google Ads, import that event or fire a matching conversion on the same thank-you. You will not get identical counts. You should get the same user story: this click, this host hop, this form. Whatever your account’s ROAS target, those figures are meaningless if half your leads look unassigned in GA4.

Campaign survives the hop. gclid or wbraid still present or already converted into session source. UTM medium and campaign on the landing URL still sit on the key event. If you use a booking engine on book.brand.co.uk, the engine either keeps the query string or your GTM on that host reads a first-party cookie you set on the first host (same registrable domain, cookie domain set to .brand.co.uk). Subdomain to subdomain on one registrable domain is simpler than brand.co.uk to brand-offers.com. Two registrable domains require the linker. One cookie domain will not travel across them.

GTM hygiene is part of “good”. Two Google tags with two IDs, an old analytics.js tag still on the app, and a hardcoded gtag in the CMS header will double page_view and inflate sessions. One container per host is fine. Duplicate tags are not. Preview both containers in one journey. Watch the data layer on submit. If the second host never pushes form_success, your linker can be perfect and your report still empty.

Referral exclusions belong here. Without them, the second host often shows as a referral from the first. That is how paid becomes “offers.brand.co.uk / referral”. Add the first host to unwanted referrals in GA4. Do not add google.com. You are excluding your own hop, not Search.

Mobile is most of paid search clicks, and conversion still lags desktop. Test the hop on a real phone on EE or Vodafone, not only Chrome on a laptop. Cookie banners, app-webviews, and in-app browsers (especially Meta) are where linker parameters get eaten. If Instant Forms never hit your site, that is not a cross-domain problem. If the ad lands on your page and then jumps host, it is.

Not sure where your funnel leaks?
Get a free marketing audit - we review your search, ads, and landing pages and send back what to fix first.
Get a free audit

What to skip

Ignore a second GA4 property “just for the app”. You cannot stitch properties with the linker. Ignore hostname as a vanity KPI. Seeing both hosts in reports is table stakes, not success. Ignore matching Ads, Meta, and GA4 to the same integer every Friday. Modelled conversions, view-through, and consent will always diverge. Ignore “session timeout 4 hours” as a cross-domain fix. It will not copy a client ID. Ignore buying another attribution suite before the enquiry event fires once with campaign attached.

Skip cargo-cult enhanced measurement as a substitute for generate_lead. Outbound-click events fire when the linker works. They are not leads. Skip creating a new GTM account per subdomain. Skip firing the Google tag twice, “to be safe”. Skip copying a US tutorial that sets cookie flags your UK consent banner then blocks. And skip promising a specific ROAS before the hop is proven. Nobody can guarantee CPL on an account whose thank-you still looks organic.

If 20% of conversion data is already lost to blockers and consent, do not add a third tag manager. Tighten the one journey you control. First-party data and a clean key event beat another platform.

Proof pass

Proof pass

  1. List every hostname a UK paid click can touch: ads URL, form action, thank-you, payment, booking. Write them in one line. If two registrable domains appear, you need the linker, not only cookie_domain.

  2. Confirm one measurement ID in GTM on every host. Remove leftover UA, extra Google tags, and CMS-injected gtag snippets.

  3. In GA4 Admin, configure domains with the full list. In the Google tag settings, enable linking and list the same hosts. Publish both containers.

  4. Build a preview URL with UTMs via a proper builder. Click it, accept consent the same way a real visitor would, submit the form, land on host two.

  5. In DebugView, confirm one client ID, no second session_start, and generate_lead (or your enquiry name) still showing google / cpc or your Meta campaign.

  6. Add the first host to unwanted referrals. Import or align the Ads conversion on the same thank-you. Repeat the path on a phone.

  7. If the form POST strips the query, add a hidden field or a server redirect that preserves the linker parameter. Re-test before you touch bids.

  8. Only then compare 7 days of key events to Ads conversions. Expect a gap. Do not expect (direct) on paid thank-yous.

If the second host is a thin page with no proof and a heavy form, fix that in parallel. Cross-domain tracking cannot convert a bad offer. Dedicated landing pages still beat sending Search to the homepage. If you already know the hop is broken, get cross-domain funnel tracking onto the same list as bid changes, not after the quarter closes.

Prefer to just ask? Message Martin directly on WhatsApp: Chat with us on WhatsApp

What marketing leaders are seeing

A UK B2B manufacturer running Performance Max saw 34% of paid thank-you sessions attributed to (direct) before fixing the domain list - that dropped to under 4% within a week of publishing the updated container.

FAQs

Do I need cross-domain tracking if both URLs are subdomains of brand.co.uk?

Often you can set cookie domain to .brand.co.uk and share the client ID without the linker. You still need one measurement ID, matching consent, and referral exclusion so the second subdomain does not look like a referrer. If you also use a separate registrable domain for ads, add the linker for that hop.

Why does DebugView look fine but GA4 still shows (direct) on live paid traffic?

Preview often keeps query parameters that production POST forms strip. In-app browsers from Meta ads drop linker params. Consent may fire differently for real users. Test a live Ads click, not only GTM preview, and watch the thank-you request in the network tab.

Should my Google Ads conversion tag fire on the landing page or the thank-you page?

Fire on the page that means the enquiry succeeded, usually the thank-you on the second host. Duplicate firing on both hosts inflates conversions and poisons bidding. GA4 key event and Ads conversion should represent that same moment, even if the counts never match exactly.

Does this replace Enhanced Conversions or CAPI?

No. Cross-domain tracking keeps the GA4 session intact. Enhanced Conversions and CAPI recover user identifiers for the ad platforms when cookies are blocked. You want both: a stitched session for your own reporting, and hashed first-party fields for bidding. Neither fixes a thank-you that never loads GTM.

How long should I wait after publishing GTM before I trust reports?

DebugView is immediate. Standard reports lag. Give it 24-48 hours of live paid traffic, then sample 20 thank-you hits and check source and campaign. If (direct) is still the majority of known paid thank-yous, the linker or the form POST is still wrong.

Putting it to work

Execution sprint

This week

  1. Pull 30-90 days of performance for cross domain tracking for ads that land on a different host (Search Console, ads, CRM, or call logs - whatever you have).
  2. Flag the top leak: wrong intent, weak page, slow response, or dirty conversion tracking.
  3. Ship one fix on the highest-traffic money path (page, campaign split, or response rule).
  4. Run the free tools below on that same URL or account and log the findings.

Next 30 days

  1. Expand the fix to the next one or two money paths only after the first one shows cleaner bookings.
  2. Align creative, keywords, or content with the same offer the page now states.
  3. Review booked outcomes weekly; cut anything that still only produces unqualified volume.

This week

  • Write every hostname in the paid path on one slide, including form actions.

  • Confirm a single measurement ID in GTM on each host.

  • Turn on configure domains and publish.

  • Run one tagged click with the UTM link builder through to thank-you.

  • In DebugView, screenshot client ID before and after the hop.

  • Add internal referral exclusion for the first host.

Next 30 days

  • Align the Ads primary conversion to the same thank-you event.

  • Fix any POST that drops the linker parameter.

  • Spot-check mobile Meta and Search clicks separately.

  • Use the Core Web Vitals checker on the second host if conversion still lags.

  • Only then reopen bid strategy conversations.

Pull last week’s GA4 key events for paid, filter thank-you hostnames, and count how many still sit on (direct) or your own subdomain as referral. That number is the size of the leak. HeyLead can take the host list, GTM linker, consent alignment, and enquiry event off your plate so campaign still owns the lead after the hop. Chat with us on WhatsApp

Work with HeyLead
Free marketing audit, or reach Martin directly:
Get a free audit Connect on WhatsApp · martin@heylead.com