# (not set) no GA4: o que é, por que aparece e como resolver no e-commerce

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

## Resumo

- (not set) é o GA4 dizendo: recebi o evento, mas não tenho esse valor. Não é um erro em si, é um sintoma, e a causa muda conforme a dimensão.
- No e-commerce, a causa que mais pesa é a compra enviada pelo servidor sem o identificador e a sessão do navegador: a venda entra, mas sem origem.
- Outras causas comuns: sessão sem page_view (página de destino), Google Ads sem vínculo ou sem gclid, dimensão de item com métrica de evento e dimensão personalizada que não existe naquele evento.
- Uma compra em (not set) é melhor que uma compra perdida: a receita bate, só falta a origem. O conserto é levar a identidade do navegador até o pedido.
- Um salto repentino de (not set) também pode ser fraude: numa loja, era um bot testando cartão em dezenas de pedidos, todos cancelados.

Toda loja que olha o GA4 com atenção uma hora esbarra no `(not set)`. Ele aparece na origem das compras, na página de destino, na campanha do Google Ads, no nome do produto. E quase sempre alguém pergunta se o GA4 está quebrado.

Não necessariamente. `(not set)` é o GA4 dizendo: **recebi o evento, mas não tenho esse valor.** É um sintoma. A causa depende de qual dimensão está em `(not set)`.

## Por que ele aparece

O GA4 guarda cada informação num escopo: do evento, da sessão, do usuário ou do item. Quando você cruza uma dimensão com um evento que não tem aquele valor, ou que não está ligado àquela sessão, o relatório mostra `(not set)`.

## As causas mais comuns no e-commerce

| Onde aparece | Causa provável | Como resolver |
|---|---|---|
| Origem / mídia das compras | Compra enviada pelo servidor sem o `client_id` e o `session_id` do navegador | Guardar o cookie `_ga` e a sessão no checkout e mandar junto com a compra |
| Página de destino | Sessão sem `page_view`: a pessoa voltou depois de 30 minutos parada e o primeiro evento foi um clique, ou o evento veio do servidor | Pouco é normal. Muito é evento de servidor sem sessão |
| Campanha do Google Ads | Contas não vinculadas, marcação automática desligada ou `gclid` perdido num redirecionamento | Vincular GA4 e Google Ads, ligar a marcação automática, testar se o `gclid` chega na página |
| Nome ou categoria do item | Dimensão de item cruzada com métrica do evento (ex.: categoria x receita da compra), ou item enviado sem o campo | Usar a receita do item com dimensão de item; conferir o array `items` |
| Dimensão personalizada | O parâmetro não vem naquele evento, ou a dimensão foi criada depois (não é retroativa) | Mandar o parâmetro em todos os eventos que vão ser cruzados |

Três coisas que parecem `(not set)`, mas não são:

- **`(direct) / (none)`** é sessão sem origem identificável, como quem digitou o endereço. O valor existe: é "direto".
- **`(other)`** é o GA4 agrupando valores quando o relatório tem linhas demais.
- **Gateway de pagamento como origem** (a venda atribuída ao site do banco ou do intermediador) é outro problema: falta incluir o domínio na lista de referências indesejadas.

## O caso que mais pesa: a compra enviada pelo servidor

