Prérequis
Avant de commencer, vous avez besoin des éléments suivants :- Un compte marchand Dodo Payments
- Une clé API disponible dans Developer → API Keys du tableau de bord, stockée dans
DODO_PAYMENTS_API_KEY - Un secret de webhook disponible dans Developer → Webhooks, stocké dans
DODO_PAYMENTS_WEBHOOK_KEY - Au moins un produit d’abonnement créé sous Products
Intégration de l’API
Sessions de checkout
Créez un abonnement en construisant une session de checkout avec votre produit d’abonnement. Le client autorise un moyen de paiement et l’abonnement est activé lorsqu’il termine le checkout.- Node.js SDK
- Python SDK
- REST API
Réponse de l’API
La réponse inclut uncheckout_url :
Webhooks
Les Webhooks notifient votre serveur lorsque des événements d’abonnement se produisent. Configurez votre endpoint sous Developer → Webhooks dans le dashboard. Pour configurer votre endpoint webhook, consultez Webhooks.Types d’événements d’abonnement
Suivez ces événements pour gérer le cycle de vie de l’abonnement :subscription.active— L’abonnement est activésubscription.updated— Un champ de l’abonnement a été modifiésubscription.on_hold— Une charge de renouvellement ou de changement de plan a échouésubscription.failed— La création de l’abonnement a échoué (définitif ; le client doit se réabonner)subscription.renewed— Une charge récurrente a réussisubscription.past_due— Un renouvellement a échoué et la période de grâce a commencé ; le client conserve l’accès jusqu’àpast_due_ends_atsubscription.plan_changed— Le plan a été mis à niveau, rétrogradé ou modifiésubscription.cancelled— L’abonnement a été annulésubscription.expired— L’abonnement a atteint la fin de sa durée
paused, unpaused et update_payment_method, consultez Subscription Webhooks.
Scénarios de paiement
Flux de paiement réussi La séquence des webhooks dépend de la présence ou non d’une période d’essai pour l’abonnement. Facturation immédiate (0 jour d’essai) :subscription.active: le mandat est autorisé et l’abonnement est activé.payment.succeeded: confirme la première charge. Attendez-vous à cet événement dans les 2 à 10 minutes suivant le paiement.
- Au début de l’essai (paiement) :
subscription.activeest déclenché une fois le moyen de paiement autorisé. Aucune charge récurrente n’est encore prélevée. La première charge réelle est différée jusqu’à la fin de l’essai. - À la fin de l’essai : le montant récurrent est prélevé et vous recevez
payment.succeededavecsubscription.renewed.
subscription.renewed: est déclenché à chaque cycle de facturation lorsque le paiement du renouvellement est prélevé, toujours avecpayment.succeeded. Il contient également lenext_billing_datemis à jour.
Chaque fois qu’une somme est réellement prélevée pour un produit d’abonnement, vous recevez
subscription.renewed et payment.succeeded. Utilisez subscription.renewed (plutôt que payment.succeeded seul) comme signal pour prolonger l’accès au cycle suivant.- Échec de l’abonnement
subscription.failed- La création de l’abonnement a échoué, car le mandat n’a pas pu être créé.payment.failed- Indique un paiement échoué.
- Abonnement suspendu
subscription.on_hold- L’abonnement est suspendu en raison de l’échec du paiement du renouvellement ou de la charge liée à un changement de plan. Si votre entreprise dispose d’une période de grâce, un renouvellement échoué fait d’abord passer l’abonnement àpast_due(subscription.past_due), puis àon_hold(oucancelled, selon la configuration de votre période de grâce) uniquement lorsque celle-ci prend fin. Consultez Subscription States.- Lorsqu’un abonnement est suspendu, il ne se renouvellera pas automatiquement tant que le moyen de paiement n’aura pas été mis à jour.
Bonne pratique : pour simplifier l’implémentation, nous vous recommandons de suivre principalement les événements d’abonnement afin de gérer le cycle de vie de l’abonnement.
subscription.failed et subscription.on_hold
Ces deux événements sont faciles à confondre, mais ils nécessitent une gestion très différente :
Gestion d’un abonnement suspendu
Lorsqu’un abonnement passe à l’étaton_hold, vous devez mettre à jour le moyen de paiement pour le réactiver. Cette section explique quand les abonnements sont suspendus et comment les gérer.
Quand les abonnements sont suspendus
Un abonnement est suspendu lorsque :- Le paiement du renouvellement échoue : la charge de renouvellement automatique échoue en raison de fonds insuffisants, d’une carte expirée ou d’un refus de la banque
- La charge liée à un changement de plan échoue : une charge immédiate lors de la mise à niveau ou de la rétrogradation du plan échoue
- L’autorisation du moyen de paiement échoue : le moyen de paiement ne peut pas être autorisé pour les charges récurrentes
Réactivation des abonnements suspendus
Pour réactiver un abonnement à l’étaton_hold, utilisez l’API Update Payment Method. Cette opération :
- Crée une charge correspondant aux sommes restant dues
- Génère une facture pour cette charge
- Traite le paiement avec le nouveau moyen de paiement
- Réactive l’abonnement à l’état
activeune fois le paiement réussi
1
Handle subscription.on_hold webhook
Lorsque vous recevez un webhook
subscription.on_hold, mettez à jour l’état de votre application et informez le client :2
Update payment method
Lorsque le client est prêt à mettre à jour son moyen de paiement, appelez l’API Update Payment Method :
Vous pouvez également utiliser un ID de moyen de paiement existant si le client a enregistré des moyens de paiement :
3
Monitor webhook events
Après la mise à jour du moyen de paiement, surveillez les événements webhook suivants :
payment.succeeded- La charge correspondant aux sommes restant dues a réussisubscription.active- L’abonnement a été réactivé
Exemple de payload d’événement d’abonnement
Modification des plans d’abonnement
Vous pouvez mettre à niveau ou rétrograder un plan d’abonnement à l’aide de l’endpoint change plan API. Cela vous permet de modifier le produit, la quantité et de gérer la proratisation de l’abonnement.Change Plan API Reference
Options de proratisation
Lors de la modification des plans d’abonnement, vous disposez de quatre options pour gérer la charge immédiate :1. prorated_immediately
- Crédite la portion inutilisée du cycle de facturation actuel, au prorata du temps restant. Le crédit couvre le plan de base, la quantité et les éventuels modules complémentaires
- Puis facture un cycle complet selon le nouveau plan, la nouvelle quantité et les nouveaux modules complémentaires. La charge elle-même n’est jamais proratisée
- Charge immédiate nette = (nouveau cycle complet) moins (fraction restante x ancien cycle complet). Si le crédit est supérieur, la différence est conservée comme crédit associé à l’abonnement pour les renouvellements futurs
- Pendant une période d’essai, cette option fait immédiatement passer l’utilisateur au nouveau plan et facture le client sans attendre
2. full_immediately
- Facture au client le montant total de l’abonnement du nouveau plan, sans crédit pour le cycle précédent
- Qu’il s’agisse d’une mise à niveau ou d’une rétrogradation, le client paie l’intégralité du prix du nouveau plan à partir de zéro
- Utile lorsque vous souhaitez facturer le montant total, quelle que soit la durée restante de l’ancien plan
3. difference_immediately
- Le client paie uniquement la différence entre le prix de l’ancien plan et celui du nouveau plan
- Le montant ne dépend pas du moment du cycle où la modification est effectuée. La même mise à niveau coûte autant au premier qu’au vingt-neuvième jour
- Lors d’une mise à niveau, la différence est immédiatement facturée au client. Par exemple, $30/mois → $80/mois = $50 facturés immédiatement
- Lors d’une rétrogradation, la différence de prix est enregistrée comme crédit associé à l’abonnement et appliquée automatiquement aux futurs renouvellements. Par exemple, $50/mois → $20/mois = $30 enregistrés comme crédit
4. do_not_bill
- Applique immédiatement la modification du plan, mais ne facture rien au moment de la modification. Le nouveau plan, la nouvelle quantité et les nouveaux modules complémentaires sont utilisables immédiatement
- Comme rien n’est facturé sur le moment, une mise à niveau offre au client le plan supérieur gratuitement pendant le reste du cycle actuel. Une rétrogradation prend effet immédiatement, sans crédit pour la portion inutilisée du cycle déjà payée
- Les modules complémentaires accordés via
do_not_billne sont pas crédités lors d’une modification ultérieure du plan, car ils n’ont jamais été facturés. Une modification ultérieure facture intégralement la nouvelle quantité de modules complémentaires - Le plan mis à jour (ainsi que la quantité et les modules complémentaires) est facturé lors du prochain renouvellement planifié, et la date de facturation d’origine est conservée
Comportement
- Lorsque vous appelez cette API, Dodo Payments lance immédiatement une charge selon l’option de proratisation sélectionnée
- Avec
prorated_immediately, un crédit correspondant à la portion inutilisée du cycle actuel est calculé à chaque modification, qu’il s’agisse d’une mise à niveau ou d’une rétrogradation. Si ce crédit dépasse la charge du nouveau cycle, le solde est ajouté au crédit de l’abonnement. Ces crédits sont propres à cet abonnement et servent uniquement à compenser les futurs paiements récurrents du même abonnement - Avec
difference_immediately, le montant net correspond toujours exactement à la différence de prix. Pour les rétrogradations, l’excédent est enregistré comme crédit associé à l’abonnement, comme avecprorated_immediately - L’option
full_immediatelyignore les calculs de crédit et facture l’intégralité du nouveau plan - L’option
do_not_billapplique immédiatement la modification, mais reporte la facturation à la prochaine date de renouvellement, qui est conservée
Traitement de la charge
- La charge immédiate lancée lors de la modification du plan termine généralement son traitement en moins de 2 minutes
- Si cette charge immédiate échoue pour quelque raison que ce soit, l’abonnement est automatiquement suspendu jusqu’à la résolution du problème
Abonnements à la demande
Les abonnements à la demande vous permettent de facturer les clients de manière flexible, et non uniquement selon un calendrier fixe. Cette fonctionnalité est disponible pour tous les comptes.
subscription_data.on_demand dans le corps de votre requête. Cela vous permet d’autoriser un moyen de paiement sans effectuer de charge immédiate ou de définir un prix initial personnalisé.
Pour facturer un abonnement à la demande :
Pour les charges ultérieures, utilisez l’endpoint POST /subscriptions//charge et indiquez le montant à facturer au client pour cette transaction.
Pour consulter un guide complet, étape par étape (avec des exemples de requêtes/réponses, des politiques de nouvelle tentative sécurisées et la gestion des webhooks), consultez le On-Demand Subscriptions Guide.
Points clés à connaître sur la facturation des abonnements
Les essais créent une autorisation de $0, et non une charge. Lorsqu’un abonnement comprend une période d’essai, le début de l’essai crée une autorisation de mandat de $0 pour enregistrer la carte ; la première charge réelle intervient à la fin de l’essai. Dans la liste des paiements, un abonnement en essai gratuit affiche exactement un paiement avec
total_amount égal à 0. Un essai payant facture à l’avance son trial_amount.Cycle de vie de l’abonnement :
past_due = un renouvellement a échoué et la période de grâce est en cours (le client conserve l’accès). on_hold = un renouvellement a échoué (récupérable : demandez au client de mettre à jour son moyen de paiement ; les nouvelles tentatives de recouvrement s’appliquent). expired = la durée s’est terminée sans renouvellement et ne peut pas être réactivée. Le client doit se réabonner. cancelled = terminé par le client ou le marchand. La plupart des échecs de renouvellement sont des refus du côté de l’émetteur (fonds insuffisants, carte refusée), et non une erreur de Dodo.