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. 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. 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. 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. 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. 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' -hex

Ilustrativo. 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.

Gatilhowebhook_event_typeorder_status
boleto_geradobillet_createdwaiting_payment
pix_geradopix_createdwaiting_payment
compra_aprovadaorder_approvedpaid
compra_recusadaorder_rejectedrefused
carrinho_abandonadonão é enviadonão se aplica (outro formato de payload)
subscription_latesubscription_latestatus 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.