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ó:
- Você controla o link (link
wa.mena bio, no site, num botão): dá pra pôr um redirect no meio que lê o UTM e carimba um identificador dentro da mensagem, antes de jogar pro app. - Você não controla o link (Click to WhatsApp Ads, o anúncio da Meta que abre a conversa direto): aí não existe UTM nem página intermediária. A Meta te dá outro identificador, o
ctwa_clid, que chega pelo webhook.
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:
- Achar que UTM no
wa.meresolve. Não resolve. Ele morre na fronteira do app, como mostrei lá em cima. Se o seu "rastreamento" é só grudarutm_sourceno link do WhatsApp, você não está rastreando nada depois do clique. - Confiar cegamente no texto pré-preenchido. O usuário vê a mensagem
"Quero o combo [ref:A7K2Qv]"e pode apagar tudo antes de mandar, ou reescrever com as próprias palavras. Uma fatia sempre vai chegar sem o id. Trate isso como perda esperada, não como bug. Deixe o id discreto e no fim da frase pra reduzir a chance de apagarem. - Perder o
referralporque não capturou no primeiro evento. O objetoreferralvem colado na primeira mensagem da conversa. Se o seu fluxo só começa a gravar depois de qualificar o lead, ou se o webhook engasgou justo ali, aquela origem foi embora. Grave oreferralcru assim que ele chega, antes de qualquer lógica de negócio. - Capturar o
ctwa_clide nunca devolver a conversão. Octwa_clidsozinho, sem você mandar de volta o evento de compra pela Conversions API, não serve pra otimização nenhuma. A Meta precisa saber que aquele clique fechou venda, senão o número dela continua chutando e o seu ROAS continua não batendo. - Ignorar janela e reabertura de conversa. Um lead que volta a falar com você semanas depois, numa conversa nova, pode não trazer o mesmo contexto. Persista a associação lead / origem do seu lado, não conte que a plataforma vai lembrar por você pra sempre.
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.