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
preserve_on_plan_change=true, verrà mantenuto lo sconto esistente (se applicabile al nuovo prodotto).immediately(predefinito): Applica immediatamente la modifica del pianonext_billing_date: Programma la modifica per la prossima data di fatturazione. Il cliente mantiene il piano corrente fino al termine del periodo di fatturazione.
next_billing_date per il downgrade in modo che i clienti mantengano i benefici del piano corrente fino alla fine del periodo di fatturazione.Handle Webhook Events
subscription.active: Modifica del piano riuscita, abbonamento aggiornatosubscription.plan_changed: Piano dell’abbonamento modificato (upgrade/downgrade/aggiornamento addon)subscription.on_hold: Addebito per la modifica del piano fallito, abbonamento sospesopayment.succeeded: Addebito immediato per la modifica del piano riuscitopayment.failed: Addebito immediato fallito
Update Your Application State
- Concedi/revoca funzionalità in base al nuovo piano
- Aggiorna il dashboard cliente con i dettagli del nuovo piano
- Invia email di conferma sui cambiamenti di piano
- Registra le modifiche di fatturazione per scopi di audit
Test and Monitor
- Testa tutte le modalità di proration con scenari diversi
- Verifica che la gestione dei webhook funzioni correttamente
- Monitora i tassi di successo delle modifiche di piano
- Imposta avvisi per le modifiche di piano fallite
Anteprima delle modifiche del piano
Prima di confermare una modifica del piano, utilizza l’API di Anteprima per mostrare ai clienti esattamente quanto verranno addebitati:- Node.js SDK
- Python SDK
Cambio Piano API
Utilizza l’API di Cambio Piano per modificare prodotto, quantità e comportamento di proration per un abbonamento attivo.Esempi di avvio rapido
- Node.js SDK
- Python SDK
- Go SDK
- HTTP
invoice_id e payment_id vengono restituiti solo quando viene creato un addebito immediato e/o una fattura durante il cambio di piano. Affidati sempre agli eventi webhook (e.g., payment.succeeded, subscription.plan_changed) per confermare i risultati.Gestione degli Addon
Quando si cambiano i piani di abbonamento, è possibile anche modificare gli addon:Applicazione dei Codici Sconto
È possibile applicare un codice sconto quando si cambiano i piani di abbonamento. Questo è utile per offrire prezzi promozionali su upgrade o migrazioni.- Node.js SDK
- Python SDK
- HTTP
Comportamento degli sconti nel cambio piano
| Scenari | Comportamento |
|---|---|
discount_code fornito | Valida e applica lo sconto al nuovo piano. |
Nessun codice fornito, sconto esistente con preserve_on_plan_change=true | Lo sconto esistente viene automaticamente mantenuto se applicabile al nuovo prodotto. |
| Nessun codice fornito, nessuno sconto conservabile | Nessuno sconto applicato al nuovo piano. |
Modalità di proration
Scegli come addebitare il cliente quando cambi piani:prorated_immediately
- Addebiti per la differenza parziale nel ciclo attuale
- Se in prova, addebiti immediati e passa subito al nuovo piano
- Downgrade: può generare un credito proporzionale applicato ai futuri rinnovi
full_immediately
- Addebita l’intero importo del nuovo piano immediatamente
- Ignora il tempo rimanente del vecchio piano
difference_immediately sono legati all’abbonamento e distinti dai diritti di Fatturazione Basata su Crediti. Si applicano automaticamente ai futuri rinnovi dello stesso abbonamento e non sono trasferibili tra abbonamenti.difference_immediately
- Upgrade: addebita immediatamente la differenza di prezzo tra vecchio e nuovo piano
- Downgrade: aggiunge il valore restante come credito interno all’abbonamento e lo applica automaticamente ai rinnovi
do_not_bill
- Nessun addebito o accredito calcolato
- Il cliente passa immediatamente al nuovo piano senza alcun adeguamento di fatturazione
- Il ciclo di fatturazione rimane invariato
- Ideale per migrazioni di cortesia, passaggi a piani gratuiti o per assorbire differenze di costo
| Caratteristica | prorated_immediately | difference_immediately | full_immediately | do_not_bill |
|---|---|---|---|---|
| Addebito Upgrade | Differenza proporzionale per i giorni rimanenti | Intera differenza di prezzo tra i piani | Prezzo intero del nuovo piano | Nessun addebito |
| Credito Downgrade | Credito proporzionale per i giorni rimanenti | Intera differenza di prezzo come credito | Nessun credito | Nessun credito |
| Ciclo di Fatturazione | Invariato | Invariato | Si resetta a oggi | Invariato |
| Comportamento del Periodo di Prova | Termina prova, addebita immediatamente | Termina prova, addebita immediatamente | Termina prova, addebita l’intero importo | Termina prova, nessun addebito |
| Ideale per | Fatturazione basata sul tempo | Calcoli semplici di upgrade/downgrade | Resettare i cicli di fatturazione | Migrazioni gratuite o passaggi di cortesia |
| Complessità | Media (calcolo su base giornaliera) | Bassa (sottrazione semplice) | Bassa (addebito intero) | Nessuna |
Esempi di casi
Usa questi numeri canonici in modo coerente:- Piano attuale: Basic a 30$/mese
- Obiettivo upgrade: Pro a 80$/mese
- Obiettivo downgrade (da Pro): Starter a 20$/mese
- Ciclo di fatturazione: 30 giorni, iniziato il 1 gennaio
- Cambio di piano avviene il 16 gennaio (15 giorni rimanenti, 15 giorni utilizzati)
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
Come ogni modalità elabora la fatturazione
Gestione dei fallimenti di pagamento
Controlla cosa succede quando un pagamento per la modifica del piano fallisce usando il parametroon_payment_failure.
Modalità di fallimento del pagamento
- prevent_change (Recommended for critical upgrades)
- apply_change (Default)
- La modifica del piano è segnata come “in attesa”
- Il cliente mantiene l’accesso al suo piano attuale
- L’abbonamento passa allo stato
activesolo dopo il pagamento riuscito - Utile quando si vuole garantire il pagamento prima di concedere funzionalità avanzate
on_payment_failure utilizza l’impostazione predefinita a livello aziendale configurata nel dashboard.Quando utilizzare ogni modalità
| Scenario | Modalità consigliata | Motivo |
|---|---|---|
| Upgrade a funzionalità premium | prevent_change | Garantire il pagamento prima di concedere l’accesso |
| Aumento quantità (più posti) | prevent_change | Prevenire l’uso senza pagamento |
| Piani di downgrade | apply_change | Il cliente sta riducendo la spesa |
| Clienti aziendali affidabili | apply_change | Rischio più basso di mancato pagamento |
| Conversione da prova a pagamento | prevent_change | Momento critico per il pagamento |
Gestione dei webhook
Monitora lo stato delle sottoscrizioni tramite webhook per confermare le modifiche di piano e i pagamenti.Tipi di evento da gestire
subscription.active: abbonamento attivatosubscription.plan_changed: piano di abbonamento modificato (upgrade/downgrade/modifiche addon)subscription.on_hold: addebito fallito, abbonamento sospesosubscription.renewed: rinnovo riuscitopayment.succeeded: pagamento per modifica piano o rinnovo riuscitopayment.failed: pagamento fallito
Verifica delle firme e gestione delle intenzioni
- Next.js Route Handler
- Express.js
Migliori pratiche
Segui queste raccomandazioni per cambiamenti affidabili nei piani di abbonamento:Strategia di cambio piano
- Testa a fondo: Testa sempre i cambiamenti di piano in modalità test prima della produzione
- Scegli attentamente la proration: Seleziona la modalità di proration che si allinea con il tuo modello di business
- Gestisci i fallimenti correttamente: Implementa una corretta gestione degli errori e una logica di ritentativo
- Monitora i tassi di successo: Monitora i tassi di successo/fallimento delle modifiche di piano e indaga sui problemi
Implementazione dei webhook
- Verifica le firme: Valida sempre le firme dei webhook per garantire l’autenticità
- Implementa l’idempotenza: Gestisci in modo indolore eventi webhook duplicati
- Elabora in modo asincrono: Non bloccare le risposte ai webhook con operazioni pesanti
- Registra tutto: Mantieni un log dettagliato per il debug e gli scopi di audit
Esperienza utente
- Comunica chiaramente: Informa i clienti sui cambiamenti di fatturazione e tempi
- Fornisci conferme: Invia conferme via email per le modifiche di piano riuscite
- Gestisci i casi di confine: Considera i periodi di prova, le proration e i pagamenti falliti
- Aggiorna l’interfaccia utente immediatamente: Rifletti i cambiamenti di piano nell’interfaccia della tua applicazione
Problemi comuni e soluzioni
Risolvere i problemi tipici incontrati durante i cambiamenti nei piani di abbonamento:Charge created but subscription not updated
Charge created but subscription not updated
- Elaborazione dei webhook fallita o ritardata
- Stato dell’applicazione non aggiornato dopo aver ricevuto i webhook
- Problemi nelle transazioni del database durante l’aggiornamento dello stato
- Implementa una gestione robusta dei webhook con una logica di ritentativo
- Usa operazioni idempotenti per aggiornamenti di stato
- Aggiungi monitoraggio per rilevare e avvisare su eventi webhook mancati
- Verifica che l’endpoint del webhook sia accessibile e risponda correttamente
Credits not applied after downgrade
Credits not applied after downgrade
- Aspettative della modalità di proration: i downgrade accreditano la differenza di prezzo completo con
difference_immediately, mentreprorated_immediatelycrea un credito proporzionale basato sul tempo restante nel ciclo - I crediti sono specifici per l’abbonamento e non trasferibili tra abbonamenti
- Il saldo del credito non è visibile nel dashboard del cliente
- Usa
difference_immediatelyper i downgrade quando vuoi crediti automatici - Spiega ai clienti che i crediti si applicano ai futuri rinnovi dello stesso abbonamento
- Implementa un portale clienti per mostrare i saldi dei crediti
- Controlla l’anteprima della prossima fattura per vedere i crediti applicati
Webhook signature verification fails
Webhook signature verification fails
- Chiave segreta del webhook non corretta
- Corpo della richiesta raw modificato prima della verifica della firma
- Algoritmo di verifica della firma errato
- Verifica di utilizzare il corretto
DODO_WEBHOOK_SECRETdal dashboard - Leggi il corpo della richiesta raw prima di qualsiasi middleware di parsing JSON
- Usa la libreria di verifica dei webhook standard per la tua piattaforma
- Testa la verifica della firma dei webhook in un ambiente di sviluppo
Plan change fails with 422 error
Plan change fails with 422 error
- ID dell’abbonamento o ID del prodotto non valido
- Abbonamento non in stato attivo
- Parametri richiesti mancanti
- Prodotto non disponibile per cambiamenti di piano
- Verifica che l’abbonamento esista ed è attivo
- Controlla che l’ID del prodotto sia valido e disponibile
- Assicurati che tutti i parametri richiesti siano forniti
- Rivedi la documentazione API per i requisiti dei parametri
Immediate charge fails during plan change
Immediate charge fails during plan change
- Fondi insufficienti sul metodo di pagamento del cliente
- Metodo di pagamento scaduto o non valido
- La banca ha rifiutato la transazione
- Il rilevamento delle frodi ha bloccato l’addebito
- Gestisci gli eventi webhook
payment.failedin modo appropriato - Notifica al cliente di aggiornare il metodo di pagamento
- Implementa una logica di ritentativo per i fallimenti temporanei
- Considera la possibilità di consentire modifiche di piano con addebiti immediati falliti
Subscription on hold after plan change
Subscription on hold after plan change
on_holdCosa succede:
Quando l’addebito per la modifica del piano fallisce, l’abbonamento viene automaticamente posto nello stato on_hold. L’abbonamento non si rinnoverà automaticamente fino a quando il metodo di pagamento non viene aggiornato.Soluzione: Aggiorna il metodo di pagamento per riattivare l’abbonamentoPer riattivare un abbonamento dallo stato on_hold dopo un fallimento della modifica del piano:- Aggiorna il metodo di pagamento usando l’API di Aggiornamento Metodo di Pagamento
- Creazione automatica addebito: L’API crea automaticamente un addebito per i saldi rimanenti
- Generazione fattura: Una fattura viene generata per l’addebito
- Elaborazione del pagamento: Il pagamento viene elaborato utilizzando il nuovo metodo di pagamento
- Riattivazione: Al successo del pagamento, l’abbonamento viene riattivato allo stato
active
subscription.on_hold: Abbonamento messo in sospeso (ricevuto quando l’addebito per la modifica del piano fallisce)payment.succeeded: Pagamento per i saldi rimanenti riuscito (dopo aver aggiornato il metodo di pagamento)subscription.active: Abbonamento riattivato dopo il pagamento riuscito
- Notifica immediatamente i clienti quando un addebito per modifica piano fallisce
- Fornisci istruzioni chiare su come aggiornare il loro metodo di pagamento
- Monitora gli eventi webhook per tracciare lo stato di riattivazione
- Considera l’implementazione di una logica di ritentativo automatico per fallimenti di pagamento temporanei
Update Payment Method API Reference
Test della tua implementazione
Segui questi passaggi per testare a fondo la tua implementazione di cambio piano di abbonamento:Set up test environment
- Usa chiavi API di test e prodotti di test
- Crea abbonamenti di test con diversi tipi di piano
- Configura l’endpoint del webhook di test
- Imposta monitoraggio e logging
Test different proration modes
- Testa
prorated_immediatelycon varie posizioni del ciclo di fatturazione - Testa
difference_immediatelyper upgrade e downgrade - Testa
full_immediatelyper resettare i cicli di fatturazione - Testa
do_not_billper passaggi di piano senza addebito/credito - Verifica che i calcoli dei crediti siano corretti
Test webhook handling
- Verifica che tutti gli eventi webhook pertinenti siano ricevuti
- Testa la verifica della firma del webhook
- Gestisci in modo indolore eventi webhook duplicati
- Testa scenari di fallimento dell’elaborazione dei webhook
Test error scenarios
- Testa con ID abbonamento non validi
- Testa con metodi di pagamento scaduti
- Testa fallimenti di rete e timeout
- Testa con fondi insufficienti
Gestione degli errori
Gestisci in modo indolore gli errori comuni dell’API nella tua implementazione:Codici di stato 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 della risposta di errore
Prossimi passi
- Rivedi l’API di Cambio Piano
- Esplora la Fatturazione Basata su Crediti
- Implementa avvisi per
subscription.on_hold - Consulta la nostra Guida all’Integrazione dei Webhook