Montei um sistema de atribuição com 8 canais: a cascata completa

utm_source sozinho não identifica de onde vem seu cliente. Veja a cascata de prioridade com 8 canais que montei, e por que a ordem das regras muda tudo.

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
Instagram Perfil, stories, bio, anúncios do feed
Facebook Página e anúncios
Google 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

CÓDIGO
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

CÓDIGO
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

CÓDIGO
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

CÓDIGO
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:

  1. Chegou por um anúncio do Instagram há três dias, com utm_source=instagram
  2. O parâmetro ficou guardado na sessão
  3. 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:

  1. No carregamento de qualquer página, ler a query string
  2. Se houver UTM, gravar em sessionStorage
  3. Se não houver, recuperar o que já está guardado
  4. 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:

CÓDIGO
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: