Vai al contenuto principale

Change Plan API

Full API docs for updating subscriptions.

Plan Change Preview

See charge amounts before changing plans.

Integration Guide

Step-by-step subscription setup.

What Is a Subscription Upgrade or Downgrade?

Change a customer’s subscription plan to move them between tiers, adjust quantity for seat-based products, or migrate to a new product. The API automatically calculates prorations and charges based on your chosen billing mode.
Plan changes can trigger an immediate charge depending on the proration mode you choose.

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
For detailed setup instructions, see the Integration Guide.

Step-by-Step Implementation Guide

Follow this comprehensive guide to implement subscription plan changes in your application:
1

Understand Plan Change Requirements

Before implementing, determine:
  • 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
Test plan changes thoroughly in test mode before implementing in production.
2

Choose Your Proration Strategy

Select the billing approach that aligns with your business needs:
Best for: SaaS applications that want to credit unused time on the old plan.
  • Credits the unused portion of the current cycle, prorated by time remaining
  • Then charges a full cycle at the new plan — the new plan price is never prorated
  • Net charge = full new cycle − (remaining fraction × full old cycle)
3

Implement the Change Plan API

Use the Change Plan API to modify subscription details:
string
obbligatorio
The ID of the active subscription to modify.
string
obbligatorio
Il nuovo ID prodotto a cui cambiare l’abbonamento.
integer
obbligatorio
Numero di unità per il nuovo piano (per prodotti basati sui posti).
string
obbligatorio
Come gestire la fatturazione immediata: prorated_immediately, full_immediately, difference_immediately o do_not_bill.
array
Componenti aggiuntivi facoltativi per il nuovo piano. Omettere questo campo, inviare null o inviare un array vuoto rimuove tutti i componenti aggiuntivi esistenti; includi quindi i componenti aggiuntivi attuali per mantenerli.
string
Controlla il comportamento quando il pagamento della modifica del piano non va a buon fine:
  • prevent_change: Mantieni l’abbonamento sul piano attuale finché il pagamento non va a buon fine
  • apply_change (predefinito): Applica immediatamente la modifica del piano indipendentemente dall’esito del pagamento
If not specified, uses the business-level default setting.
Raccogli l’importo della modifica del piano con un link di pagamento invece di addebitare il metodo di pagamento salvato dell’abbonamento. Il cliente paga su una pagina di checkout ospitata.Requires the business’s allow_plan_change_via_payment_link capability (Settings → Subscriptions → Collect Plan Change Payments by Payment Link), effective_at: immediately, and on_payment_failure: prevent_change. See Collecting Payment via a Checkout Link. Ignored by the preview route.
string
L’URL che riceve il cliente dopo aver pagato il link di pagamento. Il reindirizzamento aggiunge subscription_id, payment_id e status. Richiede collect_via_payment_link: true; in caso contrario, la richiesta fallisce con 422. Consulta Reindirizzamento del cliente dopo il pagamento.
Annulla il link di pagamento non pagato di una modifica del piano in sospeso, in modo che questa richiesta lo sostituisca. Un pagamento già effettuato o in corso restituisce 409. Consulta Sostituzione di un link di pagamento in sospeso. Ignorato dalla route di anteprima.
array
Codici sconto stacked facoltativi da applicare al nuovo piano (massimo 20, applicati nell’ordine dell’array). Il comportamento dipende da ciò che passi:
  • Non fornito / null — gli sconti esistenti con preserve_on_plan_change=true vengono mantenuti, se applicabili al nuovo prodotto.
  • [] (array vuoto) — rimuove tutti gli sconti esistenti dall’abbonamento.
  • ["CODE_A", "CODE_B", ...] — sostituisce gli sconti esistenti con questo set stacked.
string
deprecato
Deprecato — per le nuove integrazioni, preferisci discount_codes. Questo campo continua a funzionare per la compatibilità con le versioni precedenti, ma non può essere combinato con discount_codes nella stessa richiesta.
string
predefinito:"immediately"
Quando applicare la modifica del piano:
  • immediately (predefinito): Applica subito la modifica del piano
  • next_billing_date: Pianifica la modifica per la prossima data di fatturazione. Il cliente mantiene il piano attuale fino alla fine del periodo di fatturazione. Usalo per i downgrade, così i clienti mantengono i vantaggi del piano attuale fino alla fine del periodo di fatturazione.
