No artigo de ontem eu expliquei por que o painel do Meta e o seu banco nunca batem, e terminei com uma recomendação: você precisa de uma fonte de dados que você controle.
Este artigo é sobre construir essa fonte.
Vou mostrar a cascata de prioridade com 8 canais que roda na minha loja, na ordem exata de avaliação, e explicar por que cada regra existe. A ordem não é detalhe de implementação — é o que separa um sistema que funciona de um que joga metade do tráfego no balde de "não sei de onde veio".
A resposta curta
utm_source sozinho não resolve porque nem todo tráfego chega com UTM, e porque plataformas diferentes preenchem os parâmetros de jeitos diferentes.
A solução é uma cascata: uma sequência de regras avaliadas em ordem, onde a primeira que bate define o canal. Os sinais mais confiáveis são consultados primeiro; os mais frágeis, depois; e existe um destino explícito para o que não bate em nada.
Os meus 8 canais são: Instagram, Facebook, Google, Threads, IG Shopping, Klaviyo, Orgânico e Sem atribuição.
Por que utm_source sozinho não basta
Três motivos, todos comuns.
Nem todo tráfego tem UTM. Quem digita o endereço da loja, quem clica em link salvo, quem vem de um compartilhamento no WhatsApp — nada disso carrega parâmetro. E é um volume relevante.
Plataformas preenchem diferente. O mesmo Instagram pode chegar como instagram, ig, IGShopping ou vazio, dependendo de onde o link foi colocado. Link na bio, link em story, link em anúncio e link do catálogo de compras se comportam de formas distintas.
Parâmetro se perde na navegação. A pessoa entra com UTM na página inicial, navega por quatro páginas e compra. Se você lê a URL só no momento da compra, o parâmetro já sumiu.
O resultado de confiar em um campo só é sempre o mesmo: uma fatia grande e inútil de tráfego classificada como desconhecida.
Os 8 canais
Antes da cascata, a lista do que estou tentando distinguir:
| Canal | O que representa |
|---|---|
| Perfil, stories, bio, anúncios do feed | |
| Página e anúncios | |
| Busca orgânica | |
| Threads | Tráfego da rede de texto |
| IG Shopping | Catálogo de compras do Instagram |
| Klaviyo | Campanhas de e-mail |
| Orgânico | Direto, ou navegação interna |
| Sem atribuição | Não foi possível determinar |
Duas escolhas dessa lista merecem explicação.
IG Shopping é canal próprio, não Instagram. Parece detalhe, mas muda a leitura. Quem chega pelo catálogo de compras já está com intenção de compra formada — o comportamento e a taxa de conversão são completamente diferentes de quem clicou num story. Misturar os dois esconde o desempenho real dos dois.
"Sem atribuição" é um canal, não um erro. Nomear explicitamente o que você não sabe é mais honesto do que empurrar para "Orgânico" e fingir que está tudo medido. O tamanho desse balde é a sua métrica de qualidade de rastreamento.
A cascata, na ordem exata
A regra é: avalia de cima para baixo, a primeira que bater define o canal, e para.
Nível 1 — utm_term com prefixo conhecido
Se utm_term começa com "instagram", "facebook" ou "threads"
→ usa esse valor como canal
Este é o sinal mais confiável do meu caso, e por um motivo específico: é o campo que eu controlo diretamente na estrutura das campanhas. Como o utm_term é preenchido por mim na montagem do anúncio, ele não sofre com a variação de preenchimento das plataformas.
Se você tem controle sobre algum parâmetro, ele deve ser o primeiro da cascata. Sinal que você controla vence sinal que a plataforma preenche.
Nível 2 — Pistas no referenciador
Se page_referrer contém domínio conhecido
→ mapeia para o canal correspondente
Aqui entram as pistas de domínio: o próprio domínio da loja (navegação interna), google, instagram, facebook.
Este nível vem antes do utm_source de propósito, e essa é a decisão mais contraintuitiva da cascata inteira.
O motivo: o referenciador é preenchido pelo navegador, não pela plataforma. Ele não mente sobre de onde a pessoa veio naquele clique. Já o utm_source pode estar sobrando de uma sessão anterior, ou preenchido de forma inconsistente. Quando os dois discordam sobre o clique atual, o navegador é a fonte mais confiável.
Nível 3 — Valores conhecidos de utm_source
Se utm_source é "igshopping" ou "ig" → IG Shopping
Se utm_source é "klaviyo" → Klaviyo
Se utm_source é "organic" → Orgânico
Só agora o utm_source entra, e apenas para valores que eu reconheço explicitamente. Não faço mapeamento genérico do tipo "use o que estiver lá" — isso enche o relatório de canais inventados por parâmetros mal montados.
Nível 4 — Padrão
Nenhuma regra bateu → Sem atribuição
Destino explícito. Sem chute, sem empurrar para orgânico.
Por que a ordem importa tanto
Um exemplo concreto do que muda ao inverter dois níveis.
Imagine um visitante que:
- Chegou por um anúncio do Instagram há três dias, com
utm_source=instagram - O parâmetro ficou guardado na sessão
- Hoje ele buscou sua loja no Google e entrou
Com o referenciador antes do utm_source: o sistema vê que o clique atual veio do Google e classifica como Google. Correto para último clique.
Com o utm_source antes do referenciador: o sistema vê o parâmetro antigo e classifica como Instagram. Você acredita que o anúncio trouxe uma venda que na verdade veio da busca.
O segundo caso infla o desempenho da mídia paga e esconde o valor do orgânico — que é exatamente o erro que faz gente escalar campanha que não está performando.
First click e last click em colunas separadas
Uma decisão que eu recomendo desde o primeiro dia: guarde os dois momentos.
| Grupo | Colunas |
|---|---|
| Primeiro clique | utm_source, utm_campaign, utm_medium, utm_content, utm_term, page_referrer |
| Último clique | last_utm_source, last_utm_campaign, last_utm_medium, last_utm_content, last_utm_term, last_page_location |
O primeiro clique é gravado uma vez, na primeira visita, e nunca mais muda. O último é sobrescrito a cada nova sessão.
Isso te dá a capacidade de responder duas perguntas diferentes:
"Quem apresentou minha loja para essa pessoa?" → primeiro clique. Serve para avaliar campanha de descoberta e topo de funil.
"O que fez ela comprar agora?" → último clique. Serve para avaliar remarketing e fechamento.
Se você guarda só um, está respondendo metade das perguntas e provavelmente creditando errado uma das pontas. Como comentei em Por que o Meta Ads mente sobre as suas conversões, boa parte da divergência entre plataformas é justamente diferença de modelo de atribuição — e ter as duas colunas te permite comparar modelos em vez de ficar refém de um.
Persistir o UTM na sessão
O parâmetro chega na URL da primeira página e some na segunda. Se você só lê no momento do cadastro ou da compra, perde quase tudo.
O fluxo que resolve:
- No carregamento de qualquer página, ler a query string
- Se houver UTM, gravar em
sessionStorage - Se não houver, recuperar o que já está guardado
- No envio do formulário ou do pedido, ler do
sessionStorage
sessionStorage em vez de localStorage é uma escolha deliberada: você quer o parâmetro válido para aquela sessão de navegação, não para sempre. UTM de dois meses atrás contaminando uma compra de hoje é pior que não ter dado nenhum.
O drill-down hierárquico
Com os cinco parâmetros guardados, dá para navegar do geral ao específico:
utm_source → utm_campaign → utm_medium → utm_content → utm_term
Cada nível mostra contagem de leads, de clientes e taxa de conversão. Você começa vendo que o Instagram traz 40% dos leads, desce para descobrir qual campanha, desce de novo para qual criativo.
É onde o sistema deixa de ser relatório e vira ferramenta de decisão. Saber que o Instagram converte 3% é informação. Saber que um criativo específico converte 8% enquanto outro converte 0,4% é ação.
O que fazer com "Sem atribuição"
Esse balde nunca vai zerar. Bloqueador de anúncio, cliente que digita o endereço, link compartilhado em aplicativo de mensagem — sempre haverá tráfego sem rastro.
O que importa é monitorar o tamanho dele.
Se está estável em torno de um patamar, é o seu piso natural. Se cresceu de repente, alguma coisa quebrou: link de campanha sem UTM, mudança no site que derrubou o script, ou parâmetro escrito errado.
Trate o crescimento súbito desse balde como alarme de rastreamento, não como característica do tráfego.
Perguntas frequentes
Qual a diferença entre first click e last click?
Primeiro clique é a origem da primeira visita daquela pessoa; último clique é a origem da visita em que ela converteu. O primeiro credita quem apresentou a loja, o segundo credita quem fechou. Guardar os dois em colunas separadas permite comparar os modelos em vez de escolher um e perder a outra leitura.
Por que o referenciador vem antes do utm_source na cascata?
Porque o referenciador é preenchido pelo navegador no clique atual, enquanto o utm_source pode estar sobrando de uma sessão anterior. Quando os dois discordam, o navegador descreve melhor o que acabou de acontecer. Inverter essa ordem infla o desempenho da mídia paga.
Devo usar sessionStorage ou localStorage para guardar UTM?
sessionStorage. Você quer que o parâmetro valha para a sessão de navegação atual e expire quando ela terminar. Com localStorage, um UTM de semanas atrás continua sendo atribuído a compras novas, o que distorce completamente o relatório.
IG Shopping deve ser separado de Instagram?
Sim. São comportamentos de compra diferentes: quem chega pelo catálogo já está com intenção formada, quem chega por story está descobrindo. Misturar os dois num canal só esconde o desempenho real de ambos e prejudica a decisão de investimento.
Quanto de "sem atribuição" é aceitável?
Não existe número universal, porque depende do seu mix de canais e do uso de bloqueadores pelo seu público. O que importa é a estabilidade: um patamar constante é o seu piso natural de rastreamento; um salto repentino indica que algo quebrou e precisa ser investigado.
Preciso de uma ferramenta paga para fazer isso?
Não. A cascata é lógica condicional lendo campos que você já pode capturar com JavaScript e gravar no seu banco. O que exige investimento é o tempo de definir as regras corretamente para o seu caso, não a ferramenta.
Resumindo
Atribuição não é ler um campo. É uma sequência de regras, avaliadas em ordem de confiabilidade, com destino explícito para o que não se encaixa.
A ordem que funciona na minha loja: parâmetro que eu controlo primeiro, referenciador do navegador depois, valores conhecidos de utm_source em terceiro, e "Sem atribuição" como destino declarado.
Some a isso duas colunas para primeiro e último clique, persistência em sessionStorage e você tem uma fonte de dados própria — a única que serve para decisão financeira.
Continue lendo em Dados e Analytics: