Não, o cookie não acabou. O problema é pior: a perda de sinal é estrutural.
Coleta first-party e server-side para e-commerce, do diagnóstico à verificação.
Este material foi escrito para ser lido por quem pode te contestar. Então ele declara, antes de qualquer argumento, o que faz e o que não faz.
Sobre os números que aparecem aqui. Dados de mercado (adoção de bloqueador, participação de navegador, opt-in de ATT, share do Pix) são faixas referenciais públicas, e estão rotuladas como tal no texto. Nenhum número neste material vem da operação de um cliente identificado.
Gabriel Sorato, Head de Web Analytics da Precisian. A Precisian é uma empresa de plataforma de dados: infraestrutura de dados de marketing para e-commerce e varejo. Não operamos mídia, e é por isso que este material não tem um canal para defender.
Existe uma narrativa confortável circulando há cinco anos: os cookies vão acabar, prepare-se. Ela tem um problema. Está errada, e a versão correta é pior.
Em abril de 2025, o Google anunciou que não vai depreciar os cookies de terceiros no Chrome, mantendo a escolha com o usuário. Em outubro de 2025, encerrou a maior parte das APIs do Privacy Sandbox, o conjunto que existia justamente para substituir o cookie.
Ou seja: a profecia não se cumpriu, e o plano B foi cancelado. Se a sua estratégia de dados dos últimos anos foi "esperar o Sandbox", você esperou por nada.
Por que isso importa comercialmente. Se um fornecedor ainda abre a conversa com "o cookie vai acabar", ele está lendo notícia de 2023. É um teste rápido de atualidade que você pode aplicar na próxima reunião.
Porque a perda de sinal nunca dependeu do Chrome. Ela é estrutural: vem de cinco frentes independentes, nenhuma delas sob controle do Google, e todas já em vigor hoje.
| Frente | O que ela faz | Faixa referencial |
|---|---|---|
| ITP do Safari | Limita a 7 dias a vida de cookie first-party escrito por JavaScript. Em cenários de link decoration e bounce tracking, o teto pode cair para 24 horas. | Safari é fatia expressiva do mobile brasileiro, em muitas operações de varejo, entre 25% e 40% |
| Firefox / ETP | Particiona cookie de terceiro por site de topo. Estado deixa de ser compartilhado entre domínios. | Fatia pequena no Brasil, comportamento igual ao do Safari |
| iOS ATT | Exige opt-in para o identificador de publicidade. Sem ele, o pareamento de conversão no app degrada. | Estimativas de mercado apontam perda de 65% a 75% dos identificadores mobile |
| Bloqueadores | Impedem o carregamento da tag. Não é o cookie que falha: é o script que nunca executa. Listas modernas bloqueiam também subdomínio de coleta conhecido. | Adoção estimada em torno de 31% dos usuários |
| Consentimento | Recusa ou falta de interação no banner = tag que não dispara, ou dispara sem armazenamento. | Varia enormemente com o desenho do banner, de <40% a >90% de aceite |
Nenhuma das cinco muda se o Chrome mudar de ideia outra vez. E há uma sexta, só do Brasil, que o capítulo 2 trata: o Pix.
Se for para escolher um mecanismo — um só — que encerrou a era do client-side, é este.
O ITP trata de forma diferente dois cookies que, no papel, são a mesma coisa:
| Como o cookie é criado | Vida útil no Safari | Exemplo |
|---|---|---|
Por JavaScript na página
(document.cookie) |
7 dias | o _ga do Google Analytics, o _fbp do Meta, praticamente
todo cookie de ferramenta de medição |
Pelo servidor, via cabeçalho HTTP
Set-Cookie, no seu próprio domínio |
a validade que você definir | cookie de sessão de loja, cookie de carrinho, e o cookie de identidade de uma coleta server-side bem feita |
Agora pense no seu ciclo de recompra.
Sob ITP, um cliente que compra a cada 30 dias é um visitante novo, toda vez. Para sempre.
As consequências se espalham por tudo que você olha:
É isso que "fim do client-side" significa de verdade. Não é uma data futura anunciada por big tech: é um comportamento já em produção no navegador de uma fatia grande dos seus clientes, e que independe do que o Chrome decidir.
Como verificar hoje, em dez minutos, no seu próprio GA4: compare a proporção de usuários novos entre Safari e Chrome, no mesmo período e segmento. Se o Safari mostra bem mais "novos", você não está vendo outro público, está vendo o teto de sete dias.
Quase nunca resolve, porque confunde de quem é o cookie com quem escreveu o cookie.
O _ga é um cookie first-party. Ele é gravado no seu domínio.
E ainda assim vive sete dias no Safari, porque foi escrito por JavaScript. O que muda o
resultado não é o domínio: é a origem da escrita. Capítulo 4 desmonta essa
confusão inteira.
Um material honesto precisa te dizer onde parar de se preocupar.
"Google falou que faturou 100, TikTok mais 100, e Meta mais 100, e no final teu faturamento é 200. Pera aí, alguém tá mentindo."
Ninguém está mentindo. Cada plataforma está relatando o que conseguiu observar, e cada uma observou uma fatia diferente, com sobreposição. A soma passar do faturamento real não é fraude: é a assinatura matemática de três réguas independentes medindo o mesmo evento com janelas e critérios diferentes, cada uma cega em pontos distintos.
O inimigo não é uma plataforma. É decidir com dado que você não pode verificar.
O capítulo 2 abre o evento e mostra os sete pontos onde ele morre, com o teste de detecção de cada um. O capítulo 3 traduz isso para decisão de verba. A Parte II define first-party e server-side sem folclore, incluindo o que server-side não faz. A Parte III desenha a arquitetura. A Parte IV entrega o plano de cinco fases e o protocolo que prova que funcionou.
Sugestão de leitura, se você tem quinze minutos e não quarenta: capítulo 2 (onde o evento morre), a tabela do capítulo 5 (o que cada tecnologia resolve) e o capítulo 11 (como verificar). Com esses três você já entra numa reunião técnica sabendo o que perguntar.
Uma compra acontece. Entre o clique do cliente e a linha no seu relatório, existem sete lugares onde esse evento pode morrer, e em cada um ele morre de um jeito diferente, com um teste de detecção diferente.
A maior parte das conversas sobre "perda de dado" trata o problema como uma coisa só. Não é. Tratar como uma coisa só é o motivo pelo qual times compram server-side esperando resolver tudo e resolvem três dos sete.
As mortes 1 a 4 são de transporte, o evento existe e não chega. A 5 é de origem, o evento nunca nasceu. As 6 e 7 são de contrato, o evento chegou e não serve. São três problemas distintos, com três soluções distintas. Server-side resolve bem as de transporte, resolve a 5 só se você mudar a fonte do evento, e não resolve nenhuma das de contrato sem trabalho de modelagem.
O cliente tem um bloqueador. O navegador nunca busca o script de medição. Não há evento perdido no caminho: não houve evento. Nenhum retry resolve, porque nada executou.
Isso vale para o container de tags, para o script da plataforma de mídia e, cada vez mais, para subdomínios de coleta reconhecidos: as listas de bloqueio incluem padrões de endpoint de vendor, então um subdomínio apontado para um fornecedor conhecido também entra na lista.
Como detectar: compare o volume de page_view da sua
ferramenta de medição com o volume de requisições de página do seu servidor ou CDN, no mesmo
período. A diferença percentual é o seu teto de bloqueio. É o teste mais barato de todos.
Banner recusado, ou fechado sem escolha. Conforme a configuração, a tag não dispara, ou dispara em modo sem armazenamento. Nos dois casos você perde a continuidade da identidade.
Como detectar: instrumente o próprio banner. Você precisa saber a taxa de aceite por dispositivo e por página de entrada. Se ninguém na sua empresa sabe essa taxa hoje, esse é o primeiro número a levantar. Ele determina o teto de tudo que vem depois.
🔴 Server-side é o jeito mais rápido de transformar um problema de medição num problema jurídico. Capítulo 9.
O capítulo 1 já detalhou: cookie escrito por JavaScript vive sete dias no Safari. O evento chega, mas chega desconectado do anterior. Você não perde a venda: perde a jornada que levou a ela.
Como detectar: proporção de usuários novos por navegador, comparando Safari e Chrome. E, se você tem login, a taxa de reconhecimento de cliente recorrente por navegador.
O evento disparou no momento em que o usuário estava saindo da página: clicou em um link, voltou, fechou a aba. Se a requisição não usar um mecanismo resistente ao descarregamento da página, ela é abortada no meio.
Essa é a mais invisível das sete: não deixa rastro em lugar nenhum, nem no navegador, nem no servidor. Ela é mais comum justamente nos eventos que mais importam: cliques de saída, início de checkout, redirecionamento para pagamento.
Como detectar: compare a contagem de um evento de clique de saída com a contagem de chegadas no destino correspondente. E teste em rede lenta (throttling 3G no DevTools), o problema aparece muito mais em conexão ruim, que é a conexão de boa parte do Brasil.
Esta é a maior do Brasil, e é a única que não tem nada a ver com navegador.
A sua medição client-side observa o que acontece nas páginas do seu site. Quando a conversão se conclui em outro lugar, não há tag nenhuma para disparar:
| Onde a venda termina | Por que a tag não vê |
|---|---|
| Pix | O cliente gera o QR Code e paga no app do banco. A confirmação chega ao seu backend por webhook do provedor, não por navegação. Se a sua medição depende da página de obrigado, você conta apenas quem voltou para ela, e muita gente não volta. |
| Boleto | Mesmo padrão, com dias de defasagem entre o pedido e o pagamento. |
| Gateway com redirect | O fluxo sai do seu domínio e volta. Sessão quebrada, e a volta frequentemente aparece como referral do próprio gateway. |
| A venda fecha na conversa. O site registrou, no máximo, um clique de saída. | |
| Televendas e representante | O pedido nasce no ERP. Nunca houve página. |
| Loja física | Idem, e frequentemente com influência de mídia digital que ninguém consegue ligar. |
Com o Pix respondendo por uma fatia expressiva dos pagamentos no e-commerce brasileiro. Faixas públicas apontam entre 30% e 40%, com variação enorme por categoria e ticket, e o tamanho desse buraco não é marginal. E ele contamina tudo a jusante: relatório de canal, análise de CRO, otimização de campanha, cálculo de CAC.
"Um exemplo básico: a gente não enxerga pedidos de Pix dentro do GA."
Como detectar: receita por meio de pagamento no seu ERP contra receita por meio de pagamento na sua ferramenta de medição, mesmo período. Se o Pix aparece sub-representado na medição, você achou o buraco, e ele tem tamanho, não é opinião.
Esta é a morte que server-side puro não resolve. Mover a tag para o servidor não faz aparecer um evento que nunca nasceu. O conserto é trocar a fonte do evento: o pedido confirmado sai do backend (ERP/OMS), não da página de obrigado. Fase 4 do plano, capítulo 10.
O evento chegou. Está no relatório. E é inútil para reconciliar, porque não traz o identificador que permite ligá-lo ao pedido real.
Sem order_id ou transaction_id estável, você não consegue
responder à pergunta que encerra toda discussão de divergência: quais pedidos exatamente
estão na plataforma e não estão no ERP? Fica só com totais que não batem e nenhum jeito
de investigar item a item.
Variações que aparecem em auditoria com frequência incomum:
transaction_id que muda entre a página de obrigado e o webhook do
pagamento, então o mesmo pedido existe duas vezes com chaves diferentes.Quando você passa a enviar o mesmo evento por dois caminhos, do navegador e do servidor, que é exatamente o desenho recomendado. Cada plataforma de destino precisa entender que são o mesmo evento. Isso se faz com um identificador de evento compartilhado entre os dois envios.
Sem ele, um de dois desastres:
Como detectar: a contagem de conversões da plataforma imediatamente antes e depois de ligar o segundo caminho de envio. Se subiu de forma abrupta e desproporcional, você está duplicando. É por isso que a fase de implementação prevê execução em paralelo com comparação, e não um corte seco.
Das sete mortes, quatro são de transporte, uma é de origem e duas são de contrato. Server-side resolve o transporte. A origem exige mudar de onde o evento nasce. O contrato exige modelagem. Quem vende os três como um produto está vendendo um terço.
Perda de dado custa em alocação de verba, não em relatório. E o prejuízo aparece onde ninguém procura.
Cada plataforma é juíza de si mesma e puxa a atribuição para o próprio lado. Não é má-fé: é o resultado de três réguas com janelas, critérios e cegueiras diferentes.
Quando os números não fecham, a realocação de verba acaba sendo feita por quem argumenta melhor na reunião, não por quem tem razão. O dado deixou de ser árbitro, e a decisão voltou a ser política.
Toda morte do capítulo 2 prejudica desproporcionalmente o canal que influencia sem fechar: anúncio de descoberta trabalha em janela longa e multi-sessão, que é exatamente o que o teto de sete dias apaga. O resultado é um ciclo que parece disciplina:
Cuidado com a conclusão fácil. Nada disso prova que o seu topo de funil funciona. Prova que a sua régua não consegue dizer. Confundir as duas é como se compra mídia ruim com boa consciência.
Com a identidade partida a cada sete dias, o cliente que você já tem no CRM volta a ser um desconhecido para a plataforma. Você o compra de novo, como aquisição, e paga preço de aquisição por uma recompra que ia acontecer. Nos relatórios, isso aparece como crescimento de base. É perda de margem.
É aqui que problema de dado vira problema de conselho. Enquanto o CAC é um número que ninguém verifica, ele deixa de ser indicador e passa a ser o teto do quanto a empresa se permite crescer.
A empresa deixa de apertar o acelerador porque não confia no velocímetro.
As mortes do capítulo 2 são crônicas: acontecem sempre, num patamar estável. Existe uma categoria aguda, a coleta que funcionava e parou. Um deploy do front, uma troca de template, um plugin atualizado, uma alteração no checkout: a tag para de disparar e nada avisa. Os relatórios continuam saindo, com números menores, e a queda se confunde com sazonalidade.
"Hoje a gente trabalha muito na correção. A gente só sabe quando dá um B.O. muito lá na frente."
Quase nenhuma operação mede o tempo entre a quebra e a descoberta, e é um dos números mais caros que existem: nessa janela você não só perdeu dado: otimizou campanha com dado errado. O lance automático aprendeu com o buraco.
Não se resolve com arquitetura, e sim com monitoramento: volume esperado de evento por hora, com faixa e alerta. Capítulo 11.
Não use nada disso como argumento de urgência. Use como lista de perguntas da sua próxima reunião de dados. Se as respostas vierem como opinião em vez de número, você já sabe onde está o trabalho:
Requisições de página no servidor contra page_view na medição.
Por dispositivo e por página de entrada.
Por meio de pagamento, ERP contra medição.
Com definição de receita declarada antes de comparar.
Se sim, é o teto de sete dias.
Se a resposta é "quando alguém nota", é longo demais.
As seis perguntas custam algumas horas de um analista e não exigem contratar ninguém. Se você fizer só isso, este material já se pagou.
"First-party" virou selo de qualidade e parou de significar coisa alguma. Três conceitos diferentes disputam o mesmo rótulo, e a confusão entre eles é a mais lucrativa do mercado de ferramentas de medição.
| Termo | O que realmente significa | O que ele resolve |
|---|---|---|
| Cookie first-party | Cookie gravado no domínio que o usuário está visitando. Só isso. Diz respeito ao endereço, não a quem escreveu. | Pouco. Se foi escrito por JavaScript, o teto de sete dias do Safari se
aplica igual. O _ga é first-party e é capado. |
| Dado first-party | Dado que a sua empresa coletou na sua própria relação com o cliente: cadastro, pedido, histórico, preferência. | Muito, mas é outro assunto: é propriedade, não coleta. Dá para ter ótimo dado first-party e coleta furada. |
| Coleta first-party | O evento é recebido por infraestrutura que você controla, no seu domínio, e o cookie de identidade é gravado pelo servidor, via cabeçalho HTTP. | É esta que resolve. Sai do teto de sete dias, reduz bloqueio e devolve o controle do que sai. |
Quando um fornecedor diz "somos first-party", pergunte qual dos três. Na maioria das vezes é o primeiro, que é o que menos importa.
Serve para qualquer ferramenta que se apresente como first-party. Responde em dois minutos:
O CNAME é o que mais gente erra. Apontar
metrics.sualoja.com.br por CNAME para um vendor foi, por um tempo, a saída padrão.
É detectável: navegadores comparam o destino final do DNS e bloqueadores mantêm listas
do padrão. O que sobrevive não é o CNAME — é infraestrutura de coleta sob o seu
controle, no seu domínio, com o seu certificado.
Cookie escrito pelo servidor não é capado em sete dias. Jornada multi-sessão e recorrência voltam a existir.
Requisição para o seu próprio domínio, servida pela sua infraestrutura, não casa com padrão de lista de bloqueio de vendor.
Você decide, por destino, qual campo vai e qual não vai. Hoje o navegador envia o que a tag quiser, e você descobre depois.
Menos script de terceiro no navegador. Efeito colateral em performance e em Core Web Vitals, que é receita também.
A frase que resume o capítulo: first-party é uma propriedade da arquitetura, não uma etiqueta que se cola numa ferramenta, quem escreve o cookie, quem recebe a requisição, quem controla o destino. Se as três respostas não forem "eu", o selo é retórico.
Há uma pergunta que costuma aparecer aqui e que não é técnica: se a minha coleta passa a rodar em infraestrutura de um fornecedor, o dado continua sendo meu?
É a pergunta certa. E a resposta honesta de qualquer fornecedor deveria ser verificável em contrato, não em slide. No nosso caso, a formulação é esta, e ela está escrita: a infraestrutura é nossa, o dado é seu. Você acessa a qualquer momento e, se sair, leva tudo.
Essa frase não diz que o dado fica no seu ambiente, a arquitetura é isolada por cliente, mas roda na nossa infraestrutura, e afirmar o contrário seria mentira que um head de TI derruba na primeira reunião. Ela diz onde está a propriedade e qual é o direito de saída. É a distinção que importa.
"Vamos para server-side" é uma frase que pode significar cinco projetos diferentes, com custos, prazos e resultados diferentes. Confundi-los é o motivo pelo qual tantos projetos entregam menos do que prometeram.
| Tecnologia | O que faz | Resolve quais mortes | Não resolve |
|---|---|---|---|
| 1 · Container server-side (sGTM e equivalentes) |
Um container de tags rodando em servidor seu. O navegador envia uma requisição para o seu endpoint; o servidor distribui para os destinos. | Morte 3 (cookie capado), parte da 1 (menos superfície), 4 (envio que resiste ao unload) | Morte 5. E não melhora nada se o dado que chega nele já vem errado. |
| 2 · API de conversão (CAPI, Events API, Enhanced Conversions) |
Envio servidor→plataforma, sem navegador no caminho. Pareamento por dado do cliente com hash (e-mail, telefone). | Mortes 1, 2 (quando há base legal), 4 | Morte 5 se a origem ainda é a página. Exige event_id ou duplica (morte 7). |
| 3 · Protocolo de medição (Measurement Protocol) |
Envio servidor→ferramenta de analytics, para eventos que não têm navegador. | Morte 5 (parcialmente) | Não resolve identidade sozinho: sem client_id correto, o evento entra
desconectado da sessão. |
| 4 · Backend como fonte (ERP / OMS / webhook do PSP) |
O evento nasce do fato de negócio — pedido confirmado, pagamento aprovado — não de uma página carregada. | Morte 5, de verdade. E é a única que resolve Pix, boleto, televendas e loja física. | Não devolve a jornada anterior à compra: precisa de identidade para ligar o pedido ao comportamento. |
| 5 · Warehouse como fonte (reverse ETL) |
O dado consolidado e modelado no armazém é a verdade, e é ele que alimenta as plataformas de volta. | Mortes 6 e 7 (contrato e deduplicação), e consistência entre destinos | Latência: não serve para otimização em tempo real. Exige o armazém existir e estar modelado. |
Leitura da tabela. Ninguém precisa das cinco. Quase todo mundo precisa de 1 + 2 + 4. A 3 é cola para casos específicos. A 5 é o estágio em que a medição deixa de ser um assunto de marketing e passa a ser infraestrutura de empresa.
A ordem importa, e é contraintuitiva: a mais barata de implementar não é a primeira a fazer.
// A ordem que funciona 1. Contrato de evento ← definir ANTES de mover qualquer coisa 2. Coleta first-party ← subdomínio + cookie escrito pelo servidor 3. Container server-side ← o navegador passa a falar só com você 4. APIs de conversão ← com event_id compartilhado, em paralelo 5. Backend como fonte ← onde o Pix para de ser invisível 6. Reconciliação contínua ← o que prova que os 5 acima funcionaram // A ordem que se vê na prática, e por que falha 1. APIs de conversão ← é a mais rápida de ligar… 2. …duplicação ← …e sem event_id, infla o ROAS 3. …ninguém reclama ← porque o número ficou melhor
O passo 1 é o que mais se pula e o que mais custa. Contrato de evento é o documento que define, para cada evento, o nome, quando dispara, quais campos são obrigatórios, qual é o tipo de cada campo e o que significa cada valor. Sem ele, cada destino recebe uma variação, e a divergência que você vai investigar seis meses depois nasceu aqui.
A página carrega 6 a 12 scripts de terceiro. Cada um abre conexão com o próprio domínio, escreve o próprio cookie por JavaScript, e envia o que quiser. Você não controla o payload e descobre o que foi enviado auditando requisição.
A página fala com um endpoint seu. O cookie vem do servidor com a validade que você definiu. O servidor decide, por destino, o que sai, e registra o que saiu.
O ganho mais defensável, e o que menos aparece em business case: auditabilidade. Depois da mudança, existe um lugar único onde se pergunta "o que foi enviado para o Meta ontem às 14h?", e há resposta. Isso muda a natureza da discussão de divergência: de opinião para consulta.
Este é o capítulo que vale mais que os outros na mesa de uma reunião técnica. Seis coisas que server-side não faz, e que são vendidas como se fizesse.
Mover a coleta para o servidor não cria base legal. Se o usuário recusou o tratamento para finalidade publicitária, enviar o dado dele pelo servidor é o mesmo tratamento, com uma camada de indireção. Sob LGPD, a indireção não é defesa.
Server-side ajuda na conformidade por outro caminho, legítimo e melhor: centraliza a decisão sobre o que sai, e a regra passa a ser aplicada em um lugar em vez de doze tags.
Se o seu checkout nunca capturou a categoria do produto, nenhum servidor vai adicioná-la. Uma quantidade desconfortável de projetos descobre no meio do caminho que o problema era o data layer, e que o servidor só transportou o vazio com mais eficiência.
O consentimento de rastreamento no iOS é sobre o identificador de publicidade do dispositivo. Não existe caminho de servidor que recupere um identificador que o sistema operacional não entrega. O que ajuda em app é outra coisa: enviar sinal de conversão de qualidade pelo SDK e pelo servidor, e aceitar que o pareamento será probabilístico e agregado.
Esta é a confusão mais caveira, porque é a mais confortável de acreditar.
Server-side e coleta first-party fazem a sua régua ficar melhor: mais evento chega, com mais integridade, e a identidade dura. Régua melhor significa atribuição menos enviesada. Não significa que você passou a saber o que o anúncio causou.
São duas perguntas diferentes, e exigem dois instrumentos diferentes.
"Este pedido teve contato com este canal?" → pergunta de coleta e atribuição. Resolve-se com coleta first-party e server-side. É deste material.
"Quanto dessa venda não teria acontecido se eu não tivesse investido?" → pergunta de incrementalidade. Não se resolve com pixel nenhum, por melhor que seja. Exige experimento (geo-teste, blackout) ou modelagem de contribuição. É outro material, outro projeto, outra conversa.
Depois de tudo implementado, plataforma e ERP continuam divergindo. Isso é correto, não é falha. Eles medem coisas diferentes:
O alvo é divergência explicada: um número estável, com causa conhecida, que você consegue reproduzir. Divergência de 8% que você sabe explicar é saudável. Divergência de 8% que ninguém sabe de onde vem é o mesmo problema de antes, com stack mais caro.
Sucesso é você conseguir explicar por que o número não bate, e a explicação ser sempre a mesma.
Server-side tem custo de implantação e custo de operação. O segundo é o que aparece depois e surpreende:
É justamente esse custo de operação — e não o de implantação — que decide comprar ou construir. Capítulo 12 abre a conta das duas colunas, sem torcer para nenhum lado.
Porque a Precisian já errou por acreditar no contrário. Passamos seis meses tentando fazer agente de IA responder pergunta de negócio em cima de dado não modelado. Ele inventava. Não porque o modelo era ruim, porque não havia contrato de métrica, não havia auditoria do dado, e ele puxava de qualquer lugar.
A lição que ficou vale para server-side igual: camada de transporte melhor não conserta camada de significado ausente. Quem te vender o transporte e chamar de solução está te vendendo um terço do problema.
Toda arquitetura de dado que funciona tem as mesmas três camadas. Quando um projeto trava, é quase sempre porque alguém tratou duas delas como uma.
CAMADA 1 · COLETA de onde o evento nasce navegador (data layer) ──┐ backend (ERP/OMS) ──┤ webhook do PSP ──┼──► endpoint no SEU domínio app (SDK) ──┤ cookie escrito pelo SERVIDOR CRM / televendas ──┘ CAMADA 2 · TRANSPORTE o contrato e a identidade validação de schema ──┐ resolução de identidade ──┼──► evento canônico, com event_id enriquecimento ──┤ regra de consentimento ──┘ CAMADA 3 · DESTINO quem consome ├─► plataformas de mídia (CAPI, Events API, Enhanced Conv.) └─► armazém / lake ← o único que guarda histórico
Não basta ter um subdomínio: ele precisa ser servido por infra que responde por você, com o seu certificado. Subdomínio que resolve por CNAME para o endpoint de um fornecedor é tratado como terceiro, e o teto de sete dias volta.
Escolha um nome que não pareça ferramenta de rastreamento:
track,
analytics, pixel e metrics estão em listas de bloqueio.
Algo neutro e curto não é truque: é só não se anunciar ao bloqueador.
Nenhum outro detalhe desta arquitetura pesa tanto. O cookie de identidade tem que ser emitido pelo servidor, no cabeçalho HTTP:
Set-Cookie: _pid=<identificador-opaco>; Domain=.sualoja.com.br; // o seu domínio, não o do fornecedor Path=/; Max-Age=34164000; // ~13 meses; não é capado em 7 dias Secure; HttpOnly; // HttpOnly: JS não lê, então JS não pode ser capado SameSite=Lax
Por que HttpOnly importa além de segurança: cookie que o
JavaScript não lê também não é confundido com cookie escrito por JavaScript, e vive fora das
restrições que capam o client-side.
Aqui mora o trabalho que ninguém quer fazer e que decide se o projeto envelhece bem: um documento versionado que define cada evento com precisão de API.
{
"event": "purchase",
"event_id": "ord_88421-1726500000", // dedup entre navegador e servidor
"event_time": 1726500000, // quando o FATO ocorreu, não o envio
"source": "backend", // browser | backend | psp_webhook | erp
"identity": {
"anonymous_id": "a1f…", // cookie escrito pelo servidor
"user_id": "cli_40192", // ID do cliente no ERP, estável
"email_sha256": "9c1…" // normalizado antes do hash
},
"order": {
"order_id": "88421", // a MESMA chave do ERP
"status": "paid", // created | paid | invoiced | canceled
"revenue": 489.90, // definição declarada abaixo
"revenue_basis": "net_no_shipping", // ← o campo que evita 6 meses de briga
"payment_method": "pix",
"currency": "BRL"
},
"consent": { "ads": true, "analytics": true },
"schema_version": "1.2.0"
}
Três campos deste exemplo faltam em quase toda implementação que revisamos:
event_id, sem ele, navegador e servidor enviando o mesmo evento produzem
duas conversões. É a morte 7.revenue_basis: declarar qual receita você envia (bruta, líquida,
com ou sem frete e imposto) encerra a discussão mais comum de divergência. Custa um campo.status: distinguir pedido criado de pagamento aprovado é o que faz Pix e
boleto serem contabilizáveis sem inflar.Plataformas de mídia e o armazém não são dois destinos equivalentes:
| Plataformas de mídia | Armazém / lake | |
|---|---|---|
| Retenção | janela limitada, definida por elas | o histórico inteiro, definido por você |
| Granularidade | agregada, cada vez mais | evento a evento |
| Critério | o delas, e muda sem aviso | o seu, versionado |
| Se você sair | o dado fica lá | o dado é seu |
Daí a regra: o armazém é o único destino em que você reconstrói o passado, e por isso não cabe em "fase 2". Sem ele, cada mudança de critério de uma plataforma apaga a sua série histórica, e você descobre no ano seguinte, quando precisar comparar.
Se você fizer tudo neste material e errar identidade, terá construído um transporte confiável para um dado que não se conecta a nada. É aqui que os projetos realmente falham.
| Nível | Chave | Vive quanto | Serve para |
|---|---|---|---|
| Dispositivo | anonymous_id (cookie do servidor) |
~13 meses, se escrito pelo servidor | jornada antes do login |
| Pessoa | user_id (ID do cliente no ERP) |
para sempre | ligar dispositivos e sessões à mesma pessoa |
| Fato | order_id | para sempre | reconciliar. É a âncora. |
A verdade da receita não está na sessão. Está no pedido. Toda arquitetura que ancora em
sessão termina em discussão; toda arquitetura que ancora em order_id termina
em consulta.
anonymous_id na primeira
requisição. Todo evento subsequente carrega esse identificador.anonymous_id → user_id, com data e hora.anonymous_id
(celular, desktop, aba anônima). A tabela de vínculo é o que transforma quatro visitantes
em um cliente.O erro que parece atalho: usar o e-mail em texto puro como chave de
junção entre sistemas. Além do problema de proteção de dado, e-mail muda, tem variação de
caixa e de espaço, e aparece com alias. Use user_id do ERP como chave
interna e hash normalizado do e-mail apenas para o pareamento com plataformas
externas.
Plataformas pareiam por hash do e-mail e do telefone. Se você normaliza diferente do que elas esperam, o hash não casa e a taxa de pareamento cai sem nenhum erro aparecer em log nenhum.
// e-mail minúsculas → remover espaços nas pontas → SHA-256 " Joao.Silva@Loja.com " → "joao.silva@loja.com" → 9c1a… // telefone (Brasil), o que mais erra só dígitos → com código do país → sem zero de operadora "(11) 98765-4321" → "5511987654321" → 4f2b…
Teste de aceite: a própria plataforma reporta uma qualidade ou taxa de correspondência do evento. Esse indicador é o termômetro. Se ele não subir depois de ligar a API de conversão, a normalização está errada, não o volume.
O desenho correto envia o evento importante duas vezes: do navegador e do servidor. Parece desperdício e não é: são duas chances de o evento sobreviver a mortes diferentes. O navegador morre por bloqueio; o servidor morre por falha de integração. Enviar pelos dois é redundância proposital.
O que faz isso funcionar em vez de duplicar é o event_id idêntico
nos dois envios. Recomendação para e-commerce: derive-o de algo que já é único e estável.
// bom: determinístico, igual nos dois caminhos event_id = "purchase_" + order_id // ruim: gerado na hora, diferente em cada envio → duplica event_id = uuid()
Como saber se você está duplicando hoje: compare a contagem de conversões da plataforma com a contagem de pedidos do ERP no mesmo dia. Se a plataforma reporta mais conversões do que existiram pedidos, a dedup está quebrada. É um teste de cinco minutos e derruba a conversa de "a plataforma exagera".
"A mesma pessoa comprada duas vezes" é um problema de identidade, não de atribuição. O cliente do CRM aparece como desconhecido para a plataforma porque a costura de identidade não existe, então você paga aquisição por recompra. Resolver identidade devolve margem antes de devolver relatório.
Não é orientação jurídica. É a descrição de mecanismos técnicos e das escolhas que eles impõem, para você levar ao seu jurídico a pergunta certa, e não a genérica.
| Sinal | O que governa |
|---|---|
analytics_storage | guardar identificador para fins de análise |
ad_storage | guardar identificador para fins publicitários |
ad_user_data | enviar dado do usuário para a plataforma de anúncios |
ad_personalization | usar o dado para personalizar anúncio |
Os dois últimos foram a novidade da v2 e são justamente os que governam envio por API de
conversão. Sem ad_user_data, o envio server-side de dado do cliente não
deveria acontecer, e é exatamente esse envio que as implementações apressadas fazem
sem checar.
| Modo | Comportamento | Consequência |
|---|---|---|
| Básico | As tags não carregam antes do consentimento. Quem recusa ou ignora não gera nada. | Mais conservador. Você perde inteiramente o sinal pré-consentimento, inclusive a informação de que a visita existiu. |
| Avançado | As tags carregam e enviam pings sem cookie quando não há consentimento. O Google usa isso para modelar a lacuna. | Recupera mais. Mas parte do que você lê passa a ser modelado, e modelo não é medição. |
A regra de uso de conversão modelada, e ela é inegociável: modelo serve para ler tendência e para alimentar otimização de lance. Não serve para fechar economia unitária. Se o seu CAC, a sua margem de contribuição ou a sua decisão de investimento se apoiam em conversão modelada, você está decidindo sobre uma estimativa e chamando de medida. Mantenha as duas leituras separadas, sempre, com rótulo.
A LGPD não fala em cookie. Fala em tratamento de dado pessoal, finalidade e base legal. A tradução prática, e que tende a ser o enquadramento mais defensável:
Note que a distinção não é técnica — é de finalidade. Duas empresas com arquitetura idêntica podem estar em situações jurídicas diferentes por causa do que declaram e do que fazem com o dado.
consent do contrato do capítulo 7 não é enfeite — é o que permite aplicar a
regra no servidor.O efeito colateral que é o melhor argumento interno para esta arquitetura: ela torna a conformidade verificável. Antes, "nós respeitamos o consentimento" é uma afirmação sobre doze tags que ninguém consegue auditar de uma vez. Depois, é uma consulta a um registro. Quando o jurídico pergunta, existe resposta, e é a mesma resposta que o time de dados dá.
Ordem importa mais que velocidade. Cada fase tem um entregável verificável, uma coisa que costuma quebrar, e um critério de saída. Quem pula a fase 0 não consegue provar nada depois.
Os prazos abaixo supõem uma operação de e-commerce de porte médio, com time de front disponível e acesso ao ERP. São faixas de referência, não compromisso. A variável que mais desloca prazo não é técnica — é quanto tempo leva para conseguir agenda do time que mexe no checkout.
~2 semanas. A fase que todo mundo quer pular e é a única que não pode faltar.
~2 a 3 semanas. O trabalho menos glamouroso e o de maior retorno.
transaction_id não é o ID do ERP. Corrigir isso
é a fase.order_id do data layer casando com o do ERP em
amostra.Se o orçamento só der para uma fase, faça a 1. Contrato de evento sem server-side vale mais que server-side sem contrato de evento.
~2 semanas. Pouco código, e é onde o teto de sete dias morre.
Set-Cookie conforme o
capítulo 7.~3 a 4 semanas. 🔴 Em paralelo, nunca em substituição.
event_id compartilhado.Por que paralelo: durante 2 a 4 semanas você tem os dois caminhos ativos e compara. Sem essa comparação não se distingue "melhorou" de "duplicou". Corte seco não permite essa comparação, e é assim que se comemora uma inflação.
~3 a 4 semanas. A fase em que o Pix para de ser invisível.
Permanente. É a operação, não uma fase de projeto. É o que impede que tudo isso volte ao estado anterior em seis meses.
| Fase | Entregável | O teste que prova | Prazo ref. |
|---|---|---|---|
| 0 | inventário + linha de base | divergência de hoje escrita, com definição | 2 sem |
| 1 | contrato de evento + data layer | schema válido em 100% das conversões | 2–3 sem |
| 2 | coleta first-party | usuários novos: Safari converge com Chrome | 2 sem |
| 3 | server-side + APIs, em paralelo | contagem coerente com ERP + qualidade de match sobe | 3–4 sem |
| 4 | backend como fonte | receita por meio de pagamento converge, Pix incluído | 3–4 sem |
| 5 | reconciliação + alerta | divergência estável e explicada | contínuo |
Total de 12 a 15 semanas para as fases 0 a 4, numa operação com agenda de desenvolvimento disponível. Se o seu fornecedor prometer isso em três semanas, pergunte quais fases ele está pulando, e a resposta quase sempre é a 0, a 1 e a 4. Que são as três que resolvem.
Implementação que não termina em número é opinião com nota fiscal. Este é o protocolo, e ele começa antes de comparar qualquer coisa.
A maior parte da divergência que se atribui a falha técnica é, na verdade, definicional. Antes de comparar, escreva:
| Decisão | As opções que mudam o resultado |
|---|---|
| Qual é o evento de receita? | pedido criado · pagamento aprovado · nota emitida · pedido entregue |
| A receita inclui o quê? | frete · imposto · desconto · cashback · brinde |
| Como entram cancelamento e devolução? | abatidos na data do pedido · na data do cancelamento · não abatidos |
| Qual fuso e qual fechamento de dia? | a plataforma pode fechar o dia em outro fuso que o seu ERP |
| Qual janela de atribuição? | 7, 30, 90 dias · com ou sem visualização |
Duas pessoas comparando os mesmos sistemas com definições diferentes chegam a divergências diferentes, e discutem por semanas achando que discutem de técnica.
PLATAFORMA MEDIÇÃO ERP Δ vs ERP pedidos 1.284 1.402 1.451 −11,5% / −3,4% receita (líq., s/frete) R$ … R$ … R$ … … ├─ cartão … … … ← costuma fechar ├─ Pix … … … ← o buraco mora aqui └─ boleto … … … ← defasagem de dias novos × recorrentes … … … ← testa identidade
Quebrar por meio de pagamento é o que transforma "não bate" em um achado localizado. Divergência concentrada no Pix é morte 5. Divergência espalhada por igual é definição ou janela. Divergência só em novo × recorrente é identidade.
| # | Verificação | Sinal de que está errado |
|---|---|---|
| 1 | Taxa de bloqueio: requisições de página no servidor × page_view |
diferença muito acima da faixa de adoção de bloqueador da sua audiência |
| 2 | Usuários novos: Safari × Chrome | Safari ainda bem acima → o cookie continua sendo escrito por JavaScript |
| 3 | Conversões da plataforma × pedidos do ERP | plataforma acima do ERP → deduplicação quebrada |
| 4 | Indicador de qualidade de correspondência da plataforma | não subiu depois da API de conversão → normalização errada |
| 5 | Receita por meio de pagamento, medição × ERP | Pix sub-representado → o evento ainda nasce na página |
| 6 | Volume de evento por hora, contra a faixa esperada | fora da faixa sem explicação de negócio → algo quebrou |
| 7 | order_id presente e casando com o ERP, em amostra |
ausente ou divergente → você não consegue investigar nada item a item |
O capítulo 3 falou da tag que quebrou há três semanas. Isto é o conserto:
A pergunta que mede a maturidade da sua coleta não é "qual a nossa divergência". É "quanto tempo levaria para a gente descobrir que ela mudou".
Duas armadilhas de verificação que já nos pegaram, e as duas inflam para cima sem parecer erro: (1) ferramenta de depuração de tag ligada em produção infla a contagem da propriedade de analytics; (2) uma ação de conversão baseada em visualização de página marcada como primária infla a contagem da plataforma de anúncios. São falhas independentes: corrigir uma não corrige a outra. Antes de ler custo por conversão, quebre por ação de conversão e confirme quais estão marcadas como primárias.
Nós vendemos a versão comprada disso. Então o capítulo é escrito com a conta aberta dos dois lados, e com a parte em que construir é a resposta certa dita em voz alta.
A conta que quase sempre é subestimada é a de sustentação, porque implantação acaba e sustentação não.
| Componente | O que é | Custo contínuo |
|---|---|---|
| Ingestão / pipeline | conector para cada fonte: mídia, ERP, CRM, gateway, marketplace | licença por volume + manutenção quando a API muda |
| Armazenamento | o armazém que guarda o histórico | conta de nuvem, que cresce com o tempo e com o tráfego |
| Modelagem | transformar evento cru em métrica com definição | tempo de engenharia de analytics, permanente |
| Coleta | o subdomínio, o container server-side, as APIs | infra por volume de evento + correção a cada mudança de plataforma |
| Visualização | o front que alguém de fato usa | licença + backlog de pedidos que nunca zera |
| Sustentação | alguém responsável quando quebra às 23h da Black Friday | pessoa. É o item mais caro e o menos orçado |
"Nenhum time interno quer manter conector. Todo time interno quer usar o dado."
Essa frase é o resumo do capítulo. O trabalho é dividido em duas naturezas bem diferentes: manter encanamento e produzir decisão. Só a segunda é vantagem competitiva, e é a primeira que consome o time.
Sem rodeio. Construa se:
O enquadramento honesto, e é assimétrico a favor de agir: ninguém precisa de uma projeção de retorno para justificar isso. Se a sua leitura de CAC está enviesada e você investe de forma relevante em mídia, uma correção de poucos pontos percentuais na alocação já paga a conta, pela versão comprada ou pela construída. O que não se paga é continuar decidindo sem saber o tamanho do viés.
Perguntar isso a qualquer fornecedor separa quem vende projeto de quem vende plataforma: quando uma tag quebrar, de quem é o problema?
Se a resposta for "abre um ticket e a gente orça", você comprou implantação, não sustentação, e a morte aguda do capítulo 3 continua sendo sua. A formulação que usamos, e que está em contrato: enquanto você é cliente, a saúde do seu tracking é responsabilidade nossa. Se uma tag quebrar, o problema é nosso antes de ser seu.
Este material te dá um mapa de onde o dado morre e a ordem de conserto. Existe uma linha a partir da qual nenhum material consegue te ajudar, e ela é fácil de nomear.
Tudo aqui te diz onde você perde sinal e como parar de perder. O que não te diz é quanto essa perda custou, e esse número só sai cruzando a sua série de coleta com o seu dado de venda.
Não é modéstia retórica: quantificar perda exige um contrafactual. Exige saber o que teria acontecido com a coleta correta, e isso não se estima de fora, com benchmark de mercado. Se estimássemos, seria chute com casa decimal, e você não teria como nos contestar. É justamente o tipo de número que este material se recusa a produzir.
Se quiser passar o seu caso antes de decidir, a conversa é técnica e sem compromisso, e, sendo honesto sobre o que ela é: dura uns 40 minutos, quem senta do outro lado é quem executa, e o resultado dela pode perfeitamente ser "o seu problema é menor do que você pensa, não precisa de nós".