4

Handle Webhook Events

Configura la gestione dei webhook per monitorare gli esiti delle modifiche del piano:
  • subscription.active: Modifica del piano completata, abbonamento aggiornato
  • subscription.plan_changed: Piano dell’abbonamento modificato (upgrade/downgrade/aggiornamento dell’addon)
  • subscription.on_hold: Addebito della modifica del piano non riuscito, rinnovi interrotti
  • payment.succeeded: Addebito immediato della modifica del piano completato
  • payment.failed: Addebito immediato non riuscito
Verifica sempre le firme dei webhook e implementa l’elaborazione idempotente degli eventi.
5

Update Your Application State

In base agli eventi webhook, aggiorna la tua applicazione:
  • Concedi/revoca le funzionalità in base al nuovo piano
  • Aggiorna il dashboard del cliente con i dettagli del nuovo piano
  • Invia email di conferma sulle modifiche del piano
  • Registra le modifiche di fatturazione per scopi di audit
6

Test and Monitor

Testa accuratamente la tua implementazione:
  • Testa tutte le modalità di prorazione con scenari diversi
  • Verifica che la gestione dei webhook funzioni correttamente
  • Monitora i tassi di successo delle modifiche del piano
  • Configura avvisi per le modifiche del piano non riuscite
L’implementazione della modifica del piano dell’abbonamento è ora pronta per l’uso in produzione.

Anteprima delle modifiche del piano

Prima di confermare una modifica del piano, usa l’API Preview per mostrare ai clienti esattamente quanto verrà loro addebitato:
Usa l’API Preview per creare finestre di conferma che mostrino ai clienti l’importo esatto che verrà loro addebitato prima che confermino una modifica del piano.
In immediate_charge.summary, customer_credits è la variazione netta del saldo crediti del cliente, nella valuta indicata da customer_credits_currency. Questa è la valuta del portafoglio crediti del cliente, che corrisponde alla valuta dell’abbonamento. Può differire da currency del riepilogo, che si applica a total_amount e tax. Ad esempio, un cliente che paga in INR per un abbonamento in USD visualizza i crediti in USD.

API Change Plan

Usa l’API Change Plan per modificare prodotto, quantità e comportamento della prorazione per un abbonamento attivo.

Esempi rapidi

Una modifica del piano completata restituisce immediatamente 200 OK — prima che qualsiasi addebito sia stato effettivamente regolato. Il contenuto del body (ChangePlanResponse) dipende dal metodo di riscossione della modifica:
Questa risposta conferma che la richiesta è stata accettata, non che un addebito sia andato a buon fine. Per un addebito immediato ordinario, l’esito viene determinato off-session subito dopo la chiamata. Per una richiesta collect_via_payment_link, l’abbonamento rimane sul piano attuale finché il cliente non completa il pagamento.Conferma l’esito tramite webhook (payment.succeeded, payment.failed, subscription.plan_changed) oppure rileggi l’abbonamento con GET /subscriptions/{subscription_id} — per il caso del link di pagamento, consulta Cosa succede mentre il link non è pagato.
Se l’addebito immediato non va a buon fine, l’abbonamento può passare allo stato subscription.on_hold finché il pagamento non viene completato.
Per impostazione predefinita, una modifica immediata del piano addebita direttamente il metodo di pagamento salvato dell’abbonamento. Imposta collect_via_payment_link: true per inviare il cliente a una pagina di checkout ospitata, utile quando non esiste un metodo di pagamento salvato o vuoi che il cliente confermi attivamente il nuovo prezzo.
Questa opzione abilita l’interruttore Raccogli i pagamenti delle modifiche del piano tramite link di pagamento in Impostazioni → Abbonamenti, che instrada il flusso di modifica del piano del Customer Portal attraverso il checkout.

Requisiti

