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, o desconto existente será preservado (se aplicável ao novo produto).immediately(padrão): Aplique a mudança de plano imediatamentenext_billing_date: Agende a mudança para a próxima data de cobrança. O cliente mantém seu plano atual até o fim do período de cobrança.
next_billing_date para downgrades para que os clientes mantenham os benefícios do plano atual até o final do período de cobrança.Handle Webhook Events
subscription.active: Mudança de plano bem-sucedida, assinatura atualizadasubscription.plan_changed: Plano de assinatura alterado (atualização/rebaixamento/atualização de addon)subscription.on_hold: Falha na cobrança da mudança de plano, assinatura pausadapayment.succeeded: Cobrança imediata pela mudança de plano bem-sucedidapayment.failed: Cobrança imediata falhou
Update Your Application State
- Conceda/revogue recursos com base no novo plano
- Atualize o painel do cliente com detalhes do novo plano
- Envie emails de confirmação sobre alterações de plano
- Registre alterações de cobrança para fins de auditoria
Test and Monitor
- Teste todos os modos de rateio com diferentes cenários
- Verifique se o manuseio de webhook funciona corretamente
- Monitore taxas de sucesso de mudanças de plano
- Configure alertas para mudanças de plano que falharem
Pré-visualizar Mudanças de Plano
Antes de confirmar uma mudança de plano, use a Preview API para mostrar aos clientes exatamente o que será cobrado:- Node.js SDK
- Python SDK
API de Mudança de Plano
Use a API de Mudança de Plano para modificar produto, quantidade e comportamento de prorrateamento para uma assinatura ativa.Exemplos para início rápido
- Node.js SDK
- Python SDK
- Go SDK
- HTTP
invoice_id e payment_id são retornados apenas quando uma cobrança imediata e/ou fatura é criada durante a mudança de plano. Sempre confie em eventos de webhook (por exemplo, payment.succeeded, subscription.plan_changed) para confirmar os resultados.Gerenciando Addons
Ao alterar planos de assinatura, você também pode modificar addons:Aplicando Códigos de Desconto
Você pode aplicar um código de desconto ao alterar planos de assinatura. Isso é útil para oferecer preços promocionais em upgrades ou migrações.- Node.js SDK
- Python SDK
- HTTP
Comportamento do desconto na mudança de plano
| Cenário | Comportamento |
|---|---|
discount_code fornecido | Valida e aplica o desconto ao novo plano. |
Nenhum código fornecido, desconto existente com preserve_on_plan_change=true | Desconto existente é automaticamente preservado se aplicável ao novo produto. |
| Nenhum código fornecido, nenhum desconto preservável | Nenhum desconto aplicado ao novo plano. |
Modos de Rateio
Escolha como cobrar o cliente ao mudar de planos:prorated_immediately
- Cobra pela diferença parcial no ciclo atual
- Se em teste, cobra imediatamente e muda para o novo plano agora
- Downgrade: pode gerar um crédito rateado aplicado a renovações futuras
full_immediately
- Cobra o valor total do novo plano imediatamente
- Ignora o tempo restante do plano antigo
difference_immediately são específicos da assinatura e distintos das concessões de Faturamento Baseado em Crédito. Eles são aplicados automaticamente a renovações futuras da mesma assinatura e não são transferíveis entre assinaturas.difference_immediately
- Upgrade: cobra imediatamente a diferença de preço entre planos antigos e novos
- Downgrade: adiciona o valor restante como crédito interno para a assinatura e aplica automaticamente em renovações
do_not_bill
- Nenhuma cobrança ou crédito é calculado
- O cliente muda para o novo plano imediatamente sem ajuste de cobrança
- O ciclo de cobrança permanece inalterado
- Ideal para migrações de cortesia, trocas de plano gratuitas ou absorver diferenças de custo
| Recurso | prorated_immediately | difference_immediately | full_immediately | do_not_bill |
|---|---|---|---|---|
| Cobrança de upgrade | Diferença prorrogada para dias restantes | Diferença total de preço entre planos | Preço total do novo plano | Sem cobrança |
| Crédito de downgrade | Crédito prorrogado para dias restantes | Diferença total de preço como crédito | Sem crédito | Sem crédito |
| Ciclo de cobrança | Inalterado | Inalterado | Reiniciado para hoje | Inalterado |
| Comportamento de teste | Termina o teste, cobra imediatamente | Termina o teste, cobra imediatamente | Termina o teste, cobra o valor total | Termina o teste, sem cobrança |
| Melhor para | Cobrança justa baseada no tempo | Matemática simples de upgrade/downgrade | Reinício de ciclos de cobrança | Migrações gratuitas ou trocas de cortesia |
| Complexidade | Média (cálculo dia) | Baixa (subtração simples) | Baixa (cobrança total) | Nenhuma |
Cenários de exemplo
Use esses números canônicos de forma consistente:- Plano atual: Básico a $30/mês
- Alvo de upgrade: Pro a $80/mês
- Alvo de downgrade (de Pro): Starter a $20/mês
- Ciclo de cobrança: 30 dias, iniciado em 1º de janeiro
- Mudança de plano ocorre em 16 de janeiro (15 dias restantes, 15 usados)
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
Como cada modo processa a cobrança
Lidando com Falhas de Pagamento
Controle o que acontece quando uma cobrança de mudança de plano falha usando o parâmetroon_payment_failure.
Modos de Falha de Pagamento
- prevent_change (Recommended for critical upgrades)
- apply_change (Default)
- A mudança de plano é marcada como “pendente”
- O cliente mantém acesso ao seu plano atual
- A assinatura move-se para o estado
activesomente após o pagamento bem-sucedido - Útil quando você deseja garantir o pagamento antes de conceder recursos aprimorados
on_payment_failure usa sua configuração de nível empresarial padrão configurada no painel.Quando Usar Cada Modo
| Cenário | Modo Recomendado | Razão |
|---|---|---|
| Upgrade para recursos premium | prevent_change | Garantir pagamento antes de conceder acesso |
| Aumento de quantidade (mais assentos) | prevent_change | Prevenir uso sem pagamento |
| Downgrades de planos | apply_change | O cliente está reduzindo gastos |
| Clientes empresariais confiáveis | apply_change | Menor risco de não pagamento |
| Conversão de teste para pago | prevent_change | Momento crítico de pagamento |
Lidando com webhooks
Acompanhe o estado da assinatura por meio de webhooks para confirmar mudanças de plano e pagamentos.Tipos de evento para lidar
subscription.active: assinatura ativadasubscription.plan_changed: plano de assinatura alterado (atualizações/downgrades/mudanças de addon)subscription.on_hold: falha na cobrança, assinatura pausadasubscription.renewed: renovação bem-sucedidapayment.succeeded: pagamento para mudança de plano ou renovação bem-sucedidapayment.failed: pagamento falhou
Verifique assinaturas e manipule intenções
- Next.js Route Handler
- Express.js
Melhores Práticas
Siga estas recomendações para mudanças de plano de assinatura confiáveis:Estratégia de Mudança de Plano
- Teste completamente: Sempre teste mudanças de plano em modo de teste antes da produção
- Escolha o rateio cuidadosamente: Selecione o modo de rateio que se alinha ao seu modelo de negócios
- Lide com falhas graciosamente: Implemente manipulação adequada de erros e lógica de tentativa novamente
- Monitore taxas de sucesso: Acompanhe as taxas de sucesso/falha de mudanças de plano e investigue problemas
Implementação de Webhook
- Verifique assinaturas: Sempre valide assinaturas de webhook para garantir autenticidade
- Implemente idempotência: Lide com eventos de webhook duplicados de maneira tranquila
- Processe de forma assíncrona: Não bloqueie respostas de webhook com operações pesadas
- Registre tudo: Mantenha registros detalhados para depuração e fins de auditoria
Experiência do Usuário
- Comunique-se claramente: Informe os clientes sobre mudanças e cronogramas de cobrança
- Forneça confirmações: Envie confirmações por email para mudanças de plano bem-sucedidas
- Lide com casos extremos: Considere períodos de teste, rateios e pagamentos falhos
- Atualize a interface do usuário imediatamente: Reflita mudanças de plano na interface do seu aplicativo
Problemas Comuns e Soluções
Resolva problemas típicos encontrados durante alterações de plano de assinatura:Charge created but subscription not updated
Charge created but subscription not updated
- O processamento de webhook falhou ou foi atrasado
- Estado da aplicação não atualizado após receber webhooks
- Problemas de transação de banco de dados durante a atualização de estado
- Implemente um manuseio robusto de webhooks com lógica de tentativa novamente
- Use operações idempotentes para atualizações de estado
- Adicione monitoramento para detectar e alertar sobre eventos de webhook perdidos
- Verifique se o endpoint de webhook está acessível e respondendo corretamente
Credits not applied after downgrade
Credits not applied after downgrade
- Expectativas do modo de rateio: downgrades creditam a diferença total de preço do plano com
difference_immediately, enquantoprorated_immediatelycria um crédito rateado com base no tempo restante no ciclo - Créditos são específicos da assinatura e não transferem entre assinaturas
- Saldo de crédito não visível no painel do cliente
- Use
difference_immediatelypara downgrades quando desejar créditos automáticos - Explique aos clientes que créditos se aplicam a renovações futuras da mesma assinatura
- Implemente um portal do cliente para mostrar saldos de crédito
- Verifique a pré-visualização da próxima fatura para ver créditos aplicados
Webhook signature verification fails
Webhook signature verification fails
- Chave secreta de webhook incorreta
- Corpo da solicitação bruta modificado antes da verificação da assinatura
- Algoritmo de verificação de assinatura errado
- Verifique se está usando o correto
DODO_WEBHOOK_SECRETdo painel - Leia o corpo da solicitação bruta antes de qualquer middleware de análise JSON
- Use a biblioteca padrão de verificação de webhook para sua plataforma
- Teste a verificação de assinatura de webhook em ambiente de desenvolvimento
Plan change fails with 422 error
Plan change fails with 422 error
- ID de assinatura ou ID de produto inválido
- Assinatura não está em estado ativo
- Parâmetros obrigatórios ausentes
- Produto não disponível para mudanças de plano
- Verifique se a assinatura existe e está ativa
- Confirme se o ID do produto é válido e disponível
- Certifique-se de que todos os parâmetros obrigatórios foram fornecidos
- Revise a documentação da API para exigências de parâmetros
Immediate charge fails during plan change
Immediate charge fails during plan change
- Fundos insuficientes no método de pagamento do cliente
- Método de pagamento expirado ou inválido
- Banco recusou a transação
- Detecção de fraude bloqueou a cobrança
- Lide adequadamente com eventos de webhook
payment.failed - Notifique o cliente para atualizar o método de pagamento
- Implemente lógica de tentativa novamente para falhas temporárias
- Considere permitir mudanças de plano com cobranças imediatas falhas
Subscription on hold after plan change
Subscription on hold after plan change
on_holdO que acontece:
Quando uma cobrança de mudança de plano falha, a assinatura é automaticamente colocada no estado on_hold. A assinatura não será renovada automaticamente até que o método de pagamento seja atualizado.Solução: Atualize o método de pagamento para reativar a assinaturaPara reativar uma assinatura do estado on_hold após uma falha na mudança de plano:- Atualize o método de pagamento usando a API de Atualização de Método de Pagamento
- Criação automática de cobrança: A API cria automaticamente uma cobrança para as dívidas restantes
- Geração de fatura: Uma fatura é gerada para a cobrança
- Processamento de pagamento: O pagamento é processado usando o novo método de pagamento
- Reativação: Após o pagamento bem-sucedido, a assinatura é reativada para o estado
active
subscription.on_hold: Assinatura colocada em espera (recebido quando a cobrança da mudança de plano falha)payment.succeeded: Pagamento para dívidas restantes bem-sucedido (após atualizar o método de pagamento)subscription.active: Assinatura reativada após pagamento bem-sucedido
- Notifique os clientes imediatamente quando uma cobrança de mudança de plano falhar
- Forneça instruções claras sobre como atualizar o método de pagamento
- Monitore eventos de webhook para rastrear o status da reativação
- Considere implementar lógica de tentativa novamente automática para falhas de pagamento temporárias
Update Payment Method API Reference
Testando Sua Implementação
Siga estas etapas para testar completamente a implementação de mudança de plano de assinatura:Set up test environment
- Use chaves de teste de API e produtos de teste
- Crie assinaturas de teste com diferentes tipos de plano
- Configure endpoint de webhook de teste
- Configure monitoramento e registro
Test different proration modes
- Teste
prorated_immediatelycom várias posições de ciclo de cobrança - Teste
difference_immediatelypara upgrades e downgrades - Teste
full_immediatelypara reiniciar ciclos de cobrança - Teste
do_not_billpara trocas de plano sem cobrança/nem crédito - Verifique se os cálculos de crédito estão corretos
Test webhook handling
- Verifique se todos os eventos relevantes do webhook são recebidos
- Teste a verificação de assinatura de webhook
- Lide com eventos de webhook duplicados de forma tranquila
- Teste cenários de falha de processamento de webhook
Test error scenarios
- Teste com IDs de assinatura inválidos
- Teste com métodos de pagamento expirados
- Teste falhas de rede e timeouts
- Teste com fundos insuficientes
Tratamento de Erros
Lide com erros comuns de API de forma tranquila em sua implementação:Códigos de Status 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 de Resposta de Erro
Próximos passos
- Revise a API de Mudança de Plano
- Explore Faturamento Baseado em Crédito
- Implemente alertas para
subscription.on_hold - Confira nosso Guia de Integração de Webhooks