UTM no checkout da Kiwify e da Hotmart: como saber qual anúncio vendeu
O anúncio leva a UTM até a sua página, mas o botão de compra joga ela fora. Veja por que a venda chega sem origem e como levar a UTM até o checkout.

Resumo rápido
- A UTM do anúncio chega até a sua página, mas o botão de compra aponta para um link fixo do checkout, sem os parâmetros. Por isso a venda aparece sem origem.
- A Kiwify e a Hotmart aceitam UTM no link do checkout. A Hotmart avisa que, em página própria, a origem só chega se o botão levar um link já com os parâmetros.
- Um script curto na página copia as UTMs da URL para os links do checkout na hora do clique, e guarda os dados se a pessoa trocar de página.
- No anúncio da Meta, use parâmetros dinâmicos com IDs. Na Hotmart, os códigos têm até 30 caracteres e não aceitam underline.
UTM no checkout da Kiwify e da Hotmart é a diferença entre saber e chutar qual anúncio vendeu. O problema mais comum é simples: o anúncio leva a UTM até a sua página, mas o botão de compra aponta para um link fixo do checkout, sem os parâmetros. A pessoa compra, e a venda aparece no relatório sem origem.
A própria Hotmart confirma isso na central de ajuda: quando a página de vendas é um site próprio, como um WordPress, chegar pela UTM não garante o repasse. A origem só é lida se o comprador clicar num link do checkout já carregado com os parâmetros. A saída é um script curto na página, que copia as UTMs da URL para os links do checkout na hora do clique.
A seguir, eu mostro onde a UTM se perde, o que a Kiwify e a Hotmart aceitam, como configurar o anúncio na Meta, o script que eu uso e como conferir se está funcionando.
Por que a venda chega sem origem#
UTM é um conjunto de parâmetros no fim do link (utm_source, utm_medium, utm_campaign, utm_term, utm_content) que diz de onde veio o clique. Quando o anúncio leva para a sua página, a UTM está lá, na barra de endereço. O problema é o passo seguinte.
O botão "Comprar" da página quase sempre tem um link fixo, copiado da plataforma: https://pay.kiwify.com.br/xxxx ou https://pay.hotmart.com/xxxx. Esse link não sabe de onde a pessoa veio. Ela clica, o checkout abre sem parâmetro nenhum, e a venda entra como se tivesse caído do céu.