collect_via_payment_link: true ha esito positivo solo quando sono soddisfatte tutte le condizioni seguenti; in caso contrario, la richiesta fallisce con 422:
  • L’azienda ha abilitata la funzionalità allow_plan_change_via_payment_link (Impostazioni → Abbonamenti → Raccogli i pagamenti delle modifiche del piano tramite link di pagamento).
  • effective_at è immediately (il valore predefinito). Una modifica pianificata (next_billing_date) non richiede mai una pagina di checkout.
  • La richiesta imposta on_payment_failure: prevent_change. Un apply_change esplicito fallisce con 422.
collect_via_payment_link si applica a qualsiasi modifica immediata che comporti un addebito, inclusi i downgrade, purché siano soddisfatti i requisiti precedenti.
Se la modifica produce un totale pari a zero o un credito, non viene emesso alcun link di pagamento: payment_link e gli altri campi del checkout restituiscono null e la modifica viene applicata immediatamente. Questo non è un 422. Chiama prima Preview Plan Change per verificare l’importo prima di richiedere un link.
Una richiesta completata restituisce i riferimenti al checkout:
  • L’abbonamento rimane sul piano attuale: product_id, recurring_pre_tax_amount e next_billing_date rimangono tutti invariati finché il link non viene pagato.
  • Un’ulteriore richiesta change-plan viene rifiutata con 409 PendingPlanChangeExists mentre il link è in sospeso. Per sostituire la modifica in sospeso, invia la nuova richiesta con cancel_older_payment_link: true. Consulta Sostituzione di un link di pagamento in sospeso.
  • Per riprovare dopo un pagamento rifiutato, chiama nuovamente change-plan per ottenere un nuovo link.
  • Se il link non viene mai pagato, smette di funzionare dopo expires_on; l’abbonamento diventa automaticamente disponibile per accettare una nuova richiesta di modifica del piano poco dopo.
  • Se esisteva già una modifica pianificata e la sostituisci con cancel_scheduled_change_plan: true, la pianificazione originale rimane attiva mentre il link non è pagato e viene annullata solo dopo il pagamento del link, nella stessa transazione che applica il nuovo piano.
Dopo l’emissione di una modifica immediata tramite link di pagamento, ogni ulteriore richiesta di modifica del piano per quell’abbonamento, inclusa l’anteprima senza effetti collaterali, viene bloccata finché il link non viene risolto. Una richiesta change-plan può sostituire il link impostando cancel_older_payment_link: true. L’anteprima ignora questo campo, quindi rimane bloccata.

Reindirizzamento del cliente dopo il pagamento

Imposta return_url per rimandare il cliente al tuo sito dopo il pagamento del link:
Dopo il checkout, il cliente viene indirizzato a return_url con questi parametri di query: Quando il pagamento non va a buon fine, l’abbonamento rimane attivo sul piano attuale. Il nuovo piano può essere applicato poco dopo il reindirizzamento, quando arriva il webhook del pagamento; quindi rileggi l’abbonamento prima di mostrare il nuovo piano. return_url richiede collect_via_payment_link: true. Senza di esso, la richiesta fallisce con 422. Se il cliente abbandona il checkout senza pagare, imposta cancel_older_payment_link: true nella richiesta change-plan successiva. Dodo Payments annulla il link non pagato e la nuova modifica del piano sostituisce quella in sospeso. Il link annullato non accetta più pagamenti, nemmeno in una pagina di checkout già aperta.
La richiesta viene convalidata prima dell’annullamento del link, quindi una richiesta non valida mantiene il link del cliente. Il link viene annullato solo se il cliente non ha iniziato a pagare: Ogni richiesta change-plan emette la propria fattura. La modifica del piano sostituita e la relativa fattura vengono annullate. Se non è in sospeso alcuna modifica del piano, cancel_older_payment_link non ha effetto.
Un controllo eseguito dopo la convalida, ad esempio l’importo minimo dell’addebito, può ancora non riuscire dopo l’annullamento del link. L’abbonamento rimane quindi sul piano attuale senza alcun link aperto. Invia nuovamente la richiesta per emettere un nuovo link.

