Stripe Webhook + WhatsApp: 40% Menos Inadimplência
Voltar para o Blog
Artigo

Stripe Webhook + WhatsApp: 40% Menos Inadimplência

Mafra
19/05/2026
7 min de leitura

Um SaaS com 300 assinantes perde em média R$4.200 por mês em tentativas de cobrança que falham silenciosamente. O Stripe emite o evento invoice.payment_failed em milissegundos. O sistema manda um email. Ninguém abre. A assinatura cancela sozinha 7 dias depois.

Taxa de abertura de email transacional de cobrança: entre 15% e 22%. Taxa de abertura de mensagem no WhatsApp: 98%. A diferença não é marginal. É a diferença entre recuperar o cliente antes que ele vá para o concorrente e descobrir o churn na planilha no fim do mês.

Por Que a Maioria das Ferramentas de Cobrança Não Resolve o Problema?

Plataformas de billing automatizado enviam emails e SMS em sequência. É a solução padrão, com alcance limitado para ações urgentes de recuperação de pagamento. WhatsApp é diferente por um motivo técnico: a notificação aparece na tela do celular em tempo real, no mesmo app que o usuário abriu 23 vezes hoje. A janela de atenção que abre nos primeiros 30 minutos após a falha do pagamento é a janela com maior taxa de conversão para recuperação.

Dado-chave: Estratégias de cobrança via WhatsApp aumentam as taxas de recuperação de pagamentos em 30% a 40% em comparação com email isolado. Taxa de abertura de mensagem WhatsApp supera 90%, contra menos de 22% de emails comerciais de cobrança. Fonte: SocialHub Automação Cobrança 2026 e Asaas WhatsApp Cobrança.

O segundo problema é que notificação não é conversa. Enviar "Seu pagamento falhou, atualize o cartão" é diferente de ter um Assistente que responde quando o cliente diz "tô sem grana essa semana, posso pagar na quinta?". Um Assistente que conversa tem taxa de resolução maior porque consegue capturar contexto e oferecer alternativas em tempo real.

Por Que Notificação Unidirecional Deixa Dinheiro na Mesa?

A maioria das integrações Stripe + WhatsApp usa a lógica de disparo e esquece: Stripe emite evento, você manda mensagem, fim. O cliente responde e ninguém processa.

A abordagem diferente é usar um Assistente conversacional no loop de cobrança. O fluxo completo fica assim: pagamento falha, Assistente abre conversa no WhatsApp, cliente responde "cartão errado, vou trocar", Assistente confirma quando o cliente atualiza e segue com nova tentativa automática. Em vez de uma notificação unidirecional, você tem um loop de resolução que fecha dentro da janela de 24 horas.

Para devs que constroem SaaS, é o caso de uso onde o ROI de "colocar um agente no WhatsApp" aparece no dashboard do Stripe na semana seguinte, não em 6 meses.

Como Integrar Stripe Webhook e WhatsApp em 30 Minutos

Passo 1: Configurar o Webhook no Stripe (5 minutos)

No dashboard do Stripe, vá em Developers > Webhooks > Add endpoint. Aponte para o endpoint que vamos criar e selecione os eventos:

  • invoice.payment_failed: cobrança recorrente de assinatura que falhou
  • payment_intent.payment_failed: pagamento avulso que falhou
  • customer.subscription.past_due: assinatura em atraso após múltiplas tentativas

O Stripe fornece um Webhook Signing Secret para validar a autenticidade dos eventos. Guarde-o como variável de ambiente.

Passo 2: Endpoint que Recebe o Evento Stripe (15 minutos)

O endpoint precisa: validar a assinatura do Stripe, extrair os dados do cliente e disparar a conversa no WhatsApp via API da Verboo.

const express = require('express');
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
const axios = require('axios');

const app = express();

// Raw body obrigatório para validação de assinatura do Stripe
app.post('/webhook/stripe', express.raw({ type: 'application/json' }), async (req, res) => {
  const sig = req.headers['stripe-signature'];
  let event;

  try {
    event = stripe.webhooks.constructEvent(
      req.body,
      sig,
      process.env.STRIPE_WEBHOOK_SECRET
    );
  } catch (err) {
    console.error('Assinatura inválida:', err.message);
    return res.status(400).send(`Webhook Error: ${err.message}`);
  }

  const eventosCobranca = [
    'invoice.payment_failed',
    'payment_intent.payment_failed',
    'customer.subscription.past_due'
  ];

  if (eventosCobranca.includes(event.type)) {
    await dispararCobrancaWhatsApp(event);
  }

  res.json({ received: true });
});

