Guide · Updated · 8 min read

Cross-domain conversion tracking setup

The domain hop is the easy part. The data black hole sits before it, and after it.

The short answer

Cross-domain conversion tracking setup means one thing: the visitor who clicked your ad on one domain is still recognised when they convert on another. In GA4 you list every domain under Configure your domains; for Meta and Google Ads you carry the click ID across yourself.

DataCops is a tool that does the ad-conversion job without a container, warehouse or plugin: one script and one DNS record on your own domain, a bot verdict on every visit with a Real people only switch per ad platform, the real sale from your CRM or Shopify sent back to your ads, new campaigns warmed up with the customers you already have, and a log of every send.

How DataCops does it:

  • First-party collection, no extra tool. One script and one DNS record put collection on your own subdomain; with your DNS on Cloudflare, the free Worker reads the click at the edge before the page loads. Click IDs are kept on the server for up to 90 days.
  • Real people only. Every visit gets a bot verdict against 360+ billion IPs and 350+ monitoring points, with a Real people only switch per ad platform, off by default. Every form email is checked for disposable providers, domains with no mail server and an email risk score.
  • The sale after the form. HighLevel natively (lead, booked, showed, won with value, paid), any CRM by webhook, Shopify through the DataCops Shopify app, all matched to the click by click ID or hashed email and phone, and sent to Meta, Google Ads, TikTok and LinkedIn.
  • Ads Warmup. Upload your existing customers (up to 20,000 rows), see a 0 to 10 match score per person, and send them to Meta, Google Ads and TikTok so new campaigns start warm.
  • Consent, memory and proof. A TCF 2.2 consent banner from your domain with Google Consent Mode v2 on by default, a server-set cookie up to 400 days where enabled, and a delivery log row for every send, counted once against the pixel.

Best for: teams who want better ad conversions without building or maintaining the pipe: lead gen, ecommerce, clinics, home services, B2B and agencies.

  • GA4: list your domains, exclude payment pages as referrals.
  • Meta and Google Ads: keep fbclid and gclid on the link to the second domain.
  • Test it: look for _gl on the link and one session in DebugView.
  • Then: check what you are carrying. Missing click IDs, bots and CRM sales break attribution before any domain does.

The sale that came from nowhere

Picture this. A shop sells courses on learnwell.com and takes payment on learnwell-pay.com. A Meta ad sends a visitor. They read, click Buy, pay.

GA4 files the purchase under learnwell.com / referral. Meta shows the ad set with no purchases. The owner turns it off on Friday. It was the one that worked.

Nothing was broken in a way that throws an error. Two domains simply did not know they were talking about the same person.

Broken tracking rarely looks broken. It looks like a bad ad.

The real cost of a cheap tool

Cheap tracking that is handled badly costs far more, because the bill arrives in what your ads learn.

  • Bots forwarded as buyers. A forwarder sends what reaches it. Junk conversions teach the platform to find more junk.
  • The sale that never gets sent. A booked call, a phone order or a won deal happens outside the store or the page. Most tools never see it.
  • The limit you hit on your busiest day. Hosts and apps cap requests, events or orders, and sending can pause or stop over the limit.
  • The build and the upkeep. Containers, plugins and automations need someone to build them and fix them when a platform changes.

The tracking is 0.17 percent of your spend. If one in five of the conversions your ads learn from is a bot or a fake lead, a fifth of the learning signal points at the wrong people, across the other 99.83 percent of the budget.

Cheap tracking is the cheapest line on the bill and the most expensive one to get wrong.

Tools for cross-domain tracking

ToolBest for
DataCopsAd-funded teams who want clean conversions from one script
Google Tag ManagerBrowser tags you manage yourself
StapeCheap hosted server GTM, if someone owns the container
Server-side GTM, self-hostedEngineering teams who want full control
Hand-built integrationTeams with an engineer to maintain it

When not to use DataCops

  • You need custom tag logic or non-ad destinations. DataCops sends to ad platforms and is not a Google Tag Manager container. A hosted server container gives full control, if someone owns it.
  • You want a reporting dashboard. DataCops fixes what goes into your ads. It does not replace the reports you already read.

Ads Warmup: tell the ads who pays