Gestione degli addon

Quando modifichi i piani degli abbonamenti, puoi modificare anche gli addon:
Gli addon sono inclusi nel calcolo della prorazione e vengono addebitati in base alla modalità di prorazione selezionata.

Applicazione dei codici sconto

Applica uno o più codici sconto stacked durante la modifica dei piani degli abbonamenti (massimo 20, applicati nell’ordine dell’array):

Comportamento degli sconti durante la modifica del piano

Il campo singolare discount_code di questo endpoint è deprecato, ma continua a funzionare per la compatibilità con le versioni precedenti; le integrazioni esistenti non devono essere modificate immediatamente. Non può essere combinato con discount_codes nella stessa richiesta. Esegui la migrazione al formato array quando è opportuno.
Usa la Preview Plan Change API con discount_codes per mostrare ai clienti esattamente quanto risparmieranno prima di confermare la modifica del piano.

Modalità di prorazione

Scegli come addebitare il cliente quando modifichi il piano:

prorated_immediately

  • Accredita la parte inutilizzata del ciclo attuale — piano base, quantità e addon — calcolata proporzionalmente al tempo rimanente
  • Quindi addebita un ciclo completo del nuovo piano, della nuova quantità e dei nuovi addon. L’addebito non viene mai calcolato proporzionalmente
  • Addebito immediato netto = (nuovo ciclo completo) − (frazione rimanente × vecchio ciclo completo)
  • Se il credito supera l’addebito del nuovo ciclo (caso comune nei downgrade), la differenza viene mantenuta come credito associato all’abbonamento per i rinnovi futuri
  • Se l’abbonamento è in prova, addebita immediatamente e passa ora al nuovo piano

full_immediately

  • Addebita immediatamente l’intero importo del nuovo piano
  • Ignora il tempo rimanente del vecchio piano: nessun credito per il ciclo attuale
I crediti creati da prorated_immediately e dai downgrade che usano difference_immediately sono associati all’abbonamento e distinti dalle disponibilità di Credit-Based Billing. Vengono applicati automaticamente ai rinnovi futuri dello stesso abbonamento e non sono trasferibili tra abbonamenti.

difference_immediately

  • Upgrade: addebita immediatamente la differenza di prezzo tra il vecchio e il nuovo piano
  • Downgrade: aggiunge il valore rimanente come credito interno all’abbonamento e lo applica automaticamente ai rinnovi

do_not_bill

  • Non vengono calcolati addebiti o crediti
  • Il cliente passa immediatamente al nuovo piano senza alcun adeguamento di fatturazione
  • Il ciclo di fatturazione rimane invariato
  • Ideale per migrazioni per cortesia, passaggi a piani gratuiti o per assorbire differenze di costo

Scenari di esempio

Usa sempre questi numeri canonici:
  • Piano attuale: Basic a $30/mese
  • Destinazione dell’upgrade: Pro a $80/mese
  • Destinazione del downgrade (da Pro): Starter a $20/mese
  • Ciclo di fatturazione: 30 giorni, iniziato il 1 gennaio
  • La modifica del piano avviene il 16 gennaio (15 giorni rimanenti, 15 giorni utilizzati)

Come ogni modalità elabora la fatturazione

Scegli prorated_immediately per accreditare il tempo inutilizzato del vecchio piano addebitando un ciclo completo del nuovo; scegli full_immediately per riavviare la fatturazione; usa difference_immediately per upgrade semplici e accrediti automatici sui downgrade; oppure usa do_not_bill per cambiare piano senza alcun adeguamento della fatturazione.

Gestione dei pagamenti non riusciti

Controlla cosa succede quando il pagamento di una modifica del piano non va a buon fine usando il parametro on_payment_failure.

Modalità di mancato pagamento

Se non specificato, il parametro on_payment_failure usa l’impostazione predefinita a livello aziendale configurata nel dashboard.

Quando usare ciascuna modalità

Impostazioni predefinite aziendali e di riscossione

