# Tag quebrada no GA4: como achar antes de perder meses de funil

Por Thiago Morello (Fundador da MyMetric) · guia mantido, atualizado em 12 de outubro de 2026 · https://mymetric.com.br/blog/tag-quebrada-ga4/

## 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_checkout` era 9 vezes maior que o `add_to_cart`. Ninguém inicia o checkout sem ter adicionado nada.
- **Lugar errado.** 100% dos `add_to_cart` restantes 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_cart` levava `currency` nem `value`.

## 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](https://mymetric.com.br/blog/ga4-x-mymetric/)). 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](https://mymetric.com.br/blog/export-ga4-bigquery/) ligado, esta consulta faz as checagens 1 e 2 para os últimos 120 dias:

```sql
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:

```sql
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_info` e `add_payment_info` zerados 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

1. **Anote a data exata em que quebrou.** Ela vai servir para excluir o período de análises e testes.
2. **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.
3. **Teste os caminhos alternativos:** botão da listagem, compra rápida, celular, app.
4. **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](https://mymetric.com.br/blog/dado-bruto-ga4-bigquery/) e [(not set) no GA4](https://mymetric.com.br/blog/not-set-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.

