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
- Non fourni /
null— les remises existantes avecpreserve_on_plan_change=truesont conservées si elles s’appliquent au nouveau produit. [](tableau vide) — supprime toutes les remises existantes de l’abonnement.["CODE_A", "CODE_B", ...]— remplace toutes les remises existantes par cet ensemble empilable.
discount_codes pour les nouvelles intégrations. Ce champ fonctionne toujours pour assurer la compatibilité ascendante, mais ne peut pas être combiné avec discount_codes dans la même requête.immediately(par défaut) : Appliquer immédiatement le changement de plannext_billing_date: Programmer le changement pour la prochaine date de facturation. Le client conserve son plan actuel jusqu’à la fin de la période de facturation.
next_billing_date pour les rétrogradations, afin que les clients gardent les avantages de leur plan actuel jusqu’à la fin de la période de facturation.Handle Webhook Events
subscription.active: Changement de plan réussi, abonnement mis à joursubscription.plan_changed: Plan d’abonnement changé (mise à niveau/rétrogradation/mise à jour des modules complémentaires)subscription.on_hold: Échec du prélèvement pour le changement de plan, abonnement mis en pausepayment.succeeded: Prélèvement immédiat pour changement de plan réussipayment.failed: Échec du prélèvement immédiat
Update Your Application State
- Accorder/révoquer des fonctionnalités en fonction du nouveau plan
- Mettre à jour le tableau de bord client avec les nouveaux détails du plan
- Envoyer des emails de confirmation concernant les changements de plan
- Enregistrer les changements de facturation à des fins de vérification
Test and Monitor
- Testez tous les modes de proratisation avec différents scénarios
- Vérifiez que la gestion des webhooks fonctionne correctement
- Surveillez les taux de succès des changements de plan
- Configurez des alertes pour les échecs de changement de plan
Prévisualisation des changements de plan
Avant de valider un changement de plan, utilisez l’API de Prévisualisation pour montrer aux clients exactement ce qu’ils seront facturés :- Node.js SDK
- Python SDK
API de Changement de Plan
Utilisez l’API de Changement de Plan pour modifier le produit, la quantité et le comportement de proratisation pour un abonnement actif.Exemples de démarrage rapide
- Node.js SDK
- Python SDK
- Go SDK
- HTTP
invoice_id et payment_id sont retournés uniquement lorsqu’un prélèvement immédiat et/ou une facture sont créés lors du changement de plan. Toujours se fier aux événements des webhooks (e.g., payment.succeeded, subscription.plan_changed) pour confirmer les résultats.Gestion des Modules Complémentaires
Lors du changement de plans d’abonnement, vous pouvez également modifier les modules complémentaires :Application de Codes Promo
Vous pouvez appliquer un ou plusieurs codes promo empilables lors du changement de plans d’abonnement (max 20, appliqués dans l’ordre du tableau). Ceci est utile pour offrir un tarif promotionnel sur des mises à niveau ou des migrations.- Node.js SDK
- Python SDK
- HTTP
Comportement des remises lors du changement de plan
discount_codes valeur | Comportement |
|---|---|
Non fourni / null | Les remises existantes avec preserve_on_plan_change=true sont automatiquement conservées si elles s’appliquent au nouveau produit. |
[] (tableau vide) | Toutes les remises existantes sont supprimées de l’abonnement. |
["CODE_A", "CODE_B", ...] | Remplace toutes les remises existantes par cet ensemble empilable, validé et appliqué dans l’ordre du tableau. |
discount_code sur ce point de terminaison est obsolète mais fonctionne toujours pour assurer la compatibilité ascendante — les intégrations existantes n’ont pas besoin de changer immédiatement. Il ne peut pas être combiné avec discount_codes dans la même requête. Passez à la forme tableau quand cela est pratique.Modes de Proratisation
Choisissez comment facturer le client lors des changements de plan :prorated_immediately
- Facture pour la différence partielle dans le cycle actuel
- Si en période d’essai, facture immédiatement et passe maintenant au nouveau plan
- Rétrogradation : peut générer un crédit au prorata appliqué aux renouvellements futurs
full_immediately
- Facture le montant total du nouveau plan immédiatement
- Ignore le temps restant du plan ancien
difference_immediately sont liés à l’abonnement et distincts des droits de Facturation Basée sur le Crédit. Ils s’appliquent automatiquement aux renouvellements futurs du même abonnement et ne sont pas transférables d’un abonnement à un autre.difference_immediately
- Mise à niveau : facture immédiatement la différence de prix entre les anciens et les nouveaux plans
- Rétrogradation : ajoute la valeur restante en crédit interne à l’abonnement et l’applique automatiquement aux renouvellements
do_not_bill
- Aucun frais ou crédit n’est calculé
- Le client passe immédiatement au nouveau plan sans ajustement de facturation
- Le cycle de facturation reste inchangé
- Idéal pour les migrations de courtoisie, les changements de plan gratuits ou l’absorption des différences de coût
| Fonctionnalité | prorated_immediately | difference_immediately | full_immediately | do_not_bill |
|---|---|---|---|---|
| Frais de mise à niveau | Différence proratisée pour les jours restants | Différence de prix totale entre les plans | Prix total du nouveau plan | Aucun frais |
| Crédit de rétrogradation | Crédit proratisé pour les jours restants | Différence de prix totale comme crédit | Aucun crédit | Aucun crédit |
| Cycle de facturation | Inchangé | Inchangé | Réinitialisé à aujourd’hui | Inchangé |
| Comportement pendant l’essai | Met fin à l’essai, facture immédiatement | Met fin à l’essai, facture immédiatement | Met fin à l’essai, facture le montant total | Met fin à l’essai, aucun frais |
| Idéal pour | Facturation équitable basée sur le temps | Calcul simple de mise à niveau/rétrogradation | Réinitialisation des cycles de facturation | Migrations gratuites ou changements de courtoisie |
| Complexité | Moyenne (calcul de jour) | Faible (soustraction simple) | Faible (montant total) | Aucune |
Scénarios d’exemple
Utilisez ces chiffres canoniques de manière cohérente :- Plan actuel : Basique à 30 $/mois
- Objectif de mise à niveau : Pro à 80 $/mois
- Objectif de rétrogradation (à partir de Pro) : Starter à 20 $/mois
- Cycle de facturation : 30 jours, commencé le 1er janvier
- Changement de plan prévu pour le 16 janvier (15 jours restants, 15 jours utilisés)
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
Comment chaque mode traite la facturation
Gestion des Échecs de Paiement
Contrôlez ce qui se passe lorsqu’un paiement de changement de plan échoue en utilisant le paramètreon_payment_failure.
Modes d’Échec de Paiement
- prevent_change (Recommended for critical upgrades)
- apply_change (Default)
- Le changement de plan est marqué “en attente”
- Le client conserve l’accès à son plan actuel
- L’abonnement se déplace vers l’état
activeseulement après un paiement réussi - Utile lorsque vous souhaitez garantir le paiement avant d’accorder des fonctionnalités améliorées
on_payment_failure utilise votre paramètre par défaut au niveau de l’entreprise configuré dans le tableau de bord.Quand Utiliser Chaque Mode
| Scénario | Mode Recommandé | Raison |
|---|---|---|
| Mise à niveau vers des fonctionnalités premium | prevent_change | Assurez le paiement avant d’accorder l’accès |
| Augmentation de la quantité (plus de sièges) | prevent_change | Prévenir l’usage sans paiement |
| Rétrogradation des plans | apply_change | Le client réduit ses dépenses |
| Clients d’entreprise de confiance | apply_change | Risque de non-paiement faible |
| Conversion de l’essai en abonnement payant | prevent_change | Moment de paiement critique |
Gestion des Webhooks
Suivez l’état des abonnements via les webhooks pour confirmer les changements de plan et les paiements.Types d’Événements à Gérer
subscription.active: abonnement activésubscription.plan_changed: Plan d’abonnement modifié (mise à niveau/rétrogradation/changements de modules complémentaires)subscription.on_hold: Échec du prélèvement, abonnement mis en pausesubscription.renewed: renouvellement réussipayment.succeeded: Prélèvement pour changement de plan ou renouvellement réussipayment.failed: Échec du paiement
Vérification des Signatures et Gestion des Intentions
- Next.js Route Handler
- Express.js
Meilleures Pratiques
Suivez ces recommandations pour des changements de plan d’abonnement fiables :Stratégie de Changement de Plan
- Tester rigoureusement : Testez toujours les changements de plan en mode test avant la production
- Choisir la proratisation avec soin : Sélectionnez le mode de proratisation qui s’aligne avec votre modèle commercial
- Gérer les échecs avec soin : Mettez en œuvre une gestion appropriée des erreurs et une logique de reprise
- Surveiller les taux de succès : Suivez les taux de succès/échec des changements de plan et examinez les problèmes
Implémentation des Webhooks
- Vérifiez les signatures : Validez toujours les signatures des webhooks pour garantir leur authenticité
- Implémentez l’idempotence : Gérez avec soin les événements de webhook en double
- Traitez de manière asynchrone : Ne bloquez pas les réponses des webhooks avec des opérations lourdes
- Tout enregistrer : Maintenez des journaux détaillés pour le débogage et la vérification
Expérience Utilisateur
- Communiquez clairement : Informez les clients des changements de facturation et de leur calendrier
- Fournissez des confirmations : Envoyez des confirmations par email pour les changements de plan réussis
- Gérez les cas particuliers : Considérez les périodes d’essai, les proratisations et les paiements échoués
- Mettez à jour l’interface utilisateur immédiatement : Réflétez les changements de plan dans l’interface de votre application
Problèmes Courants et Solutions
Résolvez les problèmes typiques rencontrés lors des changements de plan d’abonnement :Charge created but subscription not updated
Charge created but subscription not updated
- Le traitement des webhooks a échoué ou a été retardé
- L’état de l’application n’a pas été mis à jour après la réception des webhooks
- Problèmes de transaction de base de données lors de la mise à jour de l’état
- Implémentez une gestion robuste des webhooks avec une logique de reprise
- Utilisez des opérations idempotentes pour les mises à jour d’état
- Ajoutez une surveillance pour détecter et alerter sur les événements de webhook manqués
- Vérifiez que le point de terminaison du webhook est accessible et répond correctement
Credits not applied after downgrade
Credits not applied after downgrade
- Attentes de mode de proratisation : les rétrogradations créditent la différence totale de prix du plan avec
difference_immediately, tandis queprorated_immediatelycrée un crédit proratisé basé sur le temps restant dans le cycle - Les crédits sont spécifiques à un abonnement et ne se transfèrent pas entre abonnements
- Solde de crédit non visible dans le tableau de bord client
- Utilisez
difference_immediatelypour les rétrogradations lorsque vous souhaitez des crédits automatiques - Expliquez aux clients que les crédits s’appliquent aux renouvellements futurs du même abonnement
- Implémentez un portail client pour montrer les soldes de crédit
- Vérifiez l’aperçu de la prochaine facture pour voir les crédits appliqués
Webhook signature verification fails
Webhook signature verification fails
- Clé secrète de webhook incorrecte
- Corps de requête brute modifié avant la vérification de la signature
- Mauvais algorithme de vérification de la signature
- Vérifiez que vous utilisez le bon
DODO_WEBHOOK_SECRETdepuis le tableau de bord - Lire le corps de la requête brute avant tout middleware de parsing JSON
- Utilisez la bibliothèque standard de vérification de signature de webhook pour votre plateforme
- Testez la vérification des signatures de webhook dans l’environnement de développement
Plan change fails with 422 error
Plan change fails with 422 error
- ID d’abonnement ou ID de produit invalide
- Abonnement non en état actif
- Paramètres requis manquants
- Produit non disponible pour les changements de plan
- Vérifiez que l’abonnement existe et est actif
- Assurez-vous que l’ID du produit est valide et disponible
- Assurez-vous que tous les paramètres requis sont fournis
- Consultez la documentation de l’API pour les exigences en matière de paramètres
Immediate charge fails during plan change
Immediate charge fails during plan change
- Fonds insuffisants sur le moyen de paiement du client
- Moyen de paiement expiré ou invalide
- La banque a refusé la transaction
- La détection de fraude a bloqué le prélèvement
- Gérez correctement les événements de webhook
payment.failed - Notifiez le client pour mettre à jour son moyen de paiement
- Implémentez une logique de reprise pour les échecs temporaires
- Envisagez de permettre des changements de plan avec des prélèvements immédiats échoués
Subscription on hold after plan change
Subscription on hold after plan change
on_holdQue se passe-t-il :
Lorsque le prélèvement de changement de plan échoue, l’abonnement est automatiquement placé en état on_hold. L’abonnement ne se renouvellera pas automatiquement tant que le moyen de paiement n’est pas mis à jour.Solution : Mettez à jour le moyen de paiement pour réactiver l’abonnementPour réactiver un abonnement depuis l’état on_hold après un échec de changement de plan :- Mettez à jour le moyen de paiement en utilisant l’API de Mise à Jour de Moyen de Paiement
- Création automatique de prélèvement : L’API crée automatiquement un prélèvement pour les montants dus restants
- Génération de facture : Une facture est générée pour le prélèvement
- Traitement du paiement : Le paiement est traité à l’aide du nouveau moyen de paiement
- Réactivation : Après un paiement réussi, l’abonnement est réactivé à l’état
active
subscription.on_hold: Abonnement mis en attente (reçu lorsque le prélèvement de changement de plan échoue)payment.succeeded: Paiement des montants dus réussi (après mise à jour du moyen de paiement)subscription.active: Abonnement réactivé après paiement réussi
- Notifiez immédiatement les clients lorsqu’un prélèvement de changement de plan échoue
- Fournissez des instructions claires sur la façon de mettre à jour leur moyen de paiement
- Surveillez les événements des webhooks pour suivre le statut de réactivation
- Envisagez d’implémenter une logique de reprise automatique pour les échecs de paiement temporaires
Update Payment Method API Reference
Test de votre implémentation
Suivez ces étapes pour tester rigoureusement l’implémentation de votre changement de plan d’abonnement :Set up test environment
- Utilisez des clés API de test et des produits de test
- Créez des abonnements de test avec différents types de plan
- Configurez le point de terminaison de webhook de test
- Configurez la surveillance et l’enregistrement
Test different proration modes
- Testez
prorated_immediatelyavec diverses positions de cycle de facturation - Testez
difference_immediatelypour les mises à niveau et les rétrogradations - Testez
full_immediatelypour réinitialiser les cycles de facturation - Testez
do_not_billpour des changements de plan sans frais/ni crédit - Vérifiez que les calculs de crédit sont corrects
Test webhook handling
- Vérifiez que tous les événements de webhook pertinents sont reçus
- Testez la vérification des signatures de webhook
- Gérez avec soin les événements de webhook en double
- Testez les scénarios d’échec de traitement de webhook
Test error scenarios
- Testez avec des ID d’abonnement invalides
- Testez avec des moyens de paiement expirés
- Testez les échecs de réseau et les délais d’attente
- Testez avec des fonds insuffisants
Gestion des Erreurs
Gérez avec soin les erreurs communes de l’API dans votre implémentation :Codes d’État 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
Format de Réponse d’Erreur
Prochaines étapes
- Consultez l’API de Changement de Plan
- Explorez la Facturation Basée sur le Crédit
- Implémentez des alertes pour
subscription.on_hold - Consultez notre Guide d’Intégration de Webhooks