Documentation Index
Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
Use this file to discover all available pages before exploring further.
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
- Inte angivet /
null— befintliga rabatter medpreserve_on_plan_change=truebehålls om de är tillämpliga på den nya produkten. [](tom array) — tar bort alla befintliga rabatter från prenumerationen.["CODE_A", "CODE_B", ...]— ersätter befintliga rabatter med denna stackade uppsättning.
discount_codes för nya integrationer. Detta fält fungerar fortfarande för bakåtkompatibilitet, men kan inte kombineras med discount_codes i samma begäran.immediately(standard): Tillämpa planändringen omedelbartnext_billing_date: Schemalägg ändringen till nästa faktureringsdatum. Kunden behåller sin nuvarande plan tills faktureringsperioden är slut.
next_billing_date för nedgraderingar så att kunderna behåller sina nuvarande planförmåner tills faktureringsperioden är slut.Handle Webhook Events
subscription.active: Planändringen lyckades, prenumerationen uppdateradsubscription.plan_changed: Prenumerationsplan ändrad (uppgradering/nedgradering/tilläggsuppdatering)subscription.on_hold: Avgift för planändring misslyckades, prenumeration pausadpayment.succeeded: Omedelbar avgift för planändring lyckadespayment.failed: Omedelbar avgift misslyckades
Update Your Application State
- Bevilja/revokera funktioner baserat på den nya planen
- Uppdatera kundens instrumentpanel med nya plandetaljer
- Skicka bekräftelsemail om planändringar
- Logga faktureringsändringar för revisionsändamål
Test and Monitor
- Testa alla proratlägen med olika scenarier
- Kontrollera att webhook-hanteringen fungerar korrekt
- Övervaka framgångsfrekvensen för planändringar
- Ställ in varningar för misslyckade planändringar
Förhandsgranska planändringar
Innan du genomför en planändring, använd Preview API för att visa kunderna exakt vad de kommer att debiteras:- Node.js SDK
- Python SDK
Change Plan API
Använd Change Plan API för att ändra produkt, kvantitet och proratbeteende för en aktiv prenumeration.Snabbstartsexempel
- Node.js SDK
- Python SDK
- Go SDK
- HTTP
invoice_id och payment_id returneras endast när en omedelbar avgift och/eller faktura skapas under planändringen. Lita alltid på webhook-händelser (t.ex. payment.succeeded, subscription.plan_changed) för att bekräfta resultat.Hantera tillägg
När du ändrar prenumerationsplaner kan du också ändra tillägg:Tillämpa rabattkoder
Du kan tillämpa en eller flera staplade rabattkoder när du ändrar prenumerationsplaner (max 20, tillämpas i arrayordning). Detta är användbart för att erbjuda kampanjprissättning vid uppgraderingar eller migrationer.- Node.js SDK
- Python SDK
- HTTP
Rabattbeteende vid planändring
discount_codes värde | Beteende |
|---|---|
Inte angivet / null | Befintliga rabatter med preserve_on_plan_change=true bevaras automatiskt om tillämpligt på den nya produkten. |
[] (tom array) | Alla befintliga rabatter tas bort från prenumerationen. |
["CODE_A", "CODE_B", ...] | Ersätter befintliga rabatter med denna staplade uppsättning, validerad och tillämpad i arrayordning. |
discount_code fältet på denna slutpunkt är föråldrat men fungerar fortfarande för bakåtkompatibilitet — befintliga integrationer behöver inte ändras omedelbart. Det kan inte kombineras med discount_codes i samma begäran. Migrera till arrayformen när det är lämpligt.Proratlägen
Välj hur du ska fakturera kunden när du ändrar planer:prorated_immediately
- Debiterar för den partiella skillnaden i den aktuella cykeln
- Om i provperioden, debiterar omedelbart och byter till den nya planen nu
- Nedgradering: kan generera en proraterad kredit som tillämpas på framtida förnyelser
full_immediately
- Debiterar omedelbart det fulla beloppet för den nya planen
- Ignorerar återstående tid från den gamla planen
difference_immediately är prenumerationsbegränsade och skiljer sig från kreditbaserade fakturering rättigheter. De tillämpas automatiskt på framtida förnyelser av samma prenumeration och är inte överförbara mellan prenumerationer.difference_immediately
- Uppgradering: debiterar omedelbart prisskillnaden mellan gamla och nya planer
- Nedgradering: lägger till återstående värde som intern kredit till prenumerationen och tillämpas automatiskt på förnyelser
do_not_bill
- Inga avgifter eller krediter beräknas
- Kunden byter till den nya planen omedelbart utan någon faktureringsjustering
- Faktureringscykeln förblir oförändrad
- Bäst för artighetsmigrationer, gratis planswitchar eller absorberande kostnadsskillnader
| Funktion | prorated_immediately | difference_immediately | full_immediately | do_not_bill |
|---|---|---|---|---|
| Uppgraderingsavgift | Proraterad skillnad för återstående dagar | Full prisskillnad mellan planer | Fullt nytt planpris | Ingen avgift |
| Nedgraderingskredit | Proraterad kredit för återstående dagar | Full prisskillnad som kredit | Ingen kredit | Ingen kredit |
| Faktureringscykel | Oförändrad | Oförändrad | Återställs till idag | Oförändrad |
| Provperiodsbeteende | Avslutar provperiod, debiterar omedelbart | Avslutar provperiod, debiterar omedelbart | Avslutar provperiod, debiterar fullt belopp | Avslutar provperiod, ingen avgift |
| Bäst för | Rättvis tidsbaserad fakturering | Enkelt uppgraderings-/nedgraderingsmatte | Återställning av faktureringscykler | Gratis migrationer eller artighetsswitchar |
| Komplexitet | Medium (dagberäkning) | Låg (enkel subtraktion) | Låg (full laddning) | Ingen |
Exempelscenarier
Använd dessa kanoniska nummer konsekvent:- Nuvarande plan: Basic på $30/månad
- Uppgraderingsmål: Pro på $80/månad
- Nedgraderingsmål (från Pro): Starter på $20/månad
- Faktureringscykel: 30 dagar, började den 1 januari
- Planändring sker den 16 januari (15 dagar kvar, 15 dagar använda)
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
Hur varje läge hanterar fakturering
Hantering av betalningsfel
Kontrollera vad som händer när en betalning vid planändring misslyckas med hjälp av parameternon_payment_failure.
Betalningsfellägen
- prevent_change (Recommended for critical upgrades)
- apply_change (Default)
- Planändringen markeras som “väntande”
- Kunden behåller tillgången till sin nuvarande plan
- Prenumerationen flyttas till
activetillstånd först efter lyckad betalning - Användbart när du vill säkerställa betalning innan du beviljar uppgraderade funktioner
on_payment_failure din affärsnivåstandardkonfiguration i instrumentpanelen.När man ska använda varje läge
| Scenario | Rekommenderat läge | Anledning |
|---|---|---|
| Uppgradering till premiumfunktioner | prevent_change | Säkerställ betalning innan tillträde beviljas |
| Kvantitetsökning (fler platser) | prevent_change | Förhindra användning utan betalning |
| Nedgradering av planer | apply_change | Kunden minskar utgifter |
| Tillförlitliga företagskunder | apply_change | Lägre risk för utebliven betalning |
| Konvertering från provperiod till betald | prevent_change | Kritisk betalningsögonblick |
Hantera webbhooks
Spåra prenumerationstillstånd genom webbhooks för att bekräfta planändringar och betalningar.Händelsetyper att hantera
subscription.active: prenumeration aktiveradsubscription.plan_changed: prenumerationsplan ändrad (uppgradering/nedgradering/tilläggsändringar)subscription.on_hold: avgift misslyckades, prenumeration pausadsubscription.renewed: förnyelse lyckadespayment.succeeded: betalning för planändring eller förnyelse lyckadespayment.failed: betalning misslyckades
Verifiera signaturer och hantera avsikter
- Next.js Route Handler
- Express.js
Bästa praxis
Följ dessa rekommendationer för pålitliga prenumerationsplanändringar:Planändringsstrategi
- Testa noggrant: Testa alltid planändringar i testläge innan produktionen
- Välj prorat noggrant: Välj det proratläge som stämmer överens med din affärsmodell
- Hantera fel elegant: Implementera korrekt felhantering och återförsökslogik
- Övervaka framgångsrater: Spåra lyckandefel frekvenser för planändringar och undersök problem
Webhook-implementering
- Verifiera signaturer: Validera alltid webhook-signaturer för att säkerställa äkthet
- Implementera idempotens: Hantera dubblettposter av webhook-händelser elegant
- Bearbeta asynkront: Blockera inte webhook-svar med tunga operationer
- Logga allt: Håll detaljerade loggar för felsökning och revisionsändamål
Användarupplevelse
- Kommunicera tydligt: Informera kunder om faktureringsändringar och tidsramar
- Ge bekräftelser: Skicka e-postbekräftelser för lyckade planändringar
- Hantera undantagsfall: Överväg provperioder, prorationer och misslyckade betalningar
- Uppdatera UI omedelbart: Återspegla planändringar i din applikationsgränssnitt
Vanliga problem och lösningar
Lös typiska problem som uppstår under prenumerationsplanändringar:Charge created but subscription not updated
Charge created but subscription not updated
- Webhook-behandling misslyckades eller försenades
- Applikationstillståndet uppdaterades inte efter att webbhooks mottagits
- Databastransaktionsproblem under tillståndsändringen
- Implementera robust webhook-hantering med återförsökslogik
- Använd idempotenta operationer för tillståndsändringar
- Lägg till övervakning för att upptäcka och varna om missade webhook-händelser
- Kontrollera att webhook-slutpunkten är tillgänglig och svarar korrekt
Credits not applied after downgrade
Credits not applied after downgrade
- Förväntningar om proratläge: nedgraderingar krediterar hela plannivåskillnaden med
difference_immediately, medanprorated_immediatelyskapar en proraterad kredit baserat på återstående tid i cykeln - Krediter är prenumerationsspecifika och överförs inte mellan prenumerationer
- Kreditbalans visas inte i kundens instrumentpanel
- Använd
difference_immediatelyför nedgraderingar när du vill ha automatiska krediter - Förklara för kunderna att krediter tillämpas på framtida förnyelser av samma prenumeration
- Implementera kundportal för att visa kreditbalanser
- Kontrollera nästa fakturaförhandsgranskning för att se tillämpade krediter
Webhook signature verification fails
Webhook signature verification fails
- Felaktig webhook-hemlig nyckel
- Obearbetad begäran kropp ändrad innan signaturverifiering
- Fel verifieringsalgoritm för signatur
- Kontrollera att du använder korrekt
DODO_WEBHOOK_SECRETfrån instrumentpanelen - Läs obearbetad begäran kropp innan någon JSON-parsing middleware
- Använd standard webhook-verifieringsbiblioteket för din plattform
- Testa webhook-signaturverifiering i utvecklingsmiljö
Plan change fails with 422 error
Plan change fails with 422 error
- Ogiltigt prenumerations-ID eller produkt-ID
- Prenumerationen är inte i aktivt tillstånd
- Saknade nödvändiga parametrar
- Produkten är inte tillgänglig för planändringar
- Kontrollera att prenumerationen existerar och är aktiv
- Kontrollera att produkt-ID är giltigt och tillgängligt
- Säkerställ att alla nödvändiga parametrar är med
- Granska API-dokumentationen för parameterkrav
Immediate charge fails during plan change
Immediate charge fails during plan change
- Otillräckliga medel på kundens betalningsmetod
- Betalningsmetoden har gått ut eller är ogiltig
- Banken avvisade transaktionen
- Bedrägeridetektion blockerade avgiften
- Hantera
payment.failedwebhook-händelser på lämpligt sätt - Meddela kunden att uppdatera betalningsmetoden
- Implementera återförsökslogik för tillfälliga fel
- Överväg att tillåta planändringar med misslyckade omedelbara avgifter
Subscription on hold after plan change
Subscription on hold after plan change
on_hold tillståndVad som händer:
När en planändringsavgift misslyckas placeras prenumerationen automatiskt i on_hold tillstånd. Prenumerationen kommer inte att förnyas automatiskt förrän betalningsmetoden uppdateras.Lösning: Uppdatera betalningsmetoden för att återaktivera prenumerationenFör att återaktivera en prenumeration från on_hold tillstånd efter en misslyckad planändring:- Uppdatera betalningsmetoden med hjälp av Update Payment Method API
- Automatisk avgifts skapande: API:n skapar automatiskt en avgift för återstående skulder
- Fakturagenerering: En faktura genereras för avgiften
- Betalningsbearbetning: Betalningen behandlas med den nya betalningsmetoden
- Återaktivering: Vid lyckad betalning återaktiveras prenumerationen till
activetillstånd
subscription.on_hold: Prenumeration placerad i vänteläge (mottagen när planändringsavgift misslyckas)payment.succeeded: Betalning för återstående skulder lyckades (efter uppdatering av betalningsmetoden)subscription.active: Prenumeration återaktiverad efter lyckad betalning
- Informera kunder omedelbart när en planändringsavgift misslyckas
- Ge tydliga instruktioner om hur de ska uppdatera sin betalningsmetod
- Övervaka webhook-händelser för att spåra återaktiveringens status
- Överväg att implementera automatisk återförsökslogik vid tillfälliga betalningsfel
Update Payment Method API Reference
Testa din implementation
Följ dessa steg för att noggrant testa din prenumerationsplanändringsimplementering:Set up test environment
- Använd test-API-nycklar och testprodukter
- Skapa testprenumerationer med olika plantyper
- Konfigurera test-webhook-slutpunkt
- Ställ in övervakning och loggning
Test different proration modes
- Testa
prorated_immediatelymed olika faktureringscykelpositioner - Testa
difference_immediatelyför uppgraderingar och nedgraderingar - Testa
full_immediatelyför att återställa faktureringscykler - Testa
do_not_billför inga avgifter/inga krediter vid planswitchar - Kontrollera att kreditberäkningarna är korrekta
Test webhook handling
- Kontrollera att alla relevanta webhook-händelser tas emot
- Testa webhook-signaturverifiering
- Hantera dubbletter av webhook-händelser elegant
- Testa felscenarier vid webhook-behandling
Test error scenarios
- Testa med ogiltiga prenumerations-ID
- Testa med utgångna betalningsmetoder
- Testa nätverksfel och timeout-fel
- Testa med otillräckliga medel
Felhantering
Hantera vanliga API-fel elegant i din implementation:HTTP Statuskoder
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
Felresponsformat
Nästa steg
- Granska Change Plan API
- Utforska Kreditbaserad fakturering
- Implementera varningar för
subscription.on_hold - Kolla in vår Webhook-integration Guide