Cross-domain conversion tracking forwards what your site or store produces. A new ad account, pixel or campaign has nothing yet, so it pays to learn from scratch. That is a job a pipe cannot do, because the customers you already have never visit on command.

Ads Warmup, DataCops' flagship feature, sends them to your ad platforms before a campaign spends:

  1. Upload a customer list. A CSV of past buyers, old leads or booked calls. DataCops reads your columns; only email is required.
  2. See a match score for every person. An estimate from 0 to 10 from email, phone, name, location, click ID and customer ID, before anything is sent.
  3. Pick the event. Purchase, Lead, Complete registration, Add to cart or Schedule.
  4. Send server-side. Up to 20,000 people per upload to Meta, Google Ads and TikTok, with a sent, skipped or failed result per person. Google Ads credits only people who clicked a Google ad.

Each row is dated when you press send, not with the old sale date, so it gives a new campaign real customers to learn from on day one. Preview is free; sending needs a paid plan.

What else a pipe never does

  • Capture at the edge. With DNS on Cloudflare, the free, optional DataCops Cloudflare Worker reads click IDs and UTMs off the first request, before the page or any script runs. It captures; it does not block.
  • Keep the click on the server. gclid, wbraid, gbraid, fbclid, ttclid and li_fat_id are stored for up to 90 days, so a deal that closes weeks later still finds its click. A signed server-set cookie lasts up to 400 days where enabled.
  • Check the lead's email. Fixed rules, not guesses: disposable providers, domains with no mail server and an email risk score. With LeadCops (Business and up), a lead that fails is held and never billed.
  • Install on Shopify. The DataCops Shopify app adds a web pixel and a theme app embed, so every paid order reaches your ads, express checkouts included. See Shopify Conversions API.
  • Hand evidence to Google. On the Organization plan, the fraud refund report exports bot-flagged Google Ads clicks in the format Google's Click Quality form asks for. You attach it; Google decides.

What is cross-domain tracking?

Cross-domain tracking keeps one visitor and one session alive when a person moves between domains you own. Without it, each domain mints its own visitor ID and the second one thinks the journey started at the first one's link.

Needs no setup

Subdomains: www.example.com to shop.example.com. GA4 sets its cookie on the top-level domain, so they already share a visitor.

Needs setup

Different domains: example.com to example-checkout.com, a booking tool on its own domain, a funnel builder on a separate URL.

Where does it actually break?

It breaks in more places than the GA4 settings screen. Each tool keeps its own identity, and each one needs the handover done its own way.

ToolWhat carries the visitorWhat goes wrong
GA4The _ga cookie, passed by the _gl link parameterDomain missing from the list, forms that post by JavaScript, redirects that drop the query string
MetaThe _fbc cookie, built from fbclidCookie lives on one domain only. The checkout never sees the click
Google Adsgclid stored on the landing domainSecond domain has no gclid, so the conversion is unattributed or modelled
Payment pagesNothing, you do not own themPayPal or Stripe steals the session as a referral on the way back

Most guides fix row one and stop. Rows two and three are where the ad money is.

Set it up, step by step

Do these in order. Each one takes minutes.

  1. List your domains in GA4. Admin, Data streams, pick the web stream, Configure tag settings, Configure your domains. Add every domain in the journey, with the match type "Contains" or "Exactly matches".
  2. Exclude payment pages. Same screen, Show more, List unwanted referrals. Add paypal.com, checkout.stripe.com and any other page you bounce through.
  3. Use the same measurement ID on every domain. One GA4 property, one tag. Two properties can never share a session.
  4. Carry the click IDs yourself. On the link to the second domain, append fbclid, gclid and ttclid from the landing URL or a first-party cookie. Store them again on arrival.
  5. Check your redirects. Every 301 and 302 between domains must keep the full query string. One redirect that drops it kills the whole chain.
  6. Send the purchase with the stored IDs. Pass the click ID, plus hashed email and phone, with the conversion, and give the pixel and server events the same event_id so they are counted once.

How do I test it?

Click a real link from domain one to domain two and look at the URL. You should see _gl= followed by a long string. No _gl, no cross-domain tracking.

Then open GA4 DebugView with Tag Assistant on. The same session should carry on across both domains, with no new session_start at the handover. For Meta, check that _fbc exists on the checkout domain, not only the landing page.

