Alertas de pagos de Stripe: que te llamen cuando el dinero está en riesgo

Envía los webhooks de Stripe a tu teléfono con la urgencia que merece cada evento: un aviso silencioso por un cobro correcto y una llamada por una disputa con fecha límite.

Actualizado

Índice

Stripe te envía correos sobre todo y sobre nada. Un cobro correcto, una renovación de suscripción fallida y un contracargo llegan como el mismo tipo de mensaje a la misma bandeja, y cuando los lees ya has perdido la diferencia entre ellos.

La solución no es más notificaciones. Es dar a cada evento de Stripe la urgencia que de verdad merece: un push discreto cuando alguien paga, una alerta sensible al tiempo cuando falla una renovación, y una llamada telefónica cuando aparece una disputa con una fecha límite de respuesta.

Qué eventos de Stripe te necesitan de verdad

No todos los eventos merecen una notificación, y los que la merecen no son igual de urgentes.

Evento de StripePor qué importaUrgencia
payment_intent.succeededAlguien pagó. Está bien saberlo, nunca es urgente.Normal
invoice.payment_failedFalló una renovación. Tienes una ventana de reintentos antes de que caduque la suscripción.Sensible al tiempo
charge.dispute.createdUn contracargo. Stripe da un plazo de respuesta fijado por la red de tarjetas, y no cumplirlo pierde el caso por defecto.Llamada
payment_intent.payment_failedFalló un pago puntual. Útil en volumen, ruidoso de uno en uno.Normal, o ninguna

La disputa es la única que justifica una llamada. Lo demás puede esperar a que cojas el teléfono; una disputa que ves una semana tarde es dinero que nunca ibas a conservar.

Paso 1 — Un canal por nivel de urgencia

Crea tres canales en Echobell, porque la urgencia es un ajuste por canal:

  • Stripe · Ingresos — notificaciones normales, para pagos correctos
  • Stripe · Pago fallido — sensible al tiempo
  • Stripe · Disputa — llamada

Copia la URL de webhook de cada canal desde sus ajustes. Apuntarás Stripe a las tres.

Activa Solo POST en cada uno mientras estás ahí. Stripe siempre envía por POST, y así evitas que una vista previa de enlace o el autocompletado de la barra de direcciones dispare tu canal por accidente.

Paso 2 — Añade los endpoints en Stripe

En el panel de Stripe, ve a Developers → Webhooks → Add endpoint, pega la URL del canal y selecciona solo los eventos que ese canal debe gestionar.

Añade un endpoint por canal en lugar de uno para todo. Stripe permite elegir eventos por endpoint, así el enrutado ocurre en su lado y tus canales quedan simples.

Si prefieres un único endpoint, apúntalo a un canal y filtra con una condición:

type == "charge.dispute.created"

Las condiciones se escriben sin las llaves {{ }} que usan las plantillas.

Paso 3 — Convierte el payload en algo legible

Stripe envía un cuerpo JSON con esta forma:

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

Así que las plantillas del canal entran en data.object:

Título

Disputa: {{data.object.reason}}

Cuerpo

{{data.object.amount}} {{data.object.currency}} en disputa
Estado: {{data.object.status}}

Un detalle que pilla a todo el mundo: los importes de Stripe están en la unidad monetaria más pequeña. 4900 son 49,00 $, no 4.900 $. Las plantillas de Echobell sustituyen el valor tal cual, así que o divides antes de enviarlo, o escribes la moneda detrás y lo lees como céntimos. Si el número tiene que ser correcto de un vistazo, pon la división en lo que haya entre Stripe y Echobell: un Worker, una automatización, tu propio endpoint.

Para el canal de ingresos, la misma idea con menos palabras:

Título

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

Cuerpo

{{data.object.description}}

Paso 4 — Pruébalo sin esperar un pago real

La CLI de Stripe puede lanzar payloads reales a tu endpoint:

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

Hazlo antes de depender de ello. Es también la forma más rápida de ver qué renderiza tu plantilla cuando un campo que dabas por hecho llega como null.

Lo que este montaje no te da

Dos límites que conviene conocer antes de ponerlo delante de tus ingresos.

Echobell no verifica la firma de Stripe. Stripe firma cada webhook con una cabecera Stripe-Signature, y verificarla requiere el secreto del endpoint. El endpoint de webhook de Echobell no hace esa comprobación, así que la URL del canal es lo único que lo protege. Trátala como un secreto, deja Solo POST activado y no la pegues en un repositorio público ni en una captura.

Puedes añadir una comprobación débil con una condición:

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

Eso confirma que algo está enviando una petición con forma de Stripe. No confirma que fuera Stripe. Si una notificación falsificada causara un daño real —y no solo un momento de confusión— pon tu propio endpoint delante, verifica ahí la firma y que sea él quien llame a Echobell.

Esto es una vía de alerta, no un libro de cuentas. Stripe reintenta las entregas de webhook fallidas, pero las notificaciones no son un registro de lo ocurrido. Concilia contra Stripe, no contra tu historial de notificaciones.

Preguntas frecuentes

¿Stripe puede llamarme directamente?

No. Stripe envía correo y webhooks. Una llamada implica enrutar un webhook hacia algo que pueda realizarla.

¿Una alerta de disputa me despertará de verdad?

Si el canal está en modo llamada, sí: llega como una llamada entrante y suena a través de Concentración y No molestar. Consulta cómo atravesar el modo Concentración de iOS para alertas críticas.

¿Mi socio puede recibir las mismas alertas?

Sí. Comparte el canal y cada suscriptor elige su tipo de notificación. Tú puedes recibir las llamadas mientras otra persona recibe un push discreto por el mismo evento.

¿Y el modo de prueba?

Los eventos en modo prueba de Stripe van a endpoints registrados en modo prueba. Registra la URL del canal en ambos si quieres ver ese tráfico, o solo en prueba hasta que confíes en el montaje.

Cierre

Tres canales, tres endpoints, una plantilla cada uno. La cuestión no es que te enteres de lo que pasa en Stripe: ya te enterabas. Es que un contracargo deje de parecerse exactamente a un recibo.

Descarga Echobell para iPhone o consíguelo en Google Play, y luego ejecuta stripe trigger charge.dispute.created y deja que tu teléfono suene una vez a propósito.


Contenido relacionado