Infoprodutos e assinaturas
Kiwify no WhatsApp: recupere carrinho, Pix e boleto sem escrever código
A Kiwify envia um POST em JSON a cada evento do seu produto: boleto gerado, Pix gerado, carrinho abandonado, compra aprovada, recusada, reembolsada, chargeback e três eventos de assinatura. A ZapZap tem um assistente chamado Recuperar vendas, em Fluxos, que gera a URL do webhook e um fluxo pronto para a Kiwify. Você cola a URL na Kiwify, escolhe o evento e o fluxo dispara a mensagem para o telefone do comprador.
Atualizado em
Por que conectar
Na Kiwify, a venda se perde em três momentos: o cliente preenche o checkout e some, gera o Pix e não paga, ou a renovação da assinatura é recusada. Cada um tem um evento próprio, e cada evento pode virar uma mensagem em minutos, com o nome e o produto já preenchidos. O fluxo gerado pela ZapZap manda a primeira mensagem na hora e, nos casos de carrinho e de Pix ou boleto, um segundo lembrete depois de uma espera (30 minutos e 1 hora nos textos de partida, que você edita). Mande só para quem iniciou uma compra com você e inclua como parar de receber. A ZapZap conecta números por um canal não oficial e gerenciado, e o ritmo conta. São R$15 por número ativo/mês, pré-pago, com crédito de boas-vindas ao criar a conta, sujeito à campanha vigente.
Passo a passo
- 1
Abra o assistente em Fluxos
No painel da ZapZap, entre em Fluxos e clique em Recuperar vendas. Escolha Kiwify, o objetivo (carrinho abandonado, Pix ou boleto não pago, ou boas-vindas pós-compra) e o número que vai enviar. O assistente cria o webhook, gera um fluxo já ligado e habilitado e mostra a URL, no formato https://api.zapzapapi.com/api/webhooks/flow/{segredo}.
- 2
Cadastre a URL na Kiwify
Na Kiwify, abra Apps, depois Webhooks e Criar webhook. Cole a URL da ZapZap, escolha o produto (ou todos) e marque os eventos do objetivo: carrinho_abandonado, pix_gerado e boleto_gerado, ou compra_aprovada. Defina um token longo e aleatório: sem token, a assinatura é calculada com chave vazia e não prova nada. Use Testar Webhook para mandar um evento de mentira.
- 3
Ligue a validação da assinatura
No assistente da ZapZap, informe o token do webhook da Kiwify. A Kiwify não envia o token: ela envia na URL o parâmetro signature, um HMAC-SHA1 em hexadecimal calculado sobre o corpo exato da requisição, usando o token como chave. Com o token salvo, a ZapZap confere a assinatura de cada evento e responde 401 se não bater. Sem token salvo, só o segredo da URL protege o webhook.
- 4
Confira se o telefone foi encontrado
A ZapZap guarda a última amostra recebida e detecta sozinha onde estão telefone, nome, produto, e-mail e valor. Depois do primeiro teste, abra o webhook no editor e veja se o campo telefone apareceu. Se a resposta da ZapZap vier com triggered: 0, o fluxo não disparou: o evento não trazia telefone, o número está fora do formato de 10 a 13 dígitos ou o número já tinha recebido esse fluxo nos últimos 10 minutos.
- 5
Edite as mensagens e faça uma compra de teste
Os textos de partida usam {nome} e {produto}. Reescreva com a sua voz, tire o que soar como pressão e faça uma compra real de valor baixo, ou use Testar Webhook, apontando para um número seu. Olhe os logs da Kiwify em Ver logs: eles mostram o corpo enviado e a resposta da ZapZap, e permitem reenviar.
Exemplo
# Simula um evento da Kiwify na URL do webhook da ZapZap (campos de exemplo, use um número seu).
# Se você salvou o token no assistente, a ZapZap responde 401 sem o signature correto.
CORPO='{"order_id":"teste-001","order_status":"waiting_payment","webhook_event_type":"pix_created","Customer":{"full_name":"Maria Teste","mobile":"+5511999990001"}}'
curl -X POST 'https://api.zapzapapi.com/api/webhooks/flow/SEU_SEGREDO' \
-H 'Content-Type: application/json' \
-d "$CORPO"
# resposta: {"ok":true,"triggered":1}
# Para validar a assinatura no SEU servidor (caminho sem o assistente), o cálculo da Kiwify é:
# signature = HMAC-SHA1(chave = token do webhook, mensagem = corpo cru), em hexadecimal
printf '%s' "$CORPO" | openssl dgst -sha1 -hmac 'SEU_TOKEN_KIWIFY' -hexIlustrativo. Os campos e endpoints exatos estão na documentação.
Gatilho da Kiwify e valor que chega no payload
A Kiwify avisa que o gatilho que você marca e o valor de webhook_event_type no corpo nem sempre têm o mesmo nome. Quem monta filtro por texto precisa da tabela abaixo, que segue a documentação oficial.
| Gatilho | webhook_event_type | order_status |
|---|---|---|
| boleto_gerado | billet_created | waiting_payment |
| pix_gerado | pix_created | waiting_payment |
| compra_aprovada | order_approved | paid |
| compra_recusada | order_rejected | refused |
| carrinho_abandonado | não é enviado | não se aplica (outro formato de payload) |
| subscription_late | subscription_late | status do pedido mais recente da assinatura |
Assinatura recusada: o evento que salva receita recorrente
Quando a renovação de uma assinatura é recusada, a Kiwify envia compra_recusada e subscription_late para o mesmo pedido, e repete a cada nova tentativa de cobrança que falhar. Se o limite de tentativas acaba, a assinatura é cancelada e chega subscription_canceled. É a janela certa para um aviso de ajuda ('seu cartão não passou, quer trocar a forma de pagamento?'). Se a cobrança for recusada antes do fim do período pago, só compra_recusada chega, e o acesso continua válido: não anuncie corte de acesso que ainda não existe.
O assistente da ZapZap cobre carrinho, Pix ou boleto e pós-compra. Para assinatura recusada, o caminho é o webhook genérico do editor de fluxos, com o gatilho de webhook e um filtro no campo webhook_event_type, ou um endpoint seu.
Idempotência, reenvio e limites a conhecer
- Confirmação: resposta 2xx confirma a entrega. Outro status, redirecionamento ou falta de resposta em 40 segundos conta como falha, e a Kiwify reenvia algumas vezes, com intervalos de 1 a 10 minutos.
- Duplicidade: o mesmo evento pode chegar mais de uma vez. A própria Kiwify recomenda a combinação order_id mais webhook_event_type como chave. A ZapZap já ignora a repetição para o mesmo fluxo e telefone por 10 minutos.
- Replay: a assinatura da Kiwify não leva data nem id de entrega, então uma requisição capturada e reenviada continua válida. Quem precisa de certeza do estado de uma venda consulta GET /sales/{id} na API da Kiwify.
- Troca de token: não existe período com os dois tokens válidos. Aceite os dois no seu servidor durante um dia, ou espere os reenvios pendentes terminarem.
- Limite da ZapZap: 120 requisições por minuto por webhook. Um lançamento grande pode passar disso; acima do limite a resposta é 429 e a Kiwify tenta de novo.
Quando NÃO usar o assistente
Se você precisa montar uma mensagem com dados que o assistente não extrai (link de recuperação, regra por faixa de valor, consulta ao seu banco), o assistente fica curto e o melhor é um endpoint seu ou um fluxo no n8n. Se o produto é de afiliado, o produtor precisa liberar os dados do comprador para o telefone chegar no webhook. E em lista fria, que nunca iniciou uma compra, não use este caminho: é prospecção, e prospecção tem outro risco e outra base legal.
Fontes e data da conferência
Gatilhos, valores de webhook_event_type, assinatura HMAC-SHA1 na query, reenvio, idempotência e eventos de assinatura foram conferidos em 29/10/2026 na documentação oficial da Kiwify (docs.kiwify.com.br), nas páginas Criar webhook, Receber e validar webhooks e Eventos de assinatura, e na central de ajuda da Kiwify. O bloco Customer do payload é resumido na documentação; confirme os nomes de campo exatos em Testar Webhook e Ver logs. O comportamento da ZapZap vem do código do produto em produção.
Perguntas frequentes
A Kiwify manda o token junto com o webhook?
Não. O token não vai no cabeçalho, na query nem no corpo. Ele é a chave usada para assinar. O que a Kiwify envia é o parâmetro signature na URL, um HMAC-SHA1 em hexadecimal do corpo exato. Para validar, calcule o HMAC do corpo cru com o token e compare em tempo constante.
O evento de carrinho abandonado tem order_status?
Não. O payload de carrinho abandonado tem outro formato, com dados do carrinho e um status próprio, e não traz webhook_event_type nem order_status. Se você filtra por esses campos, trate esse evento à parte.
O fluxo não disparou e a resposta foi triggered: 0. O que olhar?
Três causas comuns: o payload não tem um telefone com 10 a 13 dígitos, o telefone saiu do campo errado, ou o mesmo número já recebeu esse fluxo nos últimos 10 minutos. Abra a amostra do webhook no editor e veja qual campo a ZapZap detectou como telefone.
Preciso saber programar?
Para carrinho, Pix, boleto e boas-vindas, não: o assistente monta o fluxo e a URL. Programar vira necessário se você quiser regras próprias, consultar seu banco ou tratar assinatura recusada com lógica sob medida.
A Kiwify tem ambiente de teste?
Não. A documentação diz que não há sandbox nem modo de teste para a API ou para os webhooks. O botão Testar Webhook envia dados fictícios com o mesmo formato, e é com ele que você valida o recebimento antes de uma venda real.
O reembolso cancela a assinatura sozinho?
Sim, segundo a Kiwify. Reembolso ou chargeback de uma cobrança de assinatura cancela a assinatura, e chegam dois webhooks: o da compra e subscription_canceled. No chargeback, customer_access não é zerado, então remova o acesso a partir do evento chargeback.
Posso mandar a mensagem de carrinho para quem não terminou a compra?
Pode quando a pessoa deixou o telefone no seu checkout, o que cria uma relação de compra iniciada. Seja breve, ofereça ajuda e permita parar de receber. A ZapZap não elimina o risco de bloqueio de um canal não oficial, e a LGPD pede base legal clara para o contato.
Comece agora
Crie sua conta, conecte um número em minutos e teste a API com aquecimento e anti-bloqueio. R$15 por número ativo/mês, pré-pago, sem fidelidade.