Imposta il comportamento predefinito per upgrade e downgrade a livello aziendale in Impostazioni → Abbonamenti. Queste impostazioni si applicano a tutte le modifiche del piano dal customer portal e possono essere sovrascritte per ogni raccolta di prodotti. Esistono impostazioni predefinite separate per upgrade e downgrade: Configura le impostazioni predefinite aziendali in Impostazioni → Abbonamenti e le sovrascritture per raccolta in ogni raccolta di prodotti. Ogni campo della raccolta è indipendente: lascialo non impostato per ereditare il valore predefinito aziendale oppure imposta un valore per sovrascriverlo.

Ordine di risoluzione

Per una determinata modifica del piano, ogni impostazione viene risolta nel seguente ordine:
Un valore passato esplicitamente all’API Change Plan ha sempre la precedenza. Le impostazioni predefinite aziendali e della raccolta hanno effetto solo quando non viene fornito alcun valore esplicito, come avviene per tutte le modifiche del piano avviate dal customer portal.
Una configurazione comune: mantieni gli upgrade su immediately + difference_immediately, così i clienti pagano la differenza e ottengono subito l’accesso, e mantieni i downgrade su next_billing_date, così i clienti conservano il piano attuale fino alla fine del ciclo.

Gestione dei webhook

Monitora lo stato dell’abbonamento tramite webhook per confermare le modifiche del piano e i pagamenti.

Tipi di evento da gestire

  • subscription.active: abbonamento attivato
  • subscription.plan_changed: piano dell’abbonamento modificato (upgrade/downgrade/modifiche degli addon)
  • subscription.on_hold: addebito non riuscito, rinnovi interrotti
  • subscription.renewed: rinnovo completato
  • payment.succeeded: pagamento della modifica del piano o del rinnovo completato
  • payment.failed: pagamento non riuscito
Basa la logica aziendale sugli eventi dell’abbonamento e usa gli eventi di pagamento per la conferma e la riconciliazione.

Verifica delle firme e gestione degli intent

Per gli schemi dettagliati dei payload, consulta i payload dei webhook degli abbonamenti e i payload dei webhook dei pagamenti.

Best practice

Strategia per le modifiche del piano

  • Testa accuratamente: testa sempre le modifiche del piano in modalità test prima della produzione
  • Scegli con attenzione la prorazione: seleziona la modalità di prorazione in linea con il tuo modello aziendale
  • Gestisci elegantemente gli errori: implementa una gestione degli errori e una logica di retry adeguate
  • Monitora i tassi di successo: monitora i tassi di successo/fallimento delle modifiche del piano e analizza i problemi

Implementazione dei webhook

  • Verifica le firme: convalida sempre le firme dei webhook per garantirne l’autenticità
  • Implementa l’idempotenza: gestisci correttamente gli eventi webhook duplicati
  • Elabora in modo asincrono: non bloccare le risposte dei webhook con operazioni pesanti
  • Registra tutto: mantieni log dettagliati per il debug e gli audit

Esperienza utente

  • Comunica chiaramente: informa i clienti sulle modifiche di fatturazione e sulle tempistiche
  • Fornisci conferme: invia email di conferma per le modifiche del piano completate
  • Gestisci i casi limite: considera periodi di prova, prorazioni e pagamenti non riusciti
  • Aggiorna subito l’interfaccia: rifletti le modifiche del piano nell’interfaccia della tua applicazione

Problemi comuni e soluzioni

Risolvi i problemi tipici riscontrati durante le modifiche dei piani degli abbonamenti:
Sintomi: la chiamata API ha esito positivo, ma l’abbonamento rimane sul vecchio pianoCause comuni:
  • L’elaborazione del webhook non è riuscita o è stata ritardata
  • Lo stato dell’applicazione non è stato aggiornato dopo la ricezione dei webhook
  • Problemi con la transazione del database durante l’aggiornamento dello stato
Soluzioni:
  • Implementa la gestione dei webhook con logica di retry
  • Usa operazioni idempotenti per gli aggiornamenti dello stato
  • Aggiungi il monitoraggio per rilevare e segnalare gli eventi webhook mancanti
  • Verifica che l’endpoint webhook sia accessibile e risponda correttamente
