1. Webhook — receber o postback
Crie um nó Webhook (POST) e cadastre a URL na Hotmart em Ferramentas → Webhook, no evento Compra aprovada.2. Achar o lead
Nó HTTP Request, métodoGET:
Authorization: Bearer {{ $credentials.metricaas }}
Não normalize o telefone antes de mandar. A API compara por DDD + os 8 últimos
dígitos, então DDI, parênteses, traço e o nono dígito não atrapalham.
Adicione um IF depois: se data vier vazio, o comprador nunca falou no
WhatsApp e não há lead para vincular. Encerre o fluxo — forçar a criação de um
lead aqui só gera um contato organic sem conversa nem origem.
3. Registrar a venda
Nó HTTP Request, métodoPOST, body JSON:
Resposta
200 com "duplicate": true significa que a Hotmart reenviou o mesmo
postback. Não é erro e não deve virar retry — a venda já estava lá.Os detalhes que custam caro
Sempre mande external_id — mesmo em teste
Sempre mande external_id — mesmo em teste
É o que torna o reenvio inofensivo. A Hotmart reenvia postback quando o seu
endpoint demora ou devolve erro, e o N8N tem retry próprio. Sem
external_id, cada reenvio é uma venda nova e a receita infla sozinha.Vale para importação de histórico também: sem ele, rodar o fluxo duas vezes
dobra a base.Qual valor mandar: price.value ou o total pago?
Qual valor mandar: price.value ou o total pago?
price.value — o preço do produto. O total inclui juro de parcelamento, que
vai para a adquirente e não é sua receita. Num período real a diferença foi
de R 7.117: 5,7% de receita inexistente inflando o ROAS.Um checkout com order bump gera 3 postbacks
Um checkout com order bump gera 3 postbacks
Cada produto é uma transação com seu próprio
transaction. O N8N vai
disparar três vezes — deixe. O lead aceita várias vendas e o total soma
sozinho. Juntar tudo num POST só perderia a idempotência de duas delas.A data vem em epoch — e o fuso importa
A data vem em epoch — e o fuso importa
order_date é epoch em ms. O new Date(...).toISOString() acima resolve:
gera 2026-08-07T14:49:12.000Z, com fuso explícito.Se você montar a data à mão como 2026-08-07T11:49:12, a API responde 422.
É proposital: sem offset, a compra da madrugada cai no dia anterior e o
relatório da semana fica errado sem nenhum sinal de erro.Reembolso e chargeback
Reembolso e chargeback
A Hotmart manda
PURCHASE_REFUNDED / PURCHASE_CHARGEBACK num evento
separado. Um segundo fluxo pode buscar a venda por external_id em
GET /v1/sales e chamar DELETE /v1/sales/{id}.O lead não volta de etapa automaticamente — ele pode ter outras compras.
Se quiser marcá-lo, mova de etapa explicitamente.Credencial no N8N
Crie uma credencial do tipo Header Auth: nomeAuthorization, valor
Bearer mcp_.... Use um token de modo write.
O token carrega as permissões e os escopos de quem o emitiu. Se ele for de
alguém restrito a um canal, o
GET /v1/leads?phone= pode não achar um lead que
existe. Chame GET /v1/me uma vez e confira scopes antes de colocar o fluxo
em produção.