Como medir o CPL de anúncios por WhatsApp com a API de conversão
Para anúncio que leva ao WhatsApp, a métrica que a plataforma mostra é conversa iniciada. O que o cliente da agência quer saber é quanto custou cada venda. Entre uma e outra está o CRM: quem virou venda, de qual anúncio, de qual cliente. A ZapZap expõe uma chamada para avisar que um lead de anúncio comprou, e o evento volta à Meta para ela aprender quem realmente compra. Este guia mostra a conta, a chamada, os erros que ela devolve e os limites. Nada aqui promete resultado de campanha: a otimização depende da conta, do público e do criativo.
Publicado em · 4 min de leitura
A conta: CPL, custo por venda e o que ainda falta
CPL é o gasto dividido pelo número de leads. Custo por venda é o gasto dividido pelo número de vendas. Exemplo hipotético, só para a aritmética: R$2.000 de gasto, 160 leads e 8 vendas dão CPL de R$12,50 e custo por venda de R$250. Se o ticket médio for R$700, a receita é R$5.600, e a razão entre receita e gasto é 2,8. Os números são ilustrativos e não representam resultado de cliente.
O CPL sozinho engana: um anúncio com CPL baixo pode trazer curiosos que nunca compram. Por isso o ciclo só fecha quando a venda volta para o sistema de anúncios. Veja também o fluxo de leads de anúncio por cliente e a página de gestores de tráfego.
A chamada: POST /{instanceId}/tracking/conversion
A referência descreve a operação como registrar a venda de um lead de anúncio. Os campos são phone (obrigatório, com DDI e DDD, por exemplo 5511999998888), event, value e occurred_at. O event aceita Purchase (padrão), Schedule, Lead e QualifiedLead; Purchase marca o lead como ganho, Schedule como agendado e os demais como qualificado. O value aceita número ou texto como "700,50".
O occurred_at registra quando a venda aconteceu e alimenta o seu relatório. O envio à Meta usa o momento do registro, porque a Meta recusa eventos antigos. Por isso o caminho certo é chamar no instante em que o pagamento é confirmado no seu sistema, e não em lote no fim do mês.
curl and Node.js: mark a sale
# Mark a sale from an ad lead (event is optional, default Purchase)
curl -X POST "https://api.zapzapapi.com/api/v1/INSTANCE_ID/tracking/conversion" \
-H "Content-Type: application/json" \
-H "x-api-key: $ZAPZAP_API_KEY" -H "x-api-secret: $ZAPZAP_API_SECRET" \
-d '{"phone":"5511999998888","event":"Purchase","value":700.50,"occurred_at":"2026-11-10T14:30:00Z"}'
// Node: call it when your payment system confirms, and handle the documented errors
async function markSale(instanceId, phone, value) {
const res = await fetch("https://api.zapzapapi.com/api/v1/" + instanceId + "/tracking/conversion", {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": process.env.ZAPZAP_API_KEY,
"x-api-secret": process.env.ZAPZAP_API_SECRET,
},
body: JSON.stringify({ phone, event: "Purchase", value }),
});
const body = await res.json().catch(() => ({}));
if (res.ok) return body; // { ok: true, status: "queued", ... }
if (res.status === 404 && body.error === "LEAD_NOT_FOUND") return null; // not an ad lead: nothing to attribute
if (res.status === 409 && body.error === "TRACKING_DISABLED") throw new Error("turn on Meta tracking for this instance");
throw new Error(body.error + ": " + (body.message || res.status));
}Os erros que a chamada devolve (e o que fazer em cada um)
404 LEAD_NOT_FOUND: esse telefone não veio de um anúncio nesta instância, então não há o que atribuir. Não é falha: trate como venda orgânica e siga. A busca tolera a diferença do nono dígito, mas confira se o número da venda é o mesmo do chat.
409 TRACKING_DISABLED: o traqueamento não está ativo na instância. Ative a configuração de traqueamento no painel antes. 409 EVENT_NOT_ACCEPTED: faltam Pixel e token salvos, ou aquele tipo de evento está desligado. 400 INVALID_PHONE, INVALID_EVENT ou INVALID_VALUE: dado malformado, corrija na origem. O guia de instâncias por cliente ajuda a saber qual instância usar em cada venda.
Idempotência e recompra
A referência afirma que chamar duas vezes para a mesma venda não duplica o evento, o que protege de retentativas do seu CRM. Mesmo assim, guarde no seu lado o id da venda e só chame uma vez por pagamento confirmado.
Uma segunda compra do mesmo cliente é outro evento, e deve ser enviada quando acontecer. Não bloqueie recompra no seu sistema: ela é o sinal mais valioso para o algoritmo.
Montando o relatório mensal por cliente
Junte três fontes: gasto (do gerenciador de anúncios), leads (conversas iniciadas por anúncio) e vendas (as chamadas de conversão). A tabela por cliente mostra gasto, leads, CPL, vendas, custo por venda e receita. O portal do cliente mostra leads e vendas com a marca dele, e o relatório em texto é um complemento. Veja automatizar relatórios.
Combine com o cliente quem marca a venda e quando: se a venda fecha por fora do WhatsApp, alguém precisa avisar o sistema. Sem isso, o custo por venda sai maior do que a realidade e o anúncio parece pior do que é. Veja também a API de WhatsApp e a referência.
Resumo rápido
- CPL é gasto por lead; o que decide é o custo por venda, e para isso a venda precisa voltar ao sistema.
- POST /{instanceId}/tracking/conversion aceita Purchase, Schedule, Lead e QualifiedLead, com phone em formato internacional.
- 404 LEAD_NOT_FOUND significa venda sem origem em anúncio nesta instância, e 409 TRACKING_DISABLED pede ativar o traqueamento.
- Chame no instante da confirmação do pagamento, uma vez por venda, e envie a recompra como evento novo.
- Os exemplos numéricos são hipotéticos: a plataforma não promete resultado de campanha.
Continue lendo
Perguntas frequentes
Qualquer venda pode ser marcada na API?
Só a de um lead que chegou por anúncio nesta instância. Para outros telefones a chamada devolve 404 LEAD_NOT_FOUND, o que indica venda sem origem em anúncio.
Preciso configurar algo antes de chamar?
Sim. O traqueamento Meta precisa estar ativo na instância, com Pixel e token salvos, e o tipo de evento ligado. Sem isso a API devolve 409.
Posso enviar a data real da venda?
Pode, em occurred_at (ISO 8601 ou epoch em segundos). Ela alimenta o seu relatório, mas o envio à Meta usa o momento do registro.
Chamar duas vezes duplica a venda?
Segundo a referência, não: chamar duas vezes para a mesma venda não duplica. Mesmo assim, evite repetir.
Isso garante mais vendas?
Não. Devolver a venda dá ao sistema de anúncios um sinal melhor, mas o resultado depende de conta, público, oferta e atendimento.
Feche o ciclo entre anúncio e venda
Crie a conta, conecte o número do cliente e ative o traqueamento. R$15 por número ativo ao mês, sem cobrança por mensagem. Ao verificar o telefone há crédito de boas-vindas, sujeito à campanha vigente.