Finally, do the test that matters. Buy something through an ad click on your phone and see where it lands in GA4, Meta and Google Ads the next day.

If you have never followed one real sale end to end, you do not have tracking. You have a guess with a dashboard.

Why a perfect setup still lies

Here is the part the settings screen cannot show you. Cross-domain tracking only carries what exists. Three things break before the handover ever happens.

The click ID never arrives

Apple strips known click IDs in Safari Private Browsing and in links opened from Mail and Messages. Ad blockers stop pixels from loading. Nothing to carry, nothing to match.

The visitor was a bot

Bots cross domains perfectly. Session intact, attribution clean, conversion sent. Your ads now go looking for more visitors like it.

The third one is the biggest. For lead businesses, the sale does not happen on any domain. It happens in a CRM a week later, when someone books, shows up and pays. No linker in the world reaches it.

Server-side tracking helps with the ad blockers. It does not help with the rest. The server only knows what the page gave it, and it sends a bot's purchase as happily as a person's.

Fixing the root cause

DataCops is the tracking solution for ad-funded businesses: it keeps bots out of what your ads learn from and sends the sale that happens after the form to Meta, Google Ads, TikTok, LinkedIn, Microsoft Ads, Reddit, Pinterest and X.

You connect each platform in one click. The pixel and server events are deduplicated by event_id, so each conversion counts once. Every visit gets a verdict, and with Real people only switched on, flagged visits never reach the ads as conversions.

The sale in your CRM is matched back to the click by click ID, or by hashed email and phone when the click ID is gone. That covers the Safari visitor with no fbclid. It is how offline conversions work, and on HighLevel the result is written back on the contact.

One sale, on its way to Meta
Visit verdictReal person
Click IDMissing, Safari
Matched byHashed email and phone
Delivery logSent

Every row in the delivery log says sent, held, skipped or failed, with the reason. So when an ad set goes quiet, you check the log before you turn it off. See server-side tracking and the Meta Conversions API page for the details.

FAQ

Can I warm up a new campaign with my existing customers?

Yes, with DataCops Ads Warmup. Upload a CSV of customers (only email is required, up to 20,000 rows), see a 0 to 10 match score for each person, and send them to Meta, Google Ads and TikTok, dated when you send. Google Ads credits only people who clicked a Google ad.

Do I need cross-domain tracking for subdomains?

Not in GA4. Google tags set their cookie on the top-level domain, so shop.example.com and example.com already share a visitor. You need it when the domain itself changes, like example.com to example-checkout.com.

What is the _gl parameter?

It is the linker parameter Google tags add to links pointing at your other domains. It carries the visitor and session IDs across, so the second domain can continue the same session instead of starting a new one.

Why does my checkout show up as a referral in GA4?

Either the checkout domain is missing from Configure your domains, or a payment page like PayPal sits in between. Add your own domains to the list and add the payment provider to List unwanted referrals.

Does cross-domain tracking fix Meta attribution too?

No. GA4's linker only helps GA4. Meta relies on the _fbc and _fbp cookies, which live on each domain separately. If the checkout domain never saw the fbclid, the purchase goes to Meta without the click.

Does server-side tracking fix cross-domain problems?

Partly. It gets events past ad blockers and makes delivery reliable. It cannot restore a click ID that was never captured, because the server only knows what the page handed it.

Can bots break cross-domain attribution?

Worse: they pass through it perfectly. A bot that clicks through to checkout keeps its session across domains like anyone else. If its conversion is sent, your ads learn from it.

What if my sale happens in a CRM, not on a checkout page?

Then no domain setting will help. The sale has to be sent back to the ad platform and matched to the click by click ID or hashed email and phone. That is what offline conversions are for.

Sources

Carry the right conversion across

Every visit gets a verdict. Bots stay out of Meta, Google Ads, TikTok, LinkedIn, Microsoft Ads, Reddit, Pinterest and X, and the real sale goes back to the ad.

Setup in 5 minutes. No credit card.

Live traffic quality

Updated just now

Visits · last 24h

487
Real users
35873.5%
Bots · auto-filtered
12926.5%

Without filtering, 26.5% of your reported traffic is bot noise inflating dashboards and draining ad spend.

Don't trust your analytics!

Make confident, data-driven decisions withactionable ad spend insights.

Setup in 2 minutes
No credit card