O resultado aparece no relatório de vendas: uma coluna de origem vazia, e você sem saber se a venda veio do anúncio A, do B ou do orgânico. Quando a campanha tem vários públicos e criativos, isso vira decisão no escuro.
O que a Kiwify e a Hotmart aceitam no checkout#
As duas plataformas aceitam parâmetros na URL do checkout, só que com regras um pouco diferentes.
Kiwify
Segundo a central de ajuda da Kiwify, o checkout recebe src, sck, utm_source, utm_medium, utm_campaign, utm_term, utm_content e s1, s2 e s3. As informações ficam em cookie e são usadas quando a compra acontece.
Tem um detalhe que quase ninguém sabe: para o rastreamento funcionar na sua página de vendas, a URL dela precisa estar cadastrada na aba Links do produto. Vale fazer isso mesmo usando o script.
Para ver o resultado, a Kiwify tem o filtro Parâmetros da URL em Vendas → Filtros, e cada pedido mostra os parâmetros na aba Cliente.
Hotmart
A central de ajuda da Hotmart separa três tipos de parâmetro:
- UTM: o padrão do mercado, que também alimenta o Hotmart Analytics.
- sck: da Hotmart, para campanhas do produtor que levam direto para a página de pagamento.
- src: também da Hotmart, para links de afiliado e páginas de vendas alternativas.
Duas regras da Hotmart que derrubam muita UTM:
- Os códigos podem ter até 30 caracteres, e o underline (
_) não é permitido nos valores, porque é reservado pelo sistema. A barra vertical (|) pode, e ajuda a separar informações num código só. - O ponto de interrogação aparece uma vez só no link. Se o link do checkout já tem um parâmetro (como
?checkoutMode=10), os próximos entram com&. Mais de um?quebra o rastreamento e pode até impedir a abertura do checkout.
O resultado aparece em Vendas → Gestão de vendas → Dashboard de Origem de Vendas, com abas para UTM, SCK e SRC.
Como configurar as UTMs no anúncio da Meta#
No Gerenciador de Anúncios, os parâmetros ficam no nível do anúncio, na seção Rastreamento, no campo Parâmetros de URL. A Meta oferece parâmetros dinâmicos, que se preenchem sozinhos com os dados do anúncio: {{campaign.id}}, {{adset.id}}, {{ad.id}}, os mesmos com .name, {{placement}} e {{site_source_name}} (que vira fb, ig, msg, an ou th).
Para funcionar nas duas plataformas, eu uso IDs em vez de nomes:
utm_source={{site_source_name}}&utm_medium=paid&utm_campaign={{campaign.id}}&utm_term={{adset.id}}&utm_content={{ad.id}}
Por que IDs:
- Não quebram a regra da Hotmart. São números curtos, sem underline. Nomes de campanha costumam passar de 30 caracteres e ter
_. O mesmo vale para{{placement}}, que vira valores comofacebook_feed. - Não mudam. A Meta avisa que os parâmetros com nome usam o nome da primeira publicação. Se você renomear a campanha depois, a UTM continua com o nome antigo.
Para saber qual anúncio é qual, basta procurar o ID no Gerenciador. Se você vende só na Kiwify e prefere ler nomes no relatório, pode trocar os IDs por {{campaign.name}} e {{ad.name}}, sabendo que os espaços viram %20.
O script que leva a UTM até o checkout#
Este é o script que eu uso nas páginas que entrego. Ele faz três coisas: pega as UTMs (e também src e sck) da URL, guarda durante a visita para o caso de a pessoa trocar de página no site, e acrescenta tudo nos links do checkout da Kiwify e da Hotmart no momento do clique, sem apagar os parâmetros que o link já tem.
<script>
// Leva as UTMs da página até o checkout da Kiwify e da Hotmart
(function () {
var CHAVES = ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content", "src", "sck"];
var CHECKOUTS = ["pay.kiwify.com.br", "pay.hotmart.com"];
// 1. Pega as UTMs da URL e guarda para a visita toda (se a pessoa trocar de página)
var utms = {};
try { utms = JSON.parse(sessionStorage.getItem("utms") || "{}"); } catch (e) {}
var url = new URLSearchParams(location.search);
CHAVES.forEach(function (k) { if (url.get(k)) utms[k] = url.get(k); });
try { sessionStorage.setItem("utms", JSON.stringify(utms)); } catch (e) {}
// 2. Acrescenta as UTMs nos links do checkout, sem apagar o que o link já tem
function completa(link) {
var destino;
try { destino = new URL(link.href); } catch (e) { return; }
if (CHECKOUTS.indexOf(destino.hostname) === -1) return;
Object.keys(utms).forEach(function (k) {
if (!destino.searchParams.has(k)) destino.searchParams.set(k, utms[k]);
});
link.href = destino.toString();
}
// 3. Na hora do clique, inclusive em botões que aparecem depois (pop-up, carrossel)
document.addEventListener("click", function (e) {
var link = e.target.closest && e.target.closest("a[href]");
if (link) completa(link);
}, true);
})();
</script>
Alguns cuidados que fazem diferença:
- Onde colocar: no fim do HTML da página, antes de
</body>. No WordPress, serve um bloco de HTML ou um plugin de código no rodapé. Se você usa o Cloudflare Zaraz, ele também funciona como ferramenta de HTML personalizado. - Por que no clique: botões que aparecem depois do carregamento, como os de pop-up, recebem as UTMs do mesmo jeito. E o script só mexe nos links do checkout, nunca nos outros.
- Por que guardar na visita: a Meta lembra que o parâmetro vale para a primeira página. Se a pessoa navegar para outra página do site e só depois clicar em comprar, as UTMs continuam lá (na mesma aba).
- Se o link já tem
sckou outro parâmetro, o script não sobrescreve. E ele monta a URL pelo próprio navegador, então nunca sai um segundo?.
Como conferir se está funcionando#
Leva uns 5 minutos, antes de colocar dinheiro na campanha:
- Abra a sua página com UTMs de teste no fim do endereço:
?utm_source=teste&utm_campaign=teste. - Clique no botão de compra. Na barra de endereço do checkout, os parâmetros
utm_source=testeeutm_campaign=testeprecisam aparecer. - Volte, navegue para outra página do site (se tiver) e clique em comprar de novo. As UTMs continuam no checkout.
- Depois das primeiras vendas, confira no relatório: na Kiwify, em Vendas → Filtros → Parâmetros da URL; na Hotmart, no Dashboard de Origem de Vendas.
Se o passo 2 falhar, olhe primeiro se o script está mesmo na página (e fora do atraso de JavaScript) e se o botão é um link <a> para pay.kiwify.com.br ou pay.hotmart.com. Botão que abre o checkout por outro caminho, como um formulário, precisa de ajuste específico.
UTM e Pixel: um não substitui o outro#
O Pixel e a API de Conversões contam a história para a Meta: alimentam a otimização da campanha e o relatório do Gerenciador de Anúncios, com as janelas de atribuição da Meta. A UTM conta a história para a plataforma: cada venda no relatório da Kiwify ou da Hotmart leva a origem que chegou no checkout.
Os números nunca vão bater exatamente, e não precisam. A UTM é a sua conferência independente: se o Gerenciador diz que o anúncio A vende muito e a plataforma mostra pouca venda com o ID dele, vale olhar se o evento de compra está certo, como eu mostro no artigo sobre o Purchase ao gerar um Pix.
Conclusão: a origem tem que chegar no checkout#
UTM no anúncio não basta. Ela precisa sobreviver ao botão de compra, e isso não acontece sozinho em página própria. Com os parâmetros dinâmicos certos no anúncio, o script na página e a página cadastrada na Kiwify, cada venda passa a dizer de qual campanha, conjunto e anúncio veio.
Esse é um dos ajustes que eu faço no trackeamento das páginas que entrego: Pixel e API de Conversões conferidos, UTMs chegando no checkout e relatório batendo. Se as suas vendas chegam sem origem, me chame que eu olho a sua página e o seu checkout.
Perguntas frequentes#
Por que a Kiwify ou a Hotmart não mostram a UTM das minhas vendas?
Quase sempre porque a UTM fica na URL da sua página e o botão de compra aponta para um link fixo do checkout, sem os parâmetros. A plataforma só registra a origem que chega no checkout.
A Kiwify aceita UTM no checkout?
Aceita. Segundo a central de ajuda, o checkout recebe src, sck, utm_source, utm_medium, utm_campaign, utm_term, utm_content e s1 a s3, e guarda em cookie para a compra. A página de vendas também precisa estar cadastrada na aba Links do produto.
Qual é a diferença entre src, sck e UTM na Hotmart?
A UTM é o padrão do mercado. O sck é da Hotmart e serve para campanhas que levam direto para a página de pagamento. O src também é da Hotmart e é usado em links de afiliado e páginas de vendas alternativas.
Preciso de script se o anúncio leva direto para o checkout?
Não. Se o link do anúncio já é o do checkout, os parâmetros vão junto. O script é para quando o anúncio leva para uma página sua (WordPress, construtor ou código) com um botão para o checkout.
A UTM substitui o Pixel da Meta?
Não. O Pixel e a API de Conversões alimentam a otimização e o relatório da Meta. A UTM registra a origem de cada venda no relatório da própria plataforma. Os dois se completam.