Sintomi: il cliente effettua un downgrade ma non visualizza il saldo dei creditiCause comuni:
  • Aspettative sulla modalità di prorazione: i downgrade accreditano la differenza completa del prezzo del piano con difference_immediately, mentre prorated_immediately accredita il tempo inutilizzato del vecchio ciclo e poi addebita un ciclo completo al nuovo piano; quindi un saldo crediti rimane solo quando tale credito supera il prezzo del nuovo piano
  • I crediti sono specifici dell’abbonamento e non vengono trasferiti tra abbonamenti
  • Il saldo dei crediti non è visibile nel dashboard del cliente
Soluzioni:
  • Usa difference_immediately per i downgrade quando vuoi crediti automatici
  • Spiega ai clienti che i crediti vengono applicati ai rinnovi futuri dello stesso abbonamento
  • Implementa il customer portal per mostrare i saldi dei crediti
  • Controlla l’anteprima della fattura successiva per visualizzare i crediti applicati
Sintomi: gli eventi webhook vengono rifiutati a causa di una firma non validaCause comuni:
  • Chiave segreta del webhook errata
  • Body della richiesta originale modificato prima della verifica della firma
  • Algoritmo di verifica della firma errato
Soluzioni:
  • Verifica di usare il corretto DODO_PAYMENTS_WEBHOOK_KEY dal dashboard
  • Leggi il body originale della richiesta prima di qualsiasi middleware di parsing JSON
  • Usa la libreria standard di verifica dei webhook per la tua piattaforma
  • Testa la verifica della firma dei webhook nell’ambiente di sviluppo
Sintomi: l’API restituisce l’errore 422 Unprocessable EntityCause comuni:
  • ID abbonamento o ID prodotto non valido
  • Abbonamento non nello stato attivo
  • Parametri obbligatori mancanti
  • Prodotto non disponibile per le modifiche del piano
Soluzioni:
  • Verifica che l’abbonamento esista e sia attivo
  • Controlla che l’ID prodotto sia valido e disponibile
  • Assicurati che siano forniti tutti i parametri obbligatori
  • Consulta la documentazione API per i requisiti dei parametri
Sintomi: la modifica del piano è stata avviata, ma l’addebito immediato non va a buon fineCause comuni:
  • 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
Soluzioni:
  • Gestisci correttamente gli eventi webhook payment.failed
  • Informa il cliente che deve aggiornare il metodo di pagamento
  • Implementa la logica di retry per gli errori temporanei
  • Valuta la possibilità di consentire modifiche del piano con addebiti immediati non riusciti
Sintomi: l’addebito della modifica del piano non va a buon fine e l’abbonamento passa allo stato on_holdCosa succede: Quando l’addebito della modifica del piano non va a buon fine, l’abbonamento viene automaticamente impostato sullo stato on_hold. L’abbonamento non verrà rinnovato automaticamente finché 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 una modifica del piano non riuscita:
  1. Aggiorna il metodo di pagamento usando l’API Update Payment Method
  2. Creazione automatica dell’addebito: l’API crea automaticamente un addebito per gli importi ancora dovuti
  3. Generazione della fattura: viene generata una fattura per l’addebito
  4. Elaborazione del pagamento: il pagamento viene elaborato usando il nuovo metodo di pagamento
  5. Riattivazione: dopo il pagamento completato, l’abbonamento viene riattivato allo stato active
Eventi webhook da monitorare:
  • subscription.on_hold: abbonamento sospeso (ricevuto quando l’addebito della modifica del piano non va a buon fine)
  • payment.succeeded: pagamento degli importi ancora dovuti completato (dopo l’aggiornamento del metodo di pagamento)
  • subscription.active: abbonamento riattivato dopo il pagamento completato
Best practice:
  • Informa immediatamente i clienti quando l’addebito della modifica del piano non va a buon fine
  • Fornisci istruzioni chiare su come aggiornare il metodo di pagamento
  • Monitora gli eventi webhook per seguire lo stato della riattivazione
  • Valuta l’implementazione di una logica di retry automatica per i pagamenti temporaneamente non riusciti

Update Payment Method API Reference

