Voltar pro blog json-p.org

Pilar3 · Rastreamento honesto de vendas Publicado13 de julho de 2026 AutorElton

Por que o UTM se perde no WhatsApp (e como recuperar)

Por que o UTM se perde no WhatsApp: ele morre na fronteira do app, que só lê telefone e texto. O mecanismo real e dois jeitos honestos de recuperar a origem do lead.

Você sobe uma campanha no Meta, o anúncio manda pro WhatsApp, o lead chega e manda "oi, quero saber do combo". Aí você olha a conversa e não faz ideia de qual criativo trouxe aquela pessoa. Foi o vídeo? Foi o carrossel de public frio? Foi a campanha de retargeting? Não dá pra saber. O nome no topo do chat é "Fulano" e mais nada.

No fim do mês vem a parte pior: o gerenciador de anúncios diz que você teve 80 "conversas iniciadas", a Hotmart diz que vendeu 22, e você fica olhando os dois números sem conseguir ligar um no outro. Você colou utm_source e utm_campaign em tudo, igual todo tutorial mandou, e mesmo assim a origem sumiu no meio do caminho.

A boa notícia é que isso não é bug seu nem da ferramenta. É o jeito como o WhatsApp funciona por dentro. E depois que você entende onde exatamente o parâmetro morre, dá pra recuperar a informação. Não com mágica, com um pouco de trabalho de plumbing.

A resposta curta: por que o UTM se perde no WhatsApp

O UTM não "se perde" no sentido de sumir por acaso. Ele é descartado numa fronteira bem específica: a passagem do navegador (ou do anúncio) pro app do WhatsApp. Quando o clique cruza pra dentro do app, só duas coisas sobrevivem: o número de telefone e o texto da mensagem pré-preenchida. Todo o resto da URL, incluindo os utm_*, fica pra trás.

A partir daí a recuperação depende de quem controla o link. São dois cenários diferentes que a maioria dos posts trata como se fossem um só:

O resto do post é o mecanismo de cada um, com código.

Onde o parâmetro morre: a fronteira do app

Um link de "clicar pra conversar" é assim:

https://wa.me/5541999999999?text=Ol%C3%A1%2C%20quero%20o%20combo&utm_source=ig&utm_campaign=julho

Quando alguém toca nesse link no celular, o navegador não "abre uma página do WhatsApp". Ele dispara um deep link pro sistema operacional, que entrega a intenção pro app instalado. O app do WhatsApp recebe essa intenção e lê os campos que ele conhece: o número (5541999999999) e o parâmetro text. Os utm_source e utm_campaign que você grudou no fim? O app não tem onde guardar isso. Ele ignora e segue a vida.

Repare no detalhe cruel: o navegador viu o UTM. Ele estava ali, na barra de endereço, por uma fração de segundo. Mas ninguém interceptou aquele momento pra registrar. Foi direto pro app, e no app o UTM não existe mais. É por isso que colar UTM num link wa.me dá aquela falsa sensação de estar rastreando: o parâmetro está lá na URL, parece certo, e não serve pra absolutamente nada depois que a conversa começa.

Cenário 1: você controla o link (redirect que carimba a origem)

Se o link é seu (bio do Instagram, botão do site, link na descrição do vídeo), a jogada é não mandar direto pro wa.me. Você manda pra um endereço seu, que faz três coisas em milissegundos e depois redireciona: lê o UTM, gera um identificador curto, guarda o UTM associado a esse id, e carimba o id dentro da mensagem pré-preenchida.

Um handler mínimo, em Node com Express, pra deixar concreto:

app.get('/ir', async (req, res) => {
  const { utm_source, utm_medium, utm_campaign } = req.query;

  // id curto e único, ex: "A7K2Qv"
  const id = nanoid(6);

  await db.set(`ref:${id}`, {
    utm_source, utm_medium, utm_campaign,
    ts: Date.now()
  });

  // o id vai DENTRO do texto, que é o que sobrevive
  const msg = `Quero o combo [ref:${id}]`;
  const url = `https://wa.me/5541999999999?text=${encodeURIComponent(msg)}`;

  res.redirect(302, url);
});

