Lancé mi SaaS, Activé Stripe… y Estaba Perdiendo Más del 30% de mis Ingresos Recurrentes sin Saberlo

Programación· 4 min de lectura

Lancé mi SaaS, Activé Stripe… y Estaba Perdiendo Más del 30% de mis Ingresos Recurrentes sin Saberlo

Era un martes por la noche. Revisaba el dashboard de Stripe con café en mano y vi algo que no cuadraba.

Algunos clientes tenían el estado past_due. Otros, directamente canceled. Usuarios que yo creía activos. Usuarios que llevaban días sin acceso y sin que nadie les hubiera notificado nada.

No había ningún bug en el código. El problema era más simple y más gordo: nunca había configurado correctamente cómo Stripe maneja los pagos fallidos. Y encima, esos usuarios no tenían ninguna forma de actualizar su tarjeta sin escribirme a mí directamente.

Spoiler: no fue fácil admitirlo. Pero lo cuento porque es más común de lo que parece.

El Agujero 1: Pagos Fallidos que No Recuperas

Las tarjetas fallan. Todo el tiempo. Límite de crédito alcanzado, tarjeta caducada, banco que bloquea el cargo internacional. No es un caso edge — es el día a día de cualquier SaaS con suscripciones.

Lo que muchos developers no saben es que Stripe tiene un sistema llamado Smart Retries que usa machine learning para elegir el mejor momento para reintentar un cobro. No es un retry ciego a las 24 horas. Analiza patrones de comportamiento bancario para maximizar la probabilidad de éxito.

En 2024, según los propios datos de Stripe, este sistema recuperó miles de millones en ingresos para negocios de suscripción que de otro modo habrían perdido esos clientes por churno involuntario.

El dato que más me impactó: los negocios que no gestionan bien los pagos fallidos pueden perder más del 30% de sus ingresos recurrentes por esta causa. No por usuarios que deciden irse. Por usuarios que quieren quedarse pero cuya tarjeta simplemente falló.

Cómo activarlo: En tu dashboard de Stripe, ve a Billing → Settings → Automatic collection. Ahí puedes configurar Smart Retries y definir qué pasa después de N intentos fallidos (cancelar, pausar, enviar email).

Pero activarlo solo no basta. Necesitas escuchar los webhooks correctos.

El Agujero 2: Webhooks Mal Implementados

Este es el error más frecuente que veo. Y el más peligroso.

Muchos developers montan el endpoint de webhooks, lo prueban con un evento de prueba, y lo dan por bueno. Error.

Hay tres cosas que tienes que hacer sí o sí:

1. Verificar la firma de cada webhook

Nunca confíes en un payload de webhook sin verificar que viene de Stripe. Es trivial de implementar y crítico para la seguridad:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Si saltas este paso, cualquiera puede mandarte un POST falso y cambiar el estado de suscripción de un usuario.

2. Manejar idempotencia

Stripe puede enviar el mismo evento más de una vez. Tu handler tiene que ser idempotente — si procesas el mismo invoice.paid dos veces, no puedes dar acceso premium duplicado o cobrar dos veces.

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

3. Los eventos que realmente importan

Para una suscripción básica, tienes que escuchar al menos estos:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

El Agujero 3: Usuarios que No Pueden Autogestionar su Suscripción

Esto me costó más tickets de soporte de los que quiero recordar.

“¿Cómo cancelo mi plan?”
“¿Puedo bajar al plan básico?”
“Necesito actualizar mi tarjeta.”

Todos mensajes manuales. Todos míos. Todos evitables.

Stripe tiene un Customer Portal que resuelve esto de raíz. Es una página hosted que Stripe gestiona por ti donde tus usuarios pueden:

  • Actualizar o cambiar su método de pago
  • Ver su historial de facturas
  • Hacer upgrade o downgrade de plan
  • Cancelar su suscripción

Integrarlo es literal cuestión de minutos:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Y en el cliente:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Un botón. Una API call. Cero tickets de soporte sobre facturación.

El Contexto de 2026: Patrones de Suscripción que Importan

Más del 60% de los SaaS ofrecen hoy facturación basada en uso. No solo flat-rate. El mercado se ha movido hacia modelos más flexibles: por sede, por evento, por volumen.

Stripe soporta todos estos patrones nativamente. Pero lo importante es que el Customer Portal también los soporta — el usuario puede ver exactamente qué está consumiendo y por qué le cobran lo que le cobran.

En el contexto europeo, esto también intersecta con RGPD: tienes que poder darle al usuario su historial de facturas y la capacidad de gestionar su relación contigo. El Customer Portal resuelve parte de esta obligación sin que tengas que construirlo desde cero.

Por Dónde Empezar (Sin Abrumarte)

Si ahora mismo tienes Stripe en producción, el orden es este:

  1. Audita tus webhooks. ¿Estás verificando firmas? ¿Manejas idempotencia? Si no, es lo primero.
  2. Activa Smart Retries en tu dashboard. Es un toggle. Cuesta cero esfuerzo.
  3. Implementa el Customer Portal. Una tarde de trabajo. Cero tickets de soporte relacionados con facturación.

Eso es todo. Sin refactorizaciones épicas. Sin cambiar tu stack.

Lo aprendí por las malas. Tú no tienes que hacerlo.

Brian Mena

Brian Mena

Ingeniero informatico construyendo productos digitales rentables: SaaS, directorios y agentes de IA. Todo desde cero, todo en produccion.

LinkedIn