Visualizza la documentazione API completa per aggiornare i metodi di pagamento e riattivare gli abbonamenti.

Test dell’implementazione

Testa accuratamente l’implementazione della modifica del piano dell’abbonamento:
1

Set up test environment

  • Usa chiavi API di test e prodotti di test
  • Crea abbonamenti di test con diversi tipi di piano
  • Configura un endpoint webhook di test
  • Configura il monitoraggio e la registrazione dei log
2

Test different proration modes

  • Testa prorated_immediately con diverse posizioni nel ciclo di fatturazione
  • Testa difference_immediately per upgrade e downgrade
  • Testa full_immediately per reimpostare i cicli di fatturazione
  • Testa do_not_bill per passaggi di piano senza addebiti o crediti
  • Verifica che i calcoli dei crediti siano corretti
3

Test webhook handling

  • Verifica che vengano ricevuti tutti gli eventi webhook pertinenti
  • Testa la verifica delle firme dei webhook
  • Gestisci correttamente gli eventi webhook duplicati
  • Testa gli scenari di errore nell’elaborazione dei webhook
4

Test error scenarios

  • Testa con ID abbonamento non validi
  • Testa con metodi di pagamento scaduti
  • Testa errori di rete e timeout
  • Testa con fondi insufficienti
5

Monitor in production

  • Configura avvisi per le modifiche del piano non riuscite
  • Monitora i tempi di elaborazione dei webhook
  • Monitora i tassi di successo delle modifiche del piano
  • Esamina i ticket dell’assistenza clienti relativi ai problemi delle modifiche del piano

Gestione degli errori

Gestisci correttamente gli errori API comuni nella tua implementazione:

Codici di stato HTTP

La richiesta di modifica del piano è stata elaborata correttamente. Il body della risposta è un ChangePlanResponse con payment_id, payment_link, client_secret e expires_on. Tutti e quattro sono nullable, quindi il body viene serializzato come {} per una modifica ordinaria off-session; vengono valorizzati per una richiesta collect_via_payment_link completata, che restituisce i riferimenti al checkout. Consulta Riscossione del pagamento tramite un link di checkout. Se on_payment_failure=prevent_change, la modifica del piano rimane in sospeso finché il pagamento non va a buon fine.
Parametri della richiesta non validi. Verifica che tutti i campi obbligatori siano forniti e formattati correttamente.
Chiave API non valida o mancante. Verifica che il tuo DODO_PAYMENTS_API_KEY sia corretto e disponga delle autorizzazioni appropriate.
Esiste già una modifica del piano in sospeso per questo abbonamento (PendingPlanChangeExists). Per una modifica pianificata, annullala con DELETE /subscriptions/{subscription_id}/change-plan/scheduled prima di inviarne una nuova. Per una modifica tramite link di pagamento in sospeso, invia la nuova richiesta con cancel_older_payment_link: true per sostituirla. Consulta Sostituzione di un link di pagamento in sospeso.Con cancel_older_payment_link: true, un 409 significa che il cliente sta pagando ora il link precedente (PLAN_CHANGE_PAYMENT_IN_PROGRESS) o lo ha già pagato (PLAN_CHANGE_PAYMENT_ALREADY_COMPLETED).
Con cancel_older_payment_link: true, il link di pagamento precedente non può essere annullato (PLAN_CHANGE_LINK_CANCEL_FAILED). Nulla è cambiato, quindi puoi riprovare la richiesta.
L’abbonamento è inattivo o on-demand, oppure la richiesta non è idonea per collect_via_payment_link: l’azienda non ha abilitato la funzionalità, effective_at non è immediately oppure on_payment_failure non è prevent_change. Consulta Requisiti. Un ID abbonamento inesistente o non appartenente al tuo account restituisce 404 con il codice NOT_FOUND.
Si è verificato un errore del server. Riprova la richiesta dopo una breve attesa.

Formato della risposta di errore

Gli errori restituiscono un body JSON con un code e un message leggibile dall’utente:
Consulta Codici di errore per l’elenco completo.

Passaggi successivi

Ultima modifica il 8 ottobre 2026