O usuário toca no seu link, cai em /ir?utm_source=ig&utm_campaign=julho, e é redirecionado pro WhatsApp já com a mensagem "Quero o combo [ref:A7K2Qv]" pronta pra enviar. Do outro lado, quando a mensagem chega no seu bot ou na sua Evolution API, você extrai o id e resgata o UTM que guardou:

const m = texto.match(/\[ref:([A-Za-z0-9]{6})\]/);
if (m) {
  const origem = await db.get(`ref:${m[1]}`);
  // origem = { utm_source: 'ig', utm_campaign: 'julho', ... }
}

Pronto. A origem que morreu na fronteira do app voltou, porque você a carregou por dentro do único campo que atravessa: o texto. É feio? Um pouco. Funciona? Sim, e é auditável, que é o que importa: você vê o id na mensagem e vê o registro no banco.

Cenário 2: Click to WhatsApp Ads (o ctwa_clid)

Agora o caso que trava mais gente. No Click to WhatsApp Ads (CTWA), o anúncio da Meta abre a conversa direto, sem passar por site nenhum. Não existe link wa.me seu, não existe redirect pra interceptar, não existe UTM. Tentar rastrear CTWA com UTM é procurar uma coisa que nunca esteve ali.

O que existe é outro identificador. A Meta gera um ctwa_clid pra cada clique no anúncio e entrega isso pelo webhook, dentro de um objeto referral anexado à primeira mensagem da conversa. No payload da Cloud API ele chega mais ou menos assim:

"referral": {
  "source_url": "https://fb.me/...",
  "source_type": "ad",
  "source_id": "120210000000000000",   // id do anúncio
  "headline": "Combo de julho",
  "body": "Chama no zap e garanta o seu",
  "ctwa_clid": "AffARl2...=="
}

Ou seja: você não precisa de UTM aqui, precisa capturar esse referral no primeiro evento que entra. O source_id já te diz qual anúncio trouxe a conversa. O ctwa_clid é a chave pra fechar o ciclo com a Meta: quando a venda acontece, você devolve o evento pra Meta pela Conversions API. Nesse evento vão o action_source: "business_messaging", o messaging_channel: "whatsapp" e o ctwa_clid dentro de user_data (mande só o subconjunto certo, senão a Meta rejeita o payload). Aí o algoritmo sabe que aquele clique específico virou compra, e a atribuição para de ser chute.

Confirmei o comportamento do ctwa_clid e do objeto referral na documentação e nos changelogs de plataforma antes de publicar (referências no fim). Vale reconfirmar de tempos em tempos, porque a Meta mexe nesses campos sem avisar com antecedência.

O que dá errado

Onde eu já vi (e já fiz) besteira nessa montagem:

Juntando os dois cenários, você começa a ter uma coisa que a maioria não tem: a origem real de cada conversa, do lado de dentro, batendo com o que a plataforma de anúncio diz por fora. É exatamente essa reconciliação (o clique do anúncio, a conversa no zap e a venda na Hotmart no mesmo registro) que o utm, o tracker que eu mantenho, faz por baixo do capô. Mas o mecanismo acima é genérico: dá pra montar com um redirect, um banco chave-valor e um handler de webhook, sem depender de mim.

Fechando

O UTM se perde no WhatsApp porque o app só lê telefone e texto, e tudo que você quer rastrear precisa entrar por um desses dois campos ou por um canal paralelo (o referral do CTWA). Depois que você enxerga a fronteira, o problema deixa de ser místico. Vira plumbing: carimba o id no texto quando o link é seu, captura o ctwa_clid quando o anúncio é da Meta, e nunca deixa o primeiro evento passar sem gravar. É trabalho chato, mas é o tipo de trabalho chato que faz o número do fim do mês finalmente fazer sentido.

Fontes primárias consultadas em 13/07/2026: documentação da WhatsApp Cloud API (objeto referral e Conversions API para mensagens) e changelog de plataforma sobre o parâmetro ctwa_clid em mensagens vindas de Click to WhatsApp Ads.