Você confia nos números do seu GA4? Se a resposta depende do relatório que você abre, o problema quase nunca está na ferramenta de análise. Está na origem: a forma como os dados saem do site e chegam até a tag. É ali que mora a camada de dados, o dataLayer.
A maior parte das divergências entre GA4, Google Ads e o back-office começa com um dataLayer improvisado, montado às pressas para “fazer a conversão disparar”. Funciona por uma semana. Depois um deploy muda o nome de uma variável e a receita reportada despenca sem que ninguém entenda por quê.
Neste guia prático, você vai entender o que é o dataLayer, como estruturar um dataLayer.push() que não quebra a cada atualização do site, como configurar o Google Tag Manager (GTM) para ler os dados e como validar tudo antes de publicar. Os exemplos numéricos são hipotéticos; o comportamento técnico segue a documentação oficial do Google.
O que é a camada de dados (dataLayer)
Segundo a documentação oficial do Google, o dataLayer é um objeto JavaScript, em formato JSON, que o GTM e o gtag.js usam para repassar informações às tags. Com ele, é possível disparar tags com base em eventos e em valores de variáveis. Em termos práticos, é um contrato entre o site e o rastreamento: o site informa o que aconteceu, e o GTM decide o que enviar ao GA4.
Sem esse contrato, o GTM precisa “adivinhar” os dados lendo o HTML da página (textos, classes CSS, seletores). Qualquer mudança de layout quebra a leitura. Com o dataLayer, o dado vem direto do sistema que o conhece, como a loja ou o back-end do pedido.
Como o dado percorre o rastreamento
- 1Evento no site
O cliente conclui um pedido, clica em um botão ou envia um formulário. - 2dataLayer.push no site
O código da página registra o evento e seus dados no dataLayer. - 3Acionador no GTM
Um acionador do tipo Evento personalizado reconhece o nome do evento. - 4Tag de evento do GA4
A tag lê as variáveis e envia o evento ao GA4. - 5Relatório e decisão
O dado chega aos relatórios, às explorações e às conversões.
O diagrama mostra por que a qualidade do dado é decidida no segundo passo. Se o push sai errado, todos os passos seguintes herdam o erro.
Por que o dataLayer decide a qualidade do rastreamento
- Estabilidade: o nome do evento e das chaves não depende do visual da página.
- Precisão: valores como receita, moeda e identificador do pedido vêm do sistema, sem raspagem de texto.
- Governança: o contrato fica documentado, e desenvolvimento e marketing falam a mesma língua.
- Reuso: o mesmo evento alimenta GA4, Google Ads e outras tags, sem reescrever o código.
Como estruturar um dataLayer.push confiável
1. Declare o dataLayer antes do GTM
A documentação orienta criar o objeto antes do snippet do contêiner. A forma segura é usar a atribuição condicional, que preserva valores já existentes:
<script>
window.dataLayer = window.dataLayer || [];
</script>
<!-- Snippet do Google Tag Manager aqui -->
2. Use push, nunca atribuição
O envio de dados é feito com dataLayer.push(). Atribuir diretamente (dataLayer = [...]) apaga o que já estava lá, e a documentação lista isso entre os erros comuns.
dataLayer.push({
event: 'envio_formulario',
form_id: 'orcamento',
form_name: 'Pedido de orçamento'
});
3. Defina uma convenção de nomes e siga sempre
| Elemento | Regra | Exemplo correto | Exemplo problemático |
|---|---|---|---|
| Nome do evento | snake_case, minúsculas, verbo ou ação | add_to_cart | AddToCart, add-to-cart |
| Chaves | snake_case, mesmo padrão em todas as páginas | item_name | itemName em uma página e item_name em outra |
| Moeda | Código ISO de três letras | BRL | R$ |
| Valores numéricos | Número com ponto decimal | 49.90 | “49,90” |
| Identificadores | Texto estável e único | T_100234 | Sem identificador |
Tabela: Analytikos
A convenção em si é recomendação da Analytikos; o que a documentação do Google reforça é que nomes inconsistentes, como visitorType em uma página e visitor_type em outra, impedem o disparo correto das tags. Para os nomes dos eventos recomendados do GA4, veja o guia de GA4 para e-commerce.
4. Em e-commerce, limpe o objeto ecommerce antes de cada push
Na documentação de e-commerce do GA4 para GTM, os exemplos executam dataLayer.push({ ecommerce: null }) antes de cada evento, para que parâmetros de um evento anterior não vazem para o próximo. O evento purchase exige transaction_id, e a página recomenda enviar currency junto com value.
dataLayer.push({ ecommerce: null });
dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: 'T_100234',
value: 329.50,
shipping: 19.90,
currency: 'BRL',
items: [
{ item_id: 'SKU_1', item_name: 'Camiseta Básica', price: 49.90, quantity: 3 },
{ item_id: 'SKU_2', item_name: 'Calça Jeans', price: 89.90, quantity: 2 }
]
}
});
A conta do value: segundo a documentação, é a soma de preço × quantidade de todos os itens. Aqui: 3 × R$ 49,90 + 2 × R$ 89,90 = R$ 149,70 + R$ 179,80 = R$ 329,50. O frete (R$ 19,90) vai em shipping, separado.

