Guia · GA4
Tag quebrada no GA4: como achar antes de perder meses de funil
Guia mantido. Revisado a cada 6 meses; última revisão em . Casos de lojas que atendemos, sem identificação.
Resumo
- Numa loja que atendemos, o add_to_cart foi perdendo força em janeiro, morreu em março e só voltou em outubro, com a troca de plataforma. Sete meses de funil errado sem nenhum alerta.
- O GA4 não sabe que um evento deveria existir. Se ele para, o relatório só mostra um número menor.
- Cinco checagens pegam quase tudo: funil impossível, razão entre etapas, onde o evento dispara, parâmetros obrigatórios e comparação com os pedidos da loja.
- Nem todo degrau é tag quebrada: tráfego novo que infla o denominador e dia ainda incompleto parecem quebra e não são.
- Em migração de loja, confira também o que estava no código fora do GTM: some junto com a loja antiga.
O GA4 tem um ponto cego que custa caro: ele não sabe que um evento deveria existir. Se o add_to_cart para de disparar, o relatório não mostra erro. Mostra um número menor. E número menor, num mês ruim, parece só um mês ruim.
Sete meses sem add_to_cart
Numa loja que atendemos, as visualizações de produto ficaram estáveis o ano inteiro, entre 52 e 58 mil por dia. O add_to_cart contou outra história:
| Período | add_to_cart por dia | add_to_cart ÷ view_item |
|---|---|---|
| Até meados de janeiro | ~4.400 | ~7,7% |
| Fim de janeiro | ~200 | — |
| Fevereiro a início de março (implementação nova) | ~1.900 | ~3,1% |
| Março a início de outubro | ~100 | ~0,2% |
| Depois da troca de plataforma, em outubro | — | 4,8% |
O evento degradou em janeiro, ganhou uma implementação nova em fevereiro que já capturava menos da metade, morreu em março e só voltou em outubro, quando a loja trocou de plataforma. Sete meses de funil errado. Qualquer análise de carrinho, qualquer público de remarketing de quem adicionou ao carrinho, qualquer teste A/B medido por add_to_cart nesse período estava errado.
E os sinais estavam todos no dado:
- Funil impossível. O
begin_checkoutera 9 vezes maior que oadd_to_cart. Ninguém inicia o checkout sem ter adicionado nada. - Lugar errado. 100% dos
add_to_cartrestantes disparavam na página do carrinho, nenhum na página de produto. O evento só saía quando o site redirecionava para o carrinho; quem adicionava pelo botão da listagem não gerava nada. - Parâmetro faltando. Nenhum
add_to_cartlevavacurrencynemvalue.
As cinco checagens
1. Funil impossível. Cada etapa tem que ser menor ou igual à anterior, com folga: view_item > add_to_cart > begin_checkout > purchase. Se uma etapa passa a anterior, algo está quebrado.
2. Razão entre etapas, dia a dia. O número absoluto oscila com o tráfego; a razão (add_to_cart ÷ view_item) é bem mais estável. Degrau na razão, com a etapa anterior estável, é o sinal mais forte de tag.
3. Onde o evento dispara. Agrupe o evento pela página (page_location). add_to_cart só no carrinho, purchase fora da página de obrigado, view_item na home: cada um conta uma história.
4. Parâmetros obrigatórios. Para e-commerce, pelo menos currency, value e items com item_id. Evento sem eles chega, mas não serve para receita, remarketing nem relatório de produto.
5. Comparação com a fonte da verdade. A compra do GA4 tem que ser comparada com os pedidos da plataforma, todo dia. Numa loja VTEX, o GA4 registra entre 84% e 88% dos pedidos, estável há anos (detalhes). O nível em si é uma conversa; a mudança de nível é um alarme.
A consulta
Com o export do GA4 para o BigQuery ligado, esta consulta faz as checagens 1 e 2 para os últimos 120 dias:
WITH diario AS (
SELECT
PARSE_DATE('%Y%m%d', event_date) AS dia,
COUNTIF(event_name = 'view_item') AS view_item,
COUNTIF(event_name = 'add_to_cart') AS add_to_cart,
COUNTIF(event_name = 'begin_checkout') AS begin_checkout,
COUNTIF(event_name = 'purchase') AS purchase
FROM `seu-projeto.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX >= FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 120 DAY))
GROUP BY 1
)
SELECT
dia, view_item, add_to_cart, begin_checkout, purchase,
ROUND(SAFE_DIVIDE(add_to_cart, view_item), 4) AS atc_por_view,
ROUND(SAFE_DIVIDE(add_to_cart,
AVG(add_to_cart) OVER (ORDER BY dia ROWS BETWEEN 28 PRECEDING AND 1 PRECEDING)), 2) AS atc_vs_media_28d,
begin_checkout > add_to_cart AS funil_impossivel
FROM diario
ORDER BY dia DESC
E esta faz as checagens 3 e 4 para um evento:
SELECT
REGEXP_EXTRACT(
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location'),
r'https?://[^/]+(/[^?#]*)') AS caminho,
COUNT(*) AS eventos,
COUNTIF((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'currency') IS NULL) AS sem_currency,
COUNTIF(ARRAY_LENGTH(items) = 0) AS sem_items
FROM `seu-projeto.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX >= FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))
AND event_name = 'add_to_cart'
GROUP BY caminho
ORDER BY eventos DESC
LIMIT 20
atc_vs_media_28d abaixo de 0,5 num dia comum já merece uma olhada. Melhor ainda é rodar isso todo dia e receber o aviso. No HUB, o relatório diário de funil compara cada etapa com a média recente e marca o que desviou.
Falsos alarmes
Nem todo degrau é tag. Três casos que já vimos parecerem quebra e não eram:
- O denominador inflou. Numa loja, todas as taxas por sessão (carrinho, checkout, conversão) caíram em degrau num único dia. Parecia tag. Era o Google Ads: duas campanhas Performance Max triplicaram os cliques com CPC mais baixo, as sessões subiram cerca de 50% e os pedidos ficaram iguais. As conversões do Ads foram as mesmas nos 15 dias antes e depois, com 24% mais custo. A taxa caiu porque entrou tráfego que não comprava, não porque um evento parou.
- O dia ainda não fechou. Um relatório que sai às 7h da manhã com metade das compras de ontem pode ser só o dado de ontem que ainda não chegou inteiro. Antes de chamar de quebra, confira se a fonte terminou de chegar.
- O evento nunca existiu.
add_shipping_infoeadd_payment_infozerados há meses não quebraram: nunca foram implementados. É lacuna, não alarme.
Regra prática: olhe sempre o numerador e o denominador separados, e confira com os pedidos da loja antes de mexer em tag.
Em migração de loja, a atenção dobra
Troca de plataforma é o momento em que mais se quebra (e, às vezes, se conserta) tracking. Duas coisas para conferir no primeiro dia da loja nova:
- O funil inteiro, evento por evento, com as cinco checagens acima, comparando com a semana anterior.
- O que estava no código, fora do GTM. Numa loja, os parâmetros de remarketing do Google Ads saíam direto do código da plataforma antiga. Ninguém sabia, porque não estavam no GTM. Na migração, sumiram junto com a loja velha, e a queda só apareceu no painel de fontes de dados do Google Ads. "Nada mudou no GTM" não basta.
Quando achar
- Anote a data exata em que quebrou. Ela vai servir para excluir o período de análises e testes.
- Confirme no navegador, fazendo a ação de verdade. Adicione um produto ao carrinho e veja se o push chega no
dataLayer. Se o site não empurra o evento, corrigir o GTM não adianta. - Teste os caminhos alternativos: botão da listagem, compra rápida, celular, app.
- Depois de corrigir, rode as checagens de novo e acompanhe a razão entre as etapas por uma semana.
Veja também Dado bruto do GA4 e (not set) no GA4.
Perguntas frequentes
Como saber se uma tag do GA4 parou de funcionar?
Olhe a série diária do evento e a razão dele com a etapa anterior do funil (add_to_cart dividido por view_item, por exemplo). Uma queda em degrau, de um dia para o outro, com a etapa anterior estável, quase sempre é tag.
O GA4 avisa quando um evento para?
Não por padrão. Dá para criar insights personalizados com alerta, mas eles precisam ser configurados evento a evento. O mais seguro é uma checagem diária no BigQuery comparando cada etapa com a média recente.
Corrigir no GTM resolve?
Só se o problema estiver no GTM. Se o site parou de empurrar o evento para o dataLayer, nenhuma tag dispara. Confira primeiro se o push existe, no navegador, fazendo a ação de verdade.
Uma taxa de conversão que caiu de repente é tag quebrada?
Nem sempre. Se o tráfego subiu muito (uma campanha nova, por exemplo) e os pedidos ficaram iguais, a taxa cai porque o denominador cresceu. Olhe numerador e denominador separados.