async function dispararCobrancaWhatsApp(event) {
  const obj = event.data.object;

  const customer = await stripe.customers.retrieve(obj.customer);
  const phone = customer.phone; // formato E.164: +5511999999999

  if (!phone) {
    console.warn('Cliente sem telefone cadastrado:', obj.customer);
    return;
  }

  const valorEmReais = (obj.amount_due || obj.amount) / 100;
  const planName = obj.lines?.data[0]?.description || 'sua assinatura';

  await axios.post('https://api.verboo.ai/v1/trigger', {
    agentId: process.env.VERBOO_AGENT_ID,
    phone: phone,
    data: {
      nomeCliente: customer.name,
      valorCobranca: valorEmReais.toFixed(2),
      plano: planName,
      tipoEvento: event.type,
      customerId: obj.customer,
      invoiceId: obj.id || null
    }
  }, {
    headers: {
      'Authorization': `Bearer ${process.env.VERBOO_API_KEY}`,
      'Content-Type': 'application/json'
    }
  });
}

app.listen(3000);

Dois pontos que a maioria dos tutoriais omite: o express.raw() é obrigatório para validação da assinatura do Stripe (o body precisa chegar não parseado). E o customer.phone precisa estar no formato E.164 (+5511999999999) para funcionar com a API do WhatsApp.

Passo 3: Instrução do Assistente de Cobrança na Verboo (10 minutos)

No painel da Verboo, crie um Assistente novo. A Instrução define o comportamento do agente no loop de cobrança. Os dados chegam via API no campo data e ficam disponíveis como variáveis de contexto:

Você é o assistente de cobrança da [Empresa].
Um pagamento falhou para {{nomeCliente}} no plano {{plano}},
no valor de R${{valorCobranca}}.

Objetivo: recuperar o pagamento de forma consultiva, sem pressão excessiva.

FLUXO:
1. Abra com uma mensagem direta mas simpática sobre a falha de pagamento
2. Pergunte se o cliente quer atualizar o cartão ou prefere outro método
3. Se confirmar que vai regularizar: agradeça e informe que
   a cobrança será refeita automaticamente
4. Se pedir prazo: registre o compromisso com a data informada
   e encerre a conversa educadamente
5. Se não responder em 24h: encerre sem insistir

TOM: profissional, direto, sem ameaças ou linguagem agressiva.
LIMITE: máximo 4 mensagens no fluxo.
NUNCA peça dados de cartão de crédito pelo WhatsApp.

Ao confirmar regularização, finalize com:
"Perfeito! Sua assinatura continua ativa. Qualquer dúvida, estamos aqui."

Passo 4: Testar em Staging com o Stripe CLI

O Stripe tem modo de teste nativo. Para simular uma falha de pagamento sem cobrar ninguém:

# Simular falha de pagamento
stripe trigger invoice.payment_failed

# Encaminhar eventos para o servidor local com assinatura correta
stripe listen --forward-to localhost:3000/webhook/stripe

Confirme que o Assistente dispara no WhatsApp em staging antes de apontar o webhook para produção.

Qual é o Resultado Real Dessa Integração?

Métrica Email de cobrança WhatsApp com Assistente
Taxa de abertura 15% a 22% 98%
Tempo até leitura Horas a dias Minutos
Taxa de resposta 2% a 5% 40% a 60%
Recuperação de pagamentos Baseline +30% a +40%
Setup técnico Nativo no Stripe 30 minutos (esse tutorial)

Para um SaaS com 300 assinantes e 5% de churn involuntário, são 15 clientes por mês que saem sem querer sair. Se o ticket médio é R$200, são R$3.000 por mês que a régua de email recupera mal. Com 40% de melhora na recuperação via WhatsApp, são R$1.200 por mês a mais retidos com 30 minutos de setup.

Referência: A documentação oficial do Stripe detalha os eventos de assinatura e os fluxos de retry automático. A integração com WhatsApp funciona em paralelo com o retry nativo do Stripe: o Assistente recupera casos onde o cliente precisa agir (trocar cartão, confirmar dados) antes da próxima tentativa automática.

O Que Mais Essa Arquitetura Resolve?

A mesma integração Stripe + Verboo cobre outros eventos além de falha de pagamento:

  • Assinatura ativada (customer.subscription.created): mensagem de boas-vindas com links de onboarding
  • Trial expirando (customer.subscription.trial_will_end): lembrete 3 dias antes do fim do trial
  • Upgrade de plano (customer.subscription.updated): confirmação e upsell de recursos do novo plano
  • Cancelamento (customer.subscription.deleted): abertura de conversa de winback

Cada evento Stripe vira um Gatilho de conversa diferente na Verboo, com Instrução específica para aquele momento do ciclo de vida do cliente. O código do webhook é o mesmo. Só os parâmetros e a Instrução mudam.

Com mais de 390 empresas e 27 milhões de mensagens processadas, o padrão na plataforma é consistente: times que adicionam WhatsApp ao ciclo de billing reduzem churn involuntário em menos de um mês de operação. O Assistente resolve o problema que email nunca resolveu: chegar na hora certa, no canal certo, e conseguir uma resposta.

Cole o código no seu backend, aponte o webhook no Stripe e o Assistente de cobrança já roda no WhatsApp. Crie sua conta grátis (login Google em 10s, sem cartão).

Gostou deste artigo?
Compartilhe conhecimento com sua rede.
Leia também

Artigos relacionados