Change Plan API
Plan Change Preview
Integration Guide
What is a subscription upgrade or downgrade?
Changing plans lets you move a customer between subscription tiers or quantities. Use it to:- Align pricing with usage or features
- Move from monthly to annual (or vice versa)
- Adjust quantity for seat-based products
When to use plan changes
- Upgrade when a customer needs more features, usage, or seats
- Downgrade when usage decreases
- Migrate users to a new product or price without cancelling their subscription
Plan Change Flow
Prerequisites
Before implementing subscription plan changes, ensure you have:- A Dodo Payments merchant account with active subscription products
- API credentials (API key and webhook secret key) from the dashboard
- An existing active subscription to modify
- Webhook endpoint configured to handle subscription events
Step-by-Step Implementation Guide
Follow this comprehensive guide to implement subscription plan changes in your application:Understand Plan Change Requirements
- Which subscription products can be changed to which others
- What proration mode fits your business model
- How to handle failed plan changes gracefully
- Which webhook events to track for state management
Choose Your Proration Strategy
- prorated_immediately
- difference_immediately
- full_immediately
- do_not_bill
- Calculates exact prorated amount based on remaining cycle time
- Charges a prorated amount based on unused time remaining in the cycle
- Provides transparent billing to customers
Implement the Change Plan API
prorated_immediately, full_immediately, difference_immediately, or do_not_bill.prevent_change: Keep subscription on current plan until payment succeedsapply_change(default): Apply plan change immediately regardless of payment outcome
- No proporcionado /
null— los descuentos existentes conpreserve_on_plan_change=truese conservan si son aplicables al nuevo producto. [](array vacío) — elimina todos los descuentos existentes de la suscripción.["CODE_A", "CODE_B", ...]— reemplaza cualquier descuento existente con este conjunto apilado.
discount_codes para nuevas integraciones. Este campo sigue funcionando para compatibilidad con versiones anteriores, pero no puede combinarse con discount_codes en la misma solicitud.immediately(por defecto): Aplicar el cambio de plan de inmediatonext_billing_date: Programar el cambio para la próxima fecha de facturación. El cliente conserva su plan actual hasta que finalice el período de facturación.
next_billing_date para degradaciones para que los clientes mantengan los beneficios de su plan actual hasta el final del período de facturación.Handle Webhook Events
subscription.active: Cambio de plan exitoso, suscripción actualizadasubscription.plan_changed: Plan de suscripción cambiado (mejora/degradación/actualización de complemento)subscription.on_hold: Fallo al cobrar el cambio de plan, suscripción pausadapayment.succeeded: Cargo inmediato por cambio de plan exitosopayment.failed: Fallo en el cargo inmediato
Update Your Application State
- Otorgar/revocar funciones según el nuevo plan
- Actualizar el panel de control del cliente con los detalles del nuevo plan
- Enviar correos electrónicos de confirmación sobre los cambios de plan
- Registrar cambios de facturación para fines de auditoría
Test and Monitor
- Prueba todos los modos de prorrateo con diferentes escenarios
- Verifica que el manejo de webhooks funcione correctamente
- Monitorea las tasas de éxito de cambios de plan
- Configura alertas para cambios de plan fallidos
Previsualizar Cambios de Plan
Antes de comprometerse con un cambio de plan, utiliza la API de Vista Previa para mostrar a los clientes exactamente lo que se les cobrará:- Node.js SDK
- Python SDK
API de Cambio de Plan
Utiliza la API de Cambio de Plan para modificar el producto, la cantidad y el comportamiento de prorrateo para una suscripción activa.Ejemplos de inicio rápido
- Node.js SDK
- Python SDK
- Go SDK
- HTTP
invoice_id y payment_id se devuelven solo cuando se crea un cargo y/o factura inmediato durante el cambio de plan. Siempre confía en los eventos de webhooks (por ejemplo, payment.succeeded, subscription.plan_changed) para confirmar resultados.Gestión de Complementos
Al cambiar los planes de suscripción, también puedes modificar los complementos:Aplicar Códigos de Descuento
Puedes aplicar uno o más códigos de descuento apilados al cambiar los planes de suscripción (máx. 20, aplicado en el orden del array). Esto es útil para ofrecer precios promocionales en actualizaciones o migraciones.- Node.js SDK
- Python SDK
- HTTP
Comportamiento del descuento en el cambio de plan
Valor de discount_codes | Comportamiento |
|---|---|
No proporcionado / null | Los descuentos existentes con preserve_on_plan_change=true se conservan automáticamente si son aplicables al nuevo producto. |
[] (array vacío) | Se eliminan todos los descuentos existentes de la suscripción. |
["CODE_A", "CODE_B", ...] | Reemplaza cualquier descuento existente con este conjunto apilado, validado y aplicado en el orden del array. |
discount_code en este endpoint está obsoleto pero aún funciona para la compatibilidad con versiones anteriores: las integraciones existentes no necesitan cambiarse de inmediato. No puede combinarse con discount_codes en la misma solicitud. Migra a la forma de array cuando sea conveniente.Modos de Prorrateo
Elige cómo facturar al cliente al cambiar de plan:prorated_immediately
- Cargos por la diferencia parcial en el ciclo actual
- Si está en prueba, cobra inmediatamente y cambia al nuevo plan ahora
- Degradación: puede generar un crédito prorrateado aplicado a futuras renovaciones
full_immediately
- Cobra el monto completo del nuevo plan inmediatamente
- Ignora el tiempo restante del plan antiguo
difference_immediately están limitados a la suscripción y son distintos de los derechos de Facturación Basada en Créditos. Se aplican automáticamente a futuras renovaciones de la misma suscripción y no son transferibles entre suscripciones.difference_immediately
- Mejora: cobra de inmediato la diferencia de precio entre los planes viejo y nuevo
- Degradación: añade el valor restante como crédito interno a la suscripción y se aplica automáticamente en las renovaciones
do_not_bill
- No se calculan cargos ni créditos
- El cliente cambia al nuevo plan inmediatamente sin ningún ajuste de facturación
- El ciclo de facturación permanece sin cambios
- Ideal para migraciones de cortesía, cambios de plan gratuitos o absorción de diferencias de costo
| Feature | prorated_immediately | difference_immediately | full_immediately | do_not_bill |
|---|---|---|---|---|
| Upgrade charge | Diferencia prorrateada por los días restantes | Diferencia del precio completo entre planes | Precio completo del nuevo plan | Sin cargo |
| Downgrade credit | Crédito prorrateado por los días restantes | Diferencia de precio completo como crédito | Sin crédito | Sin crédito |
| Billing cycle | Se restablece a hoy | Se restablece a hoy | Se restablece a hoy | Sin cambios |
| Trial behavior | Termina el periodo de prueba, se cobra inmediatamente | Termina el periodo de prueba, se cobra inmediatamente | Termina el periodo de prueba, se cobra el monto completo | Termina el periodo de prueba, sin cargo |
| Best for | Facturación justa basada en el tiempo | Matemáticas simples de actualización/degradación | Restablecer ciclos de facturación | Migraciones gratuitas o cambios de cortesía |
| Complexity | Media (cálculo de días) | Baja (resta simple) | Baja (cobro completo) | Ninguna |
Escenarios de Ejemplo
Usa estos números canónicos de manera consistente:- Plan actual: Básico a $30/mes
- Objetivo de mejora: Pro a $80/mes
- Objetivo de degradación (de Pro): Starter a $20/mes
- Ciclo de facturación: 30 días, comenzado el 1 de enero
- El cambio de plan ocurre el 16 de enero (15 días restantes, 15 días usados)
Upgrade: Basic ($30) → Pro ($80) with prorated_immediately
Upgrade: Basic ($30) → Pro ($80) with prorated_immediately
Downgrade: Pro ($80) → Starter ($20) with prorated_immediately
Downgrade: Pro ($80) → Starter ($20) with prorated_immediately
Upgrade: Basic ($30) → Pro ($80) with difference_immediately
Upgrade: Basic ($30) → Pro ($80) with difference_immediately
Downgrade: Pro ($80) → Starter ($20) with difference_immediately
Downgrade: Pro ($80) → Starter ($20) with difference_immediately
Upgrade: Basic ($30) → Pro ($80) with full_immediately
Upgrade: Basic ($30) → Pro ($80) with full_immediately
Mid-cycle upgrade with add-ons using prorated_immediately
Mid-cycle upgrade with add-ons using prorated_immediately
Cómo cada modo procesa la facturación
Manejo de Fallos de Pago
Controla lo que sucede cuando falla el pago de un cambio de plan usando el parámetroon_payment_failure.
Modos de Fallo de Pago
- prevent_change (Recommended for critical upgrades)
- apply_change (Default)
- El cambio de plan se marca como “pendiente”
- El cliente retiene el acceso a su plan actual
- La suscripción se mueve al estado
activesolo después del pago exitoso - Útil cuando deseas asegurar el pago antes de otorgar funciones mejoradas
on_payment_failure utiliza la configuración predeterminada a nivel empresarial configurada en el panel de control.Cuándo Usar Cada Modo
| Escenario | Modo Recomendado | Razón |
|---|---|---|
| Mejora a funciones premium | prevent_change | Asegura el pago antes de otorgar acceso |
| Aumento de cantidad (más asientos) | prevent_change | Evita el uso sin pago |
| Degradación de planes | apply_change | El cliente está reduciendo el gasto |
| Clientes empresariales de confianza | apply_change | Menor riesgo de incumplimiento de pago |
| Conversión de prueba a pago | prevent_change | Momento crítico de pago |
Valores predeterminados de Negocio y Colección
En lugar de pasar parámetros de prorrateo en cada cambio de plan, puedes configurar el comportamiento de actualización y degradación predeterminado una vez a nivel de negocio. Estos valores predeterminados se aplican a todos los cambios de plan en el portal del cliente y se pueden sobrescribir por colección de productos. Existen valores predeterminados separados para actualizaciones y degradaciones:| Configuración | Campo (actualización / degradación) | Predeterminado (actualización) | Predeterminado (degradación) |
|---|---|---|---|
| Cuándo comienza el nuevo plan | effective_at_on_upgrade / effective_at_on_downgrade | immediately | next_billing_date |
| Cómo se cobra al cliente | proration_billing_mode_on_upgrade / proration_billing_mode_on_downgrade | difference_immediately | difference_immediately |
| Si el pago del cliente falla | on_payment_failure | apply_change | apply_change |
Orden de resolución
Para cualquier cambio de plan, cada configuración se resuelve en este orden:Manejo de webhooks
Rastrea el estado de la suscripción a través de webhooks para confirmar cambios de plan y pagos.Tipos de eventos a manejar
subscription.active: suscripción activadasubscription.plan_changed: plan de suscripción cambiado (cambios de actualización/degradación/addon)subscription.on_hold: cargo fallido, suscripción pausadasubscription.renewed: renovación exitosapayment.succeeded: pago por cambio de plan o renovación exitosopayment.failed: pago fallido
Verificar firmas y manejar intenciones
- Next.js Route Handler
- Express.js
Mejores Prácticas
Sigue estas recomendaciones para cambios confiables en los planes de suscripción:Estrategia de Cambio de Plan
- Prueba a fondo: Siempre prueba los cambios de plan en modo de prueba antes de producción
- Elige el prorrateo con cuidado: Selecciona el modo de prorrateo que se alinea con tu modelo de negocio
- Maneja fallas con gracia: Implementa un manejo adecuado de errores y lógica de reintento
- Monitorea tasas de éxito: Rastrea las tasas de éxito/falla de cambios de plan e investiga problemas
Implementación de Webhook
- Verifica firmas: Valida siempre las firmas de los webhooks para asegurar su autenticidad
- Implementa idempotencia: Lidia con los eventos de webhook duplicados con gracia
- Procesa asincrónicamente: No bloquees las respuestas de webhook con operaciones pesadas
- Registra todo: Mantén registros detallados para depuración y auditoría
Experiencia del Usuario
- Comunica claramente: Informa a los clientes sobre los cambios de facturación y el tiempo
- Proporciona confirmaciones: Envía confirmaciones por correo electrónico para cambios de plan exitosos
- Maneja casos extremos: Considera períodos de prueba, prorrateos y pagos fallidos
- Actualiza la interfaz de usuario inmediatamente: Refleja los cambios de plan en la interfaz de tu aplicación
Problemas Comunes y Soluciones
Resuelve problemas típicos encontrados durante los cambios de plan de suscripción:Charge created but subscription not updated
Charge created but subscription not updated
- El procesamiento del webhook falló o se retrasó
- El estado de la aplicación no se actualizó después de recibir webhooks
- Problemas de transacciones en la base de datos durante la actualización del estado
- Implementa un manejo robusto de webhooks con lógica de reintento
- Usa operaciones idempotentes para actualizaciones de estado
- Agrega monitoreo para detectar y alertar sobre eventos de webhook perdidos
- Verifica que la URL del webhook sea accesible y responda correctamente
Credits not applied after downgrade
Credits not applied after downgrade
- Expectativas del modo de prorrateo: las degradaciones acreditan la diferencia de precio completo del plan con
difference_immediately, mientras queprorated_immediatelycrea un crédito prorrateado basado en el tiempo restante en el ciclo - Los créditos son específicos de suscripción y no se transfieren entre suscripciones
- Saldo de crédito no visible en el panel del cliente
- Usa
difference_immediatelypara degradaciones cuando quieras créditos automáticos - Explica a los clientes que los créditos se aplican a futuras renovaciones de la misma suscripción
- Implementa un portal del cliente para mostrar saldos de crédito
- Verifica la vista previa de la próxima factura para ver los créditos aplicados
Webhook signature verification fails
Webhook signature verification fails
- Clave secreta del webhook incorrecta
- Cuerpo de la solicitud cruda modificado antes de la verificación de la firma
- Algoritmo de verificación de firma incorrecto
- Verifica que estás usando el correcto
DODO_WEBHOOK_SECRETdesde el panel - Lee el cuerpo de la solicitud cruda antes de cualquier middleware de análisis JSON
- Usa la biblioteca estándar de verificación de webhooks para tu plataforma
- Prueba la verificación de firmas de webhooks en el entorno de desarrollo
Plan change fails with 422 error
Plan change fails with 422 error
- ID de suscripción o producto inválido
- Suscripción no está en estado activo
- Faltan parámetros requeridos
- Producto no disponible para cambios de plan
- Verifica que la suscripción existe y está activa
- Comprueba que el ID del producto sea válido y esté disponible
- Asegúrate de que todos los parámetros requeridos están proporcionados
- Revisa la documentación de la API para los requisitos de los parámetros
Immediate charge fails during plan change
Immediate charge fails during plan change
- Fondos insuficientes en el método de pago del cliente
- Método de pago vencido o inválido
- El banco rechazó la transacción
- La detección de fraude bloqueó el cargo
- Maneja eventos de webhook
payment.failedapropiadamente - Notifica al cliente para actualizar el método de pago
- Implementa lógica de reintento para fallas temporales
- Considera permitir cambios de plan con cargos inmediatos fallidos
Subscription on hold after plan change
Subscription on hold after plan change
on_holdQué sucede:
Cuando falla un cobro de cambio de plan, la suscripción se coloca automáticamente en estado on_hold. La suscripción no se renovará automáticamente hasta que se actualice el método de pago.Solución: Actualiza el método de pago para reactivar la suscripciónPara reactivar una suscripción desde el estado on_hold después de un fallo en el cambio de plan:- Actualiza el método de pago usando la API de Actualización de Método de Pago
- Creación automática de cargos: La API crea automáticamente un cargo por los adeudos pendientes
- Generación de factura: Se genera una factura por el cargo
- Procesamiento de pagos: El pago se procesa usando el nuevo método de pago
- Reactivación: Una vez realizado el pago con éxito, la suscripción se reactiva al estado
active
subscription.on_hold: Suscripción en espera (recibido cuando falla el cobro del cambio de plan)payment.succeeded: Pago exitoso de adeudos pendientes (después de actualizar el método de pago)subscription.active: Suscripción reactivada tras pago exitoso
- Notifica a los clientes inmediatamente cuando falla un cobro de cambio de plan
- Proporciona instrucciones claras sobre cómo actualizar su método de pago
- Monitorea eventos de webhook para rastrear el estado de reactivación
- Considera implementar lógica de reintento automático para fallos temporales de pago
Update Payment Method API Reference
Probando Tu Implementación
Sigue estos pasos para probar exhaustivamente la implementación del cambio de plan de suscripción:Set up test environment
- Usa claves de API de prueba y productos de prueba
- Crea suscripciones de prueba con diferentes tipos de plan
- Configura el endpoint de webhook de prueba
- Configura monitoreo y registros
Test different proration modes
- Prueba
prorated_immediatelycon varias posiciones del ciclo de facturación - Prueba
difference_immediatelypara actualizaciones y degradaciones - Prueba
full_immediatelypara restablecer ciclos de facturación - Prueba
do_not_billpara cambios de plan sin cargo/sin crédito - Verifica que los cálculos de crédito sean correctos
Test webhook handling
- Verifica que se reciban todos los eventos de webhook relevantes
- Prueba la verificación de firmas de los webhooks
- Maneja eventos de webhook duplicados con gracia
- Prueba escenarios de fallos en el procesamiento de webhooks
Test error scenarios
- Prueba con IDs de suscripción inválidos
- Prueba con métodos de pago vencidos
- Prueba fallos de red y tiempos de espera
- Prueba con fondos insuficientes
Manejo de Errores
Maneja con gracia los errores comunes de la API en tu implementación:Códigos de Estado HTTP
200 OK
200 OK
400 Bad Request
400 Bad Request
401 Unauthorized
401 Unauthorized
404 Not Found
404 Not Found
422 Unprocessable Entity
422 Unprocessable Entity
500 Internal Server Error
500 Internal Server Error
Formato de Respuesta de Error
Próximos pasos
- Revisa la API de Cambio de Plan
- Explora Facturación Basada en Créditos
-
Implementa alertas para
subscription.on_hold - Consulta nuestra Guía de Integración de Webhooks
- Review the Change Plan API
- Explore Credit-Based Billing
-
Implement alerts for
subscription.on_hold - Check out our Webhook Integration Guide