Cuando un pago falla, Dodo Payments te indica por qué a través de un
error_code estandarizado y un error_message legible para humanos. Esta guía muestra cómo leer esos campos, decidir si vale la pena reintentar, y recuperar el pago sin exponer información sensible a los clientes.Cómo Dodo Payments Informa un Fallo
Cada pago fallido, ya sea una compra única o una renovación de suscripción, lleva los mismos campos de fallo en el objeto de pago:| Campo | Tipo | Descripción |
|---|---|---|
status | string | failed para un pago fallido. Otros estados no exitosos incluyen cancelled, requires_customer_action, y requires_payment_method. |
error_code | string | null | La razón estandarizada del fallo, por ejemplo INSUFFICIENT_FUNDS o PROCESSING_ERROR. Consulta la referencia de Fallos de Transacción para la lista completa. |
error_message | string | null | Una explicación legible para humanos del fallo. |
retry_attempt | integer | 0 para el cargo original. 1 o superior identifica un reintento de renovación de suscripción programada. |
error_code e error_message son null hasta que un pago realmente falle. Siempre verifica status primero, luego lee los campos de error.El Webhook payment.failed
La manera más confiable de detectar un fallo es el webhook payment.failed. El evento envuelve el objeto de pago completo en data:
payment.failed payload
error_code y lo encamina:
Decidir si Reintentar: Rechazos Suaves vs. Duros
Elerror_code te indica si vale la pena reintentar el mismo método de pago.
| Tipo de Rechazo | Qué significa | Qué hacer |
|---|---|---|
| Rechazo suave | Temporal o corregible (por ejemplo INSUFFICIENT_FUNDS, PROCESSING_ERROR, NETWORK_ERROR, TRY_AGAIN_LATER). | Reintentar — después de un retraso, o una vez que el cliente corrija su entrada — puede tener éxito. |
| Rechazo duro | Terminal (por ejemplo STOLEN_CARD, LOST_CARD, DO_NOT_HONOR, FRAUDULENT). | No reintentar con la misma tarjeta. Solicita al cliente un método de pago diferente. |
error_code.
Manejo de Fallos en el Pago vs. en la Renovación
Cómo te recuperas depende de si el cliente está presente.- At checkout (customer present)
- On subscription renewal (customer not present)
El cliente está realizando la compra activamente. Muestra un mensaje claro y permite que reintenten inmediatamente o usen otra tarjeta.
requires_payment_method— el cliente nunca proporcionó un método de pago: no ingresaron detalles de la tarjeta o se les solicitó uno y no tomaron acción. Esto usualmente es un abandono de carrito de compra, no un rechazo — vuelve a involucrar al cliente para completar el pago (consulta Recuperación de Carrito Abandonado).requires_customer_action— se necesita autenticación adicional (como 3DS); haz que el cliente la complete. Consulta el manejo de 3D Secure.
Reintentando un Pago Fallido
- Suscripciones: Activa Reintentos de Pago de Suscripción para recuperar rechazos suaves sin trabajo de integración. También puedes desencadenar la recuperación haciendo que el cliente actualice su método de pago a través de la API de Actualización de Método de Pago, que carga cualquier saldo pendiente.
- Pagos únicos: Reenvía el checkout o
payment_linkpara que el cliente pueda intentarlo de nuevo con un método diferente. No hay reintento automático para pagos únicos.
Mostrar Errores a los Clientes de Manera Segura
Muestra a los clientes un mensaje amigable — nunca elerror_code crudo.
Customer-facing messaging
Relacionado
Transaction Failures
Cada código de rechazo, su tipo, y la acción recomendada.
Error Codes
Errores de API y lógica de negocio que no son rechazos de tarjeta.
Subscription Payment Retries
Recuperación automática de rechazos suaves en renovaciones de suscripción.
Subscription Dunning
Secuencias de email que recuperan rechazos duros.
Payment Webhooks
Esquema completo de carga útil para eventos de pago.
Testing Failures
Tarjetas de prueba que simulan rechazos y fallos de renovación.