Mandar a compra pelo servidor resolve um problema grande: ela deixa de depender da página de obrigado carregar no navegador. Numa loja VTEX que atendemos, a tag do navegador registra entre 84% e 88% dos pedidos; o resto nunca chega ([os números](https://mymetric.com.br/blog/ga4-x-mymetric/)).

Mas o servidor não tem o cookie de quem comprou. Se o envio sair do webhook do pedido sem o identificador do navegador, o GA4 recebe a compra, conta a receita e não sabe de qual sessão ela veio. Resultado: origem `(not set)`.

Isso ainda é melhor que perder a venda. Com a compra em `(not set)`, a receita do GA4 bate com a da loja e só falta a origem. Sem o envio pelo servidor, faltam as duas coisas.

O conserto é levar a identidade do navegador até o pedido. No Spark, o identificador do navegador fica guardado junto do checkout e é recuperado na hora em que o webhook do pedido chega. Assim a compra sai pelo servidor já ligada à sessão de quem comprou. O `(not set)` que sobra é de pedido feito sem cookie nenhum: navegador que bloqueia tudo, pedido criado pelo atendimento, pedido de robô.

## Quando o (not set) sobe de repente

Numa loja que atendemos, a fatia de compras em `(not set)` saltou num único mês. Não era tracking: eram 57 pedidos feitos por um robô testando cartão, todos com o mesmo produto, o mesmo CEP e todos cancelados. Robô não tem cookie, então todos entraram sem origem.

Duas lições:

- **Salto de `(not set)` também é termômetro de fraude.** Antes de mexer na tag, olhe os pedidos daquele dia.
- **Mande só pedido pago.** Se a compra só vai para o GA4 quando o pagamento é aprovado, cancelado e teste de cartão nem entram.

## Como medir no BigQuery

Com o [export do GA4 para o BigQuery](https://mymetric.com.br/blog/export-ga4-bigquery/) ligado, esta consulta mostra quantas compras chegaram sem sessão e quantas chegaram com sessão, mas sem nenhuma página vista nela:

```sql
WITH ev AS (
  SELECT
    event_name,
    user_pseudo_id,
    (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS sessao,
    ecommerce.transaction_id
  FROM `seu-projeto.analytics_123456789.events_*`
  WHERE _TABLE_SUFFIX BETWEEN '20260901' AND '20260930'
),
sessoes AS (
  SELECT DISTINCT user_pseudo_id, sessao FROM ev WHERE event_name = 'page_view'
)
SELECT
  COUNT(DISTINCT c.transaction_id) AS compras,
  COUNT(DISTINCT IF(c.sessao IS NULL, c.transaction_id, NULL)) AS sem_sessao,
  COUNT(DISTINCT IF(c.sessao IS NOT NULL AND s.sessao IS NULL, c.transaction_id, NULL)) AS sessao_sem_pagina
FROM ev c
LEFT JOIN sessoes s USING (user_pseudo_id, sessao)
WHERE c.event_name = 'purchase'
```

Troque o projeto, o número da propriedade e as datas. Compare `compras` com os pedidos pagos da loja no mesmo período: o que falta ali é venda que nem chegou, um problema diferente do `(not set)`.

## Quanto é aceitável

Não existe número oficial. Na prática, eu começo a investigar quando a receita em `(not set)` passa de uns 5% e, principalmente, quando ela muda de patamar de um dia para o outro. Patamar estável costuma ser estrutural, como pedido de atendimento e navegador sem cookie. Salto quase sempre tem uma causa com data: deploy, troca de checkout, robô.

Veja também [Dado bruto do GA4](https://mymetric.com.br/blog/dado-bruto-ga4-bigquery/) e [Tag quebrada no GA4](https://mymetric.com.br/blog/tag-quebrada-ga4/).

## Fontes

- [Google: Measurement Protocol do GA4](https://developers.google.com/analytics/devguides/collection/protocol/ga4) (consultado em 12/10/2026)
- [Google: esquema do export do GA4 para o BigQuery](https://support.google.com/analytics/answer/7029846) (consultado em 12/10/2026)

## Perguntas frequentes

### O que significa (not set) no GA4?

Que o GA4 recebeu o evento, mas não tem valor para a dimensão que você está olhando: a origem da sessão, a página de destino, a campanha, o item ou uma dimensão personalizada.

### Por que as compras aparecem com origem (not set)?

Na maioria das vezes, porque a compra foi enviada pelo servidor (Measurement Protocol, webhook) sem o client_id e o session_id do navegador de quem comprou. O GA4 conta a venda, mas não consegue ligá-la a uma sessão com origem.

### (not set) é a mesma coisa que (direct)?

Não. (direct) / (none) é uma sessão sem origem identificável, como quem digitou o endereço. (not set) é falta do valor no dado. E (other) é outra coisa: agrupamento de valores quando há linhas demais no relatório.

### Página de destino (not set) é problema?

Em pequena quantidade é normal: acontece quando a sessão começa sem page_view, por exemplo quando a pessoa volta depois de 30 minutos parada e o primeiro evento é um clique. Em grande quantidade, costuma ser evento enviado pelo servidor sem sessão.

### Como reduzir o (not set) da compra?

Guardando o identificador do navegador (cookie _ga) e o número da sessão no checkout e mandando os dois junto com a compra enviada pelo servidor. Mandar só pedido pago também tira cancelado e fraude do número.