Como configurar o GTM para ler o dataLayer
- Crie um acionador do tipo Evento personalizado com o mesmo nome do evento do push (por exemplo,
purchase). Os nomes precisam coincidir. - Crie variáveis de camada de dados para as chaves que não são de e-commerce (por exemplo,
form_id). Veja a documentação de variáveis definidas pelo usuário. - Crie uma tag de evento do GA4. Para e-commerce, use
{{Event}}como nome do evento e, em Mais configurações > E-commerce, marque Enviar dados de e-commerce com fonte de dados Camada de dados, conforme a documentação do GA4. - Associe o acionador à tag.
- Teste no modo de visualização antes de publicar.
Se você ainda não domina os conceitos de tag, acionador e variável, comece pelo guia de GTM para iniciantes.
Ordem de processamento: o cuidado com o tempo
A documentação explica que chamadas de dataLayer.push() são enfileiradas, e por isso valores atualizados podem não estar disponíveis para o evento seguinte. A solução indicada é incluir um nome de evento na mensagem e escutá-lo com um acionador de evento personalizado, em vez de depender de uma variável já preenchida. Também lembra que variáveis valem apenas enquanto o visitante permanece na página; em outras páginas, é preciso enviá-las de novo.
Sites de página única (SPA)
A documentação do Google sobre o dataLayer não trata de SPAs. Como recomendação da Analytikos, envie um evento próprio a cada troca de rota (por exemplo, page_view_virtual) com a nova URL e o título, e deixe o GTM disparar a visualização de página a partir desse evento. Valide no modo de visualização que o evento ocorre uma vez por navegação.
Como validar antes de publicar
- Modo de visualização do GTM: confirme que o evento aparece com o nome certo e que o acionador disparou a tag. Veja a documentação do modo de visualização.
- Console do navegador: digite
dataLayere inspecione os objetos enviados, conferindo tipos (número é número, não texto). - DebugView do GA4: confirme que o evento chegou com todos os parâmetros. Veja a documentação do DebugView.
- Teste de ponta a ponta: faça um pedido real de teste e compare o
valuedo GA4 com o do back-office. Se houver diferença, siga o guia de por que a receita do GA4 não bate com a da loja.
Do dado à decisão de mídia
Quando o dataLayer entrega receita, moeda e identificador corretos, GA4 e Google Ads passam a comparar números do mesmo evento. Isso reduz a discussão sobre qual relatório está certo e permite decidir orçamento com base em um dado único. Para ler os resultados e cruzar com a loja e a mídia em um só painel, a Athena, plataforma de BI para e-commerce da Analytikos, reúne loja, GA4 e mídia (teste de 30 dias grátis). Se a implementação envolve consentimento, veja também o texto sobre Consent Mode.
Erros comuns que sujam seus dados
Erros de implementação
| Erro | Por que distorce | Como corrigir |
|---|---|---|
| Atribuir dataLayer = […] em vez de usar push | Apaga valores já enviados, e eventos anteriores deixam de existir para o GTM | Declarar com window.dataLayer = window.dataLayer || [] e usar sempre push |
| Digitar datalayer.push (minúsculo) | O nome diferencia maiúsculas; o push falha e o evento nunca chega | Padronizar no código e revisar em code review |
| Chaves sem aspas quando têm hífen | {new-variable: “x”} é inválido em JavaScript e quebra o script | Usar aspas ou snake_case |
| Nomes diferentes para a mesma chave | Tags deixam de disparar em algumas páginas | Documentar o contrato e validar em todas as páginas |
| Reinicializar window.dataLayer depois do GTM | Perde o que já foi registrado | Inicializar uma única vez, antes do contêiner |
Tabela: Analytikos
Erros de dados de e-commerce
| Erro | Por que distorce | Como corrigir |
|---|---|---|
| Incluir frete no value | Com os números do exemplo, 329,50 + 19,90 = 349,40, um excesso de 6,0% (19,90 ÷ 329,50) | Enviar value como soma de preço × quantidade e frete em shipping |
| Preço como texto com vírgula (“49,90”) | O GA4 não soma texto como número e a receita pode zerar ou falhar | Enviar número com ponto decimal |
| Não limpar ecommerce antes do push | Itens do evento anterior aparecem no próximo | Executar dataLayer.push({ ecommerce: null }) antes de cada evento |
| Sem transaction_id | Não há como deduplicar; recarregar a página de confirmação duplica a compra | Enviar identificador único e impedir reenvio |
| Moeda ausente | Receita em moeda indefinida | Enviar currency: “BRL” junto com value |
Tabela: Analytikos
Erros de processo
- Documentar só na cabeça de uma pessoa. Quando ela sai, ninguém sabe o que cada evento deve conter. Mantenha um plano de medição com evento, chaves, tipo e exemplo.
- Publicar sem validar. Um push com o nome errado só aparece semanas depois, no relatório. Teste no modo de visualização e no DebugView antes de cada publicação.
- Depender de variáveis preenchidas no momento errado. Como os pushes são enfileirados, uma variável pode ainda estar vazia no evento. Dispare por evento personalizado.
- Ignorar o consentimento. Dados enviados sem respeitar a escolha do usuário criam risco jurídico e lacunas de medição.
- Nunca auditar. Revise o dataLayer a cada mudança de tema ou checkout e inclua a verificação na auditoria de GA4.
Checklist de dataLayer confiável
- dataLayer declarado antes do snippet do GTM, com atribuição condicional.
- Todos os envios feitos com push, nunca com atribuição.
- Convenção de nomes documentada e seguida em todas as páginas.
- Eventos de e-commerce com ecommerce: null antes de cada push.
- value como soma de preço × quantidade, frete separado e moeda em ISO.
- transaction_id único em toda compra.
- Acionadores de evento personalizado com nomes idênticos aos do push.
- Eventos de troca de rota definidos para SPAs.
- Validação no modo de visualização, no console e no DebugView.
- Teste de pedido real comparado com o back-office.
- Plano de medição versionado e revisado a cada mudança do site.
Perguntas frequentes
O que é o dataLayer?
É um objeto JavaScript que o GTM e o gtag.js usam para receber informações do site. O site registra eventos e dados com dataLayer.push, e o GTM os lê para disparar tags.
Preciso do dataLayer para usar o GA4?
Não é obrigatório para eventos simples, mas é a forma mais confiável de enviar dados de e-commerce e formulários, porque o dado vem do sistema e não da leitura da tela.
Qual a diferença entre dataLayer.push e atribuir dataLayer?
O push acrescenta dados à fila. Atribuir (dataLayer = […]) substitui o objeto e apaga o que já havia, o que está entre os erros comuns citados na documentação do Google.
Por que limpar o objeto ecommerce antes de cada evento?
Para que parâmetros de um evento anterior não vazem para o seguinte. Os exemplos oficiais do GA4 para GTM executam dataLayer.push({ ecommerce: null }) antes de cada push.
Como testar se o dataLayer está certo?
Use o modo de visualização do GTM, inspecione o dataLayer no console e confirme a chegada do evento no DebugView do GA4. Depois, compare um pedido de teste com o back-office.
O dataLayer funciona em site de página única?
Funciona, mas a documentação do Google sobre o dataLayer não detalha SPAs. Recomendamos enviar um evento a cada troca de rota e validar que ele ocorre uma vez por navegação.



