Alertas de pagamento do Stripe: ser ligado quando o dinheiro está em risco

Encaminhe os webhooks do Stripe para o telefone com a urgência que cada evento merece — um aviso discreto para uma cobrança bem-sucedida e uma ligação para uma contestação com prazo.

Atualizado

Sumário

O Stripe manda e-mail sobre tudo e sobre nada. Uma cobrança bem-sucedida, uma renovação de assinatura que falhou e um chargeback chegam como o mesmo tipo de mensagem na mesma caixa de entrada, e quando você lê já perdeu a diferença entre elas.

A solução não é mais notificação. É dar a cada evento do Stripe a urgência que ele realmente merece: um push discreto quando alguém paga, um alerta sensível ao tempo quando uma renovação falha, e uma ligação quando aparece uma contestação com prazo de resposta.

Quais eventos do Stripe realmente precisam de você

Nem todo evento merece uma notificação, e os que merecem não são igualmente urgentes.

Evento do StripePor que importaUrgência
payment_intent.succeededAlguém pagou. Bom saber, nunca urgente.Normal
invoice.payment_failedUma renovação falhou. Existe uma janela de novas tentativas antes de a assinatura cair.Sensível ao tempo
charge.dispute.createdUm chargeback. O Stripe informa um prazo de resposta definido pela bandeira, e perder o prazo perde o caso automaticamente.Chamada
payment_intent.payment_failedUm pagamento avulso falhou. Útil em volume, barulhento um a um.Normal, ou nenhuma

A contestação é a única que justifica uma ligação. O resto pode esperar você pegar o telefone; uma contestação notada uma semana depois é dinheiro que você não ia manter mesmo.

Passo 1 — Um canal por nível de urgência

Crie três canais no Echobell, porque urgência é um ajuste por canal:

  • Stripe · Receita — notificações normais, para pagamentos bem-sucedidos
  • Stripe · Pagamento falhou — sensível ao tempo
  • Stripe · Contestação — chamada

Copie a URL de webhook de cada canal nas configurações dele. Você vai apontar o Stripe para as três.

Já aproveite e ative Somente POST em cada uma. O Stripe sempre envia via POST, e isso evita que uma prévia de link ou o autocompletar da barra de endereços dispare seu canal sem querer.

Passo 2 — Adicione os endpoints no Stripe

No painel do Stripe, vá em Developers → Webhooks → Add endpoint, cole a URL do canal e selecione apenas os eventos que aquele canal deve tratar.

Adicione um endpoint por canal em vez de um endpoint para tudo. O Stripe deixa escolher eventos por endpoint, então o roteamento acontece do lado dele e seus canais ficam simples.

Se preferir um único endpoint, aponte-o para um canal e filtre com uma condição:

type == "charge.dispute.created"

Condições são escritas sem as chaves {{ }} que os templates usam.

Passo 3 — Transforme o payload em algo legível

O Stripe envia um corpo JSON com este formato:

{
  "type": "charge.dispute.created",
  "data": {
    "object": {
      "amount": 4900,
      "currency": "usd",
      "reason": "fraudulent",
      "status": "warning_needs_response"
    }
  }
}

Então os templates do canal entram em data.object:

Título

Contestação: {{data.object.reason}}

Corpo

{{data.object.amount}} {{data.object.currency}} contestados
Status: {{data.object.status}}

Uma pegadinha que pega todo mundo: os valores do Stripe estão na menor unidade da moeda. 4900 é US$ 49,00, não US$ 4.900. Os templates do Echobell substituem o valor como está, então ou você divide antes de enviar, ou escreve a moeda depois e lê como centavos. Se o número precisa estar certo de primeira, coloque a divisão no que estiver entre o Stripe e o Echobell — um Worker, uma automação, seu próprio endpoint.

Para o canal de receita, a mesma ideia com menos palavras:

Título

+{{data.object.amount}} {{data.object.currency}}

Corpo

{{data.object.description}}

Passo 4 — Teste sem esperar um pagamento real

A CLI do Stripe consegue disparar payloads reais no seu endpoint:

stripe trigger payment_intent.succeeded
stripe trigger charge.dispute.created

Faça isso antes de depender disso. É também o jeito mais rápido de ver o que o seu template renderiza quando um campo que você achava garantido chega como null.

O que essa montagem não entrega

Dois limites que vale conhecer antes de colocá-la na frente da sua receita.

O Echobell não verifica a assinatura do Stripe. O Stripe assina todo webhook com um cabeçalho Stripe-Signature, e verificar isso exige o segredo do endpoint. O endpoint de webhook do Echobell não faz essa checagem, então a URL do canal é a única coisa que o protege. Trate-a como segredo, mantenha Somente POST ligado e não cole em repositório público nem em captura de tela.

Dá para adicionar uma checagem fraca com uma condição:

header["stripe-signature"] != ""

Isso confirma que algo está enviando uma requisição no formato do Stripe. Não confirma que foi o Stripe. Se uma notificação forjada causasse dano real — e não só um momento de confusão — coloque seu próprio endpoint na frente, verifique a assinatura ali e faça ele chamar o Echobell.

Isso é um caminho de alerta, não um livro-caixa. O Stripe repete entregas de webhook que falharam, mas notificações não são registro do que aconteceu. Concilie contra o Stripe, não contra seu histórico de notificações.

Perguntas frequentes

O Stripe consegue me ligar direto?

Não. O Stripe manda e-mail e webhooks. Uma ligação significa encaminhar um webhook para algo capaz de fazê-la.

Um alerta de contestação vai mesmo me acordar?

Se o canal estiver em modo chamada, sim — ele chega como ligação recebida e toca atravessando o Foco e o Não perturbe. Veja como atravessar o modo Foco do iOS para alertas críticos.

Meu sócio pode receber os mesmos alertas?

Pode. Compartilhe o canal e cada assinante escolhe o próprio tipo de notificação. Você fica com as ligações enquanto outra pessoa recebe um push discreto pelo mesmo evento.

E o modo de teste?

Eventos em modo de teste do Stripe vão para endpoints registrados em modo de teste. Registre a URL do canal nos dois se quiser ver esse tráfego, ou só em teste até confiar na montagem.

Fechando

Três canais, três endpoints, um template em cada. A questão não é você ser notificado pelo Stripe — você já era. É um chargeback parar de parecer exatamente um recibo.

Baixe o Echobell para iPhone ou pegue no Google Play, depois rode stripe trigger charge.dispute.created e deixe seu telefone tocar uma vez de propósito.


Conteúdo relacionado