Análise & Tracking
/
7 min de leitura
/
Atualizado mai 2026
Cross-Domain Tracking: Setup Quando Site e Checkout São Domínios Diferentes
Sem cross-domain configurado, a jornada que passa por dois domínios vira duas sessões. A atribuição quebra, o self-referral aparece e a fonte original some do relatório.
O que você precisa configurar antes de confiar em qualquer relatório de atribuição
- Cross-domain é obrigatório se a jornada passa por 2+ domínios. Site institucional, checkout externo (PagSeguro, Mercado Pago, Stripe) e página de obrigado em domínios distintos quebram o
client_idsem linker. - Setup tem 3 partes: GA4 Admin > Data Streams > Tagging Settings > Configure your domains, GTM Conversion Linker em todas as páginas, e lista de exclusão de self-referral.
- Sintoma clássico: Purchase aparece com source/medium do gateway de pagamento. Vejo conta perdendo 20-40% de Purchase atribuível à fonte original por causa disso.
Cross-domain tracking é o assunto que mais aparece quando abro uma conta nova de e-commerce. O cliente jura que o tracking está funcionando, o GA4 mostra Purchase, o Google Ads mostra conversões. Aí eu olho de perto: 30% das compras aparecem com source pagseguro.uol.com.br ou mpago.la. Isso não é fonte de tráfego. Isso é o próprio gateway de pagamento sendo tratado como referrer porque a sessão quebrou no meio da jornada.
O problema não é raro. Quase todo e-commerce no Brasil que usa gateway externo sofre disso de alguma forma. E a maioria descobre tarde, depois de meses confiando em relatórios que mentem por omissão. Esse post explica o que é cross-domain, por que o GA4 quebra sem ele, e como configurar do jeito certo em três pontos: GA4 stream, GTM Conversion Linker e lista de exclusão de self-referral.
O que é cross-domain tracking e quando importa
Cross-domain tracking é o conjunto de configurações que faz o GA4 reconhecer que o mesmo usuário visitou dois (ou mais) domínios distintos como parte da mesma sessão. Sem essas configurações, cada domínio é uma sessão nova, com um client_id novo, e qualquer evento que dispara no segundo domínio aparece atribuído ao primeiro domínio como referrer.
Importa toda vez que a jornada do usuário passa por mais de um domínio. E quando digo domínio, é o domínio raiz, não subdomínio. app.empresa.com.br e www.empresa.com.br são o mesmo domínio. empresa.com.br e checkout.pagseguro.uol.com.br são domínios diferentes e exigem cross-domain.
Antes de assumir que está tudo certo, vale revisar o setup base do GA4 para mídia paga. Cross-domain é uma camada que se monta em cima de um GA4 já bem configurado, não substitui o básico.
Cenários comuns onde cross-domain entra em jogo
Os três cenários que mais aparecem na prática:
1. E-commerce com gateway externo. Você tem uma loja em minhaloja.com.br, o cliente clica em “Finalizar compra”, é redirecionado para checkout.pagseguro.uol.com.br ou www.mercadopago.com.br/checkout, paga e volta para minhaloja.com.br/pedido-confirmado. Três domínios na mesma jornada (na verdade dois, porque o último já é o seu).
2. Multi-site corporativo. Grupo que tem marca-mae.com.br, linha-a.com.br e linha-b.com.br e quer rastrear o usuário que navega entre as três marcas. Cross-domain é o que conecta os perfis.
3. SaaS com login em domínio separado. Marketing site em produto.com, app em app.produto.io. Quase ninguém configura cross-domain entre os dois e perde toda a atribuição do funil de trial.
Subdomínios do mesmo domínio raiz (ex: www.empresa.com e shop.empresa.com) não precisam de cross-domain. O cookie _ga é setado no domínio raiz por padrão e funciona entre subdomínios. Mas eu sempre verifico, porque às vezes o setup força o cookie em domínio específico e quebra mesmo subdomínio.
Por que o GA4 quebra sem cross-domain
O GA4 identifica o mesmo usuário através do client_id, que vive no cookie _ga. Esse cookie é first-party e fica armazenado no domínio que disparou o tag. Quando o usuário sai de siteA.com e entra em siteB.com, o navegador não envia o cookie de siteA.com para siteB.com, porque first-party significa exatamente isso: só vale no domínio que criou.
Sem cross-domain, o que acontece é que siteB.com gera um client_id novo e dispara um evento session_start novo. O referrer do document.referrer aparece como siteA.com. Aí o GA4 mostra siteA.com / referral como fonte da nova sessão. É o famoso self-referral.
(self-referral)
Com cross-domain configurado, o GA4 anexa o client_id na URL como parâmetro _gl quando o usuário sai do domínio. O segundo domínio (ou o retorno ao primeiro depois do checkout) lê esse parâmetro e reusa o mesmo client_id. A sessão continua. A atribuição preserva a fonte original.
_gl na URL_gl e reusa client_idO detalhe importante: o parâmetro _gl tem tempo de vida curto (poucos minutos). Não é um cookie que persiste. É só o veículo para carregar o ID na transição entre domínios. Se o usuário ficar 30 minutos no checkout, a sessão pode expirar mesmo com cross-domain. Mas para a maioria dos casos, funciona.
Como configurar cross-domain no GA4
O setup no GA4 acontece em um único lugar: Admin > Data Streams > (selecionar o stream Web) > Configure tag settings > Configure your domains. Aí você lista todos os domínios que devem ser tratados como parte da mesma jornada.
No campo “Domain”, entra a regra. Pode ser Contains, Begins with, Ends with, Matches regex. Para a maioria dos casos, Contains resolve. Exemplo de lista típica para um e-commerce que usa Mercado Pago:
minhaloja.com.br(seu domínio principal)mercadopago.com.br(checkout MP)mpago.la(encurtador do MP, usado em alguns fluxos)
Para PagSeguro, adicionar pagseguro.uol.com.br e pag.ag. Para Stripe, checkout.stripe.com. Cada gateway tem seus domínios, e o cliente precisa checar todos os usados.
Self-referral é o sintoma mais comum. Quando você vê pagseguro.uol.com.br / referral ou mercadopago.com.br / referral aparecendo como source/medium de eventos de Purchase, é cross-domain quebrado. Não é o gateway “convertendo”. É o seu próprio gateway sendo lido como referrer da sessão nova que nasceu quando o usuário voltou.
Salvar a configuração. O GA4 começa a injetar o parâmetro _gl automaticamente nos links que apontam para qualquer domínio da lista. Não precisa mexer em código no seu site para isso funcionar, desde que o gtag.js (ou o GA4 Configuration tag no GTM) esteja carregado em todas as páginas envolvidas.
Como configurar GTM Conversion Linker
Se você usa GTM (e deveria, leia o post sobre conversion tracking com Google Ads e GTM), tem uma tag específica que ajuda no cross-domain do lado do Google Ads: o Conversion Linker.
O Conversion Linker é uma tag built-in do GTM que detecta os parâmetros gclid, gbraid e wbraid nas URLs e armazena em cookies first-party (_gcl_aw, _gcl_dc, etc). Esses cookies são o que o Google Ads usa para atribuir a conversão. Sem o Conversion Linker, quando o usuário volta do checkout externo, esses parâmetros somem e a conversão fica sem gclid conectado.
Setup:
- No GTM, criar Tag > Conversion Linker.
- Configurar para disparar em All Pages (Page View > All Pages).
- Em “Enable linking across domains”, marcar e listar os domínios (mesma lista do GA4).
- Publicar o container.
Conversion Linker é diferente do cross-domain do GA4. Um cuida do client_id do Analytics. O outro cuida do gclid do Google Ads. Os dois precisam estar ativos para o tracking ficar inteiro.
Lista de exclusão de self-referral: o passo que ninguém configura
Mesmo com cross-domain configurado certinho, em algumas situações o document.referrer ainda vai vir do gateway de pagamento quando o usuário voltar. Para o GA4 não tratar isso como uma sessão nova com source pagseguro / referral, existe a lista de “unwanted referrals”.
Vai em Admin > Data Streams > (selecionar o stream) > Configure tag settings > List unwanted referrals. Adiciona os mesmos domínios de gateway (pagseguro.uol.com.br, mercadopago.com.br, mpago.la, etc).
Isso diz para o GA4: se a sessão nasceu com referrer desses domínios, não conta como referral. Mantém a atribuição original (a que vinha antes do checkout). É a salvaguarda que pega os casos em que o cross-domain falhou por algum motivo (usuário com cookie bloqueado, sessão expirada, etc).
Vale aplicar a mesma lógica em atribuição no GA4. Se o modelo de atribuição olha para sessões e a sessão está poluída por self-referral, todo o resto degrada junto.
Como debugar e validar o setup
Configurar é metade. A outra metade é validar que está funcionando. Três ferramentas que eu uso:
1. DebugView no GA4. Ativa o modo debug (extensão GA Debugger ou parâmetro ?gtm_debug=1), faz o fluxo completo de compra no site, e acompanha em tempo real. Procura por dois sinais: o client_id precisa ser o mesmo antes e depois do checkout, e o evento Purchase precisa ter o source/medium correto (Google / cpc, não pagseguro / referral).
2. Tag Assistant (Google). Ativa no Chrome, faz o fluxo, e olha cada evento disparado. Confere se o Conversion Linker disparou em todas as páginas e se o GA4 Configuration está ativo nas páginas certas.
3. Inspecionar a URL na transição. Quando o usuário clica para ir ao checkout, a URL precisa ter o parâmetro _gl=... appended automaticamente. Se não tiver, o linker não está injetando, e o problema é antes de tudo. Geralmente significa que o domínio do checkout não está na lista.
Documentação oficial vale a leitura: Set up cross-domain measurement (GA4 Help) e o guia técnico do Simo Ahava sobre cross-domain em GA4, que é o material mais detalhado em inglês. Para casos de checkout específicos e debugging avançado, esse guia do Search Engine Land tem alguns padrões úteis.
Se você está montando o setup do zero, também faz sentido revisar a estrutura de UTMs em paralelo. UTM mal estruturada combinada com cross-domain quebrado é o pior dos mundos para atribuição.
Erros recorrentes que vejo no setup
Os erros que mais aparecem quando audito conta:
1. Lista de domínios incompleta. O cliente lista pagseguro.com.br mas o gateway redireciona para pagseguro.uol.com.br. Resultado: o linker não injeta o _gl e a sessão quebra. Solução: testar manualmente toda a jornada e capturar todos os domínios que aparecem no DevTools > Network.
2. Esquecer subdomínios do gateway. Mercado Pago usa www.mercadopago.com.br, mpago.la (encurtador) e em alguns fluxos secure.mercadopago.com. Listar só o domínio principal não basta. Adicionar todos.
3. Conflito de cookies em ambientes multi-tenant. Algumas plataformas de e-commerce (Shopify, Loja Integrada) setam o cookie _ga com domain específico em vez do raiz. Aí o cookie quebra entre subdomínios do próprio site. Verificar com DevTools > Application > Cookies o domain do _ga.
4. Conversion Linker em só uma página. Tem que estar em All Pages, não só na página de obrigado. Senão o gclid se perde antes de chegar lá.
5. Esquecer de adicionar o domínio em unwanted referrals. Configura o cross-domain bonitinho, mas não adiciona na lista de exclusão. Resultado: o cross-domain funciona em 80% dos casos, e nos 20% que falham, o self-referral mascara a fonte real.
6. Cookie banner que bloqueia o GA4 antes do consent. Se o GA4 não dispara antes do usuário aceitar cookies, o client_id não existe no momento da transição. Para clientes com checkout externo, o consent precisa acontecer cedo (idealmente antes do clique em “comprar”), ou o linker precisa rodar em modo consent-aware. Esse é o caso onde server-side tagging com GTM ajuda, porque move parte da lógica para o servidor.
Para os eventos customizados no GA4 que disparam após o retorno do checkout (ex: purchase na thank you page), tudo isso vale dobrado. Se o evento dispara com client_id novo, a conversão entra como nova sessão com source errado. E os benchmarks de mídia paga que você usa para comparar ficam contaminados.
Perguntas frequentes
Preciso de cross-domain se uso só Shopify ou WooCommerce nativo?
Geralmente não, porque Shopify e WooCommerce nativos rodam o checkout no mesmo domínio (minhaloja.com.br/cart/checkout). Não há transição de domínio. Mas se você usa um app de checkout externo (PagSeguro Transparente, Mercado Pago Checkout Pro, Stripe Checkout hospedado), volta a precisar. Verifique a URL durante o pagamento para saber.
Cross-domain funciona com cookies de terceiros bloqueados?
Funciona, porque o GA4 usa cookies first-party. O _gl que viaja na URL é o mecanismo justamente para contornar a restrição de cookies de terceiros. Mesmo com Safari ITP ou Firefox ETP bloqueando rastreamento, o cross-domain do GA4 continua operando (com algumas limitações de persistência de sessão).
O _gl na URL não polui o relatório de páginas?
Não, porque o GA4 ignora o _gl ao normalizar o page_location nos relatórios. Você vê a URL limpa em “Pages and screens”. O parâmetro só serve para a passagem de ID entre domínios e o GA4 abstrai isso no relatório.
Como sei se o setup está funcionando sem fazer compra de verdade?
Faz uma compra de teste com valor mínimo (R$ 1) ou usa o modo sandbox do gateway. Acompanha em DebugView do GA4 e no Tag Assistant. Olha o client_id dos eventos antes e depois do checkout: tem que ser idêntico. Olha o source/medium do evento Purchase: tem que ser o que trouxe a sessão original (Google / cpc, Meta / paid_social, organic, etc), não o gateway.
Cross-domain para Meta Pixel e Meta CAPI funciona igual?
Não exatamente. O Meta Pixel tem o fbclid e o cookie _fbp, e o mecanismo é parecido mas tem nuances próprias. O ideal para Meta é usar Meta CAPI server-side, que envia o evento direto do seu servidor para o Meta com fbp, fbc e external_id. Aí o cross-domain importa menos, porque o evento crítico (Purchase) sai do servidor independente do que aconteceu no navegador.
Se eu uso Google Ads, ativar cross-domain melhora ROAS?
Não melhora ROAS real, mas melhora ROAS reportado, porque conversões que antes apareciam sem gclid conectado passam a ser atribuídas. Em conta de e-commerce com gateway externo, vejo recuperação de 15-30% nas conversões atribuídas ao Google Ads depois de ativar Conversion Linker corretamente. O efeito prático é que campanhas que pareciam ruins voltam a respirar quando o tracking pega as compras que estavam soltas.
Preciso configurar cross-domain entre domínios .com e .com.br do mesmo negócio?
Sim. empresa.com e empresa.com.br são domínios totalmente distintos para o navegador. Se o usuário cruza entre os dois, precisa de cross-domain configurado em ambos os streams (ou no mesmo stream, se você consolida tudo em um), com a lista de domínios incluindo as duas variantes.