- Para leerla y entender el evento: nada
- Solo para la parte opcional de verlo en vivo: cuenta de Stripe en modo test y la Stripe CLI instalada
Introducción
Cada vez que pasa algo relevante en tu cuenta —se cobra una factura, se rechaza una tarjeta, se da de baja un cliente— Stripe genera un evento: un registro de qué ha pasado, con todos los datos asociados. Y puede enviártelo automáticamente a una dirección web tuya en cuanto ocurre.
Cada tipo de evento tiene un nombre. El de «no se ha podido cobrar» en suscripciones es invoice.payment_failed, y viene acompañado de la factura afectada: qué cliente, cuánto y, a menudo, un enlace para que pague.
En una frase: falla el cobro → Stripe te lo envía → tu sistema reacciona.
Esta guía solo necesita que sepas que existen los avisos automáticos por HTTP. Si eso ya te suena raro, empieza por Introducción a webhooks y vuelve.
Problema que resuelve
Sin webhooks, acabas abriendo el Dashboard de Stripe “por si acaso”. Con un evento, puedes avisar a tu equipo, abrir un ticket o disparar un flujo en el momento del fallo.
Sirve cuando cobras suscripciones o facturas recurrentes y un fallo de tarjeta no puede esperar al final del día.
El evento que importa aquí
- Stripe intenta cobrar
- Falla el pago
- Emite invoice.payment_failed
- Tu URL recibe el JSON
| Pieza | Valor típico | Para qué |
|---|---|---|
type | invoice.payment_failed | Saber de qué evento se trata y quedarte solo con este |
data.object | La factura | Cliente, importe, estado |
id del evento | evt_… | Identificador único: te sirve para no procesar dos veces el mismo aviso |
livemode | false en pruebas | Distinguir si el cobro fue real o de mentira |
Campos útiles dentro de la factura:
| Campo | Uso |
|---|---|
customer | ID cus_… |
customer_email | Contacto (si viene) |
amount_due + currency | Importe en céntimos → p. ej. 1900 + eur = 19,00 EUR |
hosted_invoice_url | Enlace para que el cliente pague |
attempt_count | Cuántos intentos lleva |
Documentación Stripe: tipos de eventos (se abre en una pestaña nueva) · objeto Invoice (se abre en una pestaña nueva).
Anatomía mínima del JSON
Ejemplo recortado (no es un dump completo):
{
"id": "evt_postnaut_demo_payment_failed",
"type": "invoice.payment_failed",
"livemode": false,
"data": {
"object": {
"id": "in_postnaut_demo",
"customer": "cus_postnaut_demo",
"customer_email": "demo@postnaut.test",
"amount_due": 1900,
"currency": "eur",
"hosted_invoice_url": "https://invoice.stripe.com/i/acct_demo/test_postnaut"
}
}
}Ese shape es el que mapearás hacia tu destino (email, chat, CRM, cola…).
Ver un evento real (sin destino todavía)
Con el JSON de arriba ya entiendes qué campos mapear. Si además quieres verlo vivo en tu cuenta (opcional):
-
Entra en Stripe y activa Test mode (el interruptor está arriba en el Dashboard).
-
Instala la Stripe CLI (se abre en una pestaña nueva). Es un programa que se maneja escribiendo comandos en la terminal, y sirve para provocar eventos de prueba sin tener que simular un cobro real. Ejecuta
stripe loginuna vez para conectarlo con tu cuenta. -
En una terminal:
stripe trigger invoice.payment_failed -
Dashboard → Developers → Events: abre el
invoice.payment_failedy compara con el ejemplo (type,amount_due, etc.).
Eso demuestra que Stripe emite el evento. Aún no demuestra que tu aviso al equipo funcione: eso es el destino (otro sistema).
Si no quieres instalar la CLI ahora, no pasa nada: el shape del JSON de esta guía es el mismo que verás luego en Events.
Seguridad
Cuando montes el receptor de verdad:
- HTTPS obligatorio en producción.
- El secreto de firma es distinto en test y en live. No lo subas al repositorio.
- Stripe reintenta si no le contestas, así que el mismo cobro fallido puede llegarte varias veces. Guarda el
evt_…de los que ya has procesado y descarta los repetidos; si no, mandarás cuatro avisos por el mismo impago. - Contesta pronto con un 200 y haz después el trabajo lento.
Emisor vs destino
Dos capas distintas:
| Capa | Qué demuestra | Dónde |
|---|---|---|
| Emisor Stripe | Stripe entrega un evento | Lo de arriba (stripe trigger + Events) |
| Destino | Alguien o algo reacciona | Tu email, chat, ticket, cola… |
No intentes firma + CLI + destino el mismo día si es tu primer webhook. Primero entiende el evento; luego el mensaje o la acción; luego el pegamento.
Errores habituales
| Síntoma | Causa probable | Qué mirar |
|---|---|---|
| No llega ningún evento | La dirección está dada de alta en el otro modo | Dashboard → Developers → Webhooks, y confirma que estás en test |
| Firma inválida | El secreto es de otra dirección o del otro modo | Copia el secreto de esa dirección concreta |
| Stripe entrega, pero no pasa nada | El fallo está en tu destino, no en Stripe | Prueba el destino por separado, sin Stripe de por medio |
| Cuatro avisos por un solo impago | Reintentos de Stripe sin descartar repetidos | Guarda el evt_… o el id de factura ya procesados |
Siguiente paso
Cuando el evento te quede claro:
- Una dirección HTTPS tuya que reciba el envío, verifique la firma y se quede solo con los
invoice.payment_failed. - La acción — avisar al equipo, etiquetar al cliente, encolar un reintento… según tu proceso.
- Pruébalo entero en modo test antes de tocar el modo live.
Esta guía termina en el evento firmado de Stripe. El destino del aviso (email, chat, CRM, cola…) lo eliges tú según tu proceso.
Automatizaciones guiadas
Aplica lo aprendido en la guía con una de nuestras automatizaciones: