Pular para o conteúdo principal

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?

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
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 our 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 wanting to charge fairly for unused time
  • 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
3

Implement the Change Plan API

Use the Change Plan API to modify subscription details:
subscription_id
string
obrigatório
The ID of the active subscription to modify.
product_id
string
obrigatório
The new product ID to change the subscription to.
quantity
integer
padrão:"1"
Number of units for the new plan (for seat-based products).
proration_billing_mode
string
obrigatório
How to handle immediate billing: prorated_immediately, full_immediately, difference_immediately, or do_not_bill.
addons
array
Optional addons for the new plan. Leaving this empty removes any existing addons.
on_payment_failure
string
Controls behavior when the plan change payment fails:
  • prevent_change: Keep subscription on current plan until payment succeeds
  • apply_change (default): Apply plan change immediately regardless of payment outcome
If not specified, uses the business-level default setting.
discount_code
string
Código de desconto opcional para aplicar ao novo plano. Se fornecido, valida e aplica o desconto à mudança de plano. Se não for fornecido e a assinatura tiver um desconto existente com preserve_on_plan_change=true, o desconto existente será preservado (se aplicável ao novo produto).
effective_at
string
padrão:"immediately"
Quando aplicar a mudança de plano:
  • immediately (padrão): Aplique a mudança de plano imediatamente
  • next_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.
Use 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.
4

Handle Webhook Events

Configure o manuseio de webhooks para rastrear os resultados das mudanças de plano:
  • subscription.active: Mudança de plano bem-sucedida, assinatura atualizada
  • subscription.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 pausada
  • payment.succeeded: Cobrança imediata pela mudança de plano bem-sucedida
  • payment.failed: Cobrança imediata falhou
Sempre verifique as assinaturas de webhook e implemente o processamento idempotente de eventos.
5

Update Your Application State

Com base em eventos de webhook, atualize seu aplicativo:
  • 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
6

Test and Monitor

Teste seu sistema completamente:
  • 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
Sua implementação de mudança de plano de assinatura está agora pronta para uso em produção.

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:
const preview = await client.subscriptions.previewChangePlan('sub_123', {
  product_id: 'prod_pro',
  quantity: 1,
  proration_billing_mode: 'prorated_immediately'
});

// Show customer the charge before confirming
console.log('Immediate charge:', preview.immediate_charge.summary);
console.log('New plan details:', preview.new_plan);
Use a Preview API para construir diálogos de confirmação que mostrem aos clientes o valor exato que será cobrado antes de confirmarem a mudança de plano.

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

import DodoPayments from 'dodopayments';

const client = new DodoPayments({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode', // defaults to 'live_mode'
});

async function changePlan() {
  const result = await client.subscriptions.changePlan('sub_123', {
    product_id: 'prod_new',
    quantity: 3,
    proration_billing_mode: 'prorated_immediately',
    on_payment_failure: 'prevent_change', // Optional: control behavior on payment failure
  });
  console.log(result.status, result.invoice_id, result.payment_id);
}

changePlan();
Success
{
  "status": "processing",
  "subscription_id": "sub_123",
  "invoice_id": "inv_789",
  "payment_id": "pay_456",
  "proration_billing_mode": "prorated_immediately"
}
Campos como 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.
Se a cobrança imediata falhar, a assinatura pode mover-se para subscription.on_hold até que o pagamento seja bem-sucedido.

Gerenciando Addons

Ao alterar planos de assinatura, você também pode modificar addons:
// Add addons to the new plan
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_new',
  quantity: 1,
  proration_billing_mode: 'difference_immediately',
  addons: [
    { addon_id: 'addon_123', quantity: 2 }
  ]
});

// Remove all existing addons
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_new',
  quantity: 1,
  proration_billing_mode: 'difference_immediately',
  addons: [] // Empty array removes all existing addons
});
Addons estão incluídos no cálculo de rateio e serão cobrados de acordo com o modo de rateio selecionado.

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.
// Apply a discount code during plan change
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_pro',
  quantity: 1,
  proration_billing_mode: 'prorated_immediately',
  discount_code: 'UPGRADE20'
});

Comportamento do desconto na mudança de plano

CenárioComportamento
discount_code fornecidoValida e aplica o desconto ao novo plano.
Nenhum código fornecido, desconto existente com preserve_on_plan_change=trueDesconto existente é automaticamente preservado se aplicável ao novo produto.
Nenhum código fornecido, nenhum desconto preservávelNenhum desconto aplicado ao novo plano.
Use a Preview Plan Change API com um discount_code para mostrar aos clientes exatamente quanto economizarão antes de confirmar a mudança de 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
Créditos criados por downgrades usando 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
Recursoprorated_immediatelydifference_immediatelyfull_immediatelydo_not_bill
Cobrança de upgradeDiferença prorrogada para dias restantesDiferença total de preço entre planosPreço total do novo planoSem cobrança
Crédito de downgradeCrédito prorrogado para dias restantesDiferença total de preço como créditoSem créditoSem crédito
Ciclo de cobrançaInalteradoInalteradoReiniciado para hojeInalterado
Comportamento de testeTermina o teste, cobra imediatamenteTermina o teste, cobra imediatamenteTermina o teste, cobra o valor totalTermina o teste, sem cobrança
Melhor paraCobrança justa baseada no tempoMatemática simples de upgrade/downgradeReinício de ciclos de cobrançaMigrações gratuitas ou trocas de cortesia
ComplexidadeMé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)
Step 1: Calculate unused credit from current plan
  Unused days = 15 out of 30 days
  Credit = $30 × (15/30) = $15.00

Step 2: Calculate prorated cost of new plan
  Remaining days = 15 out of 30 days
  New plan cost = $80 × (15/30) = $40.00

Step 3: Calculate immediate charge
  Charge = New plan cost − Credit
  Charge = $40.00 − $15.00 = $25.00

→ Customer pays $25.00 now
→ Next renewal (Feb 1): $80.00/month
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_pro',
  quantity: 1,
  proration_billing_mode: 'prorated_immediately'
})
Step 1: Calculate unused credit from current plan
  Unused days = 15 out of 30 days
  Credit = $80 × (15/30) = $40.00

Step 2: Calculate prorated cost of new plan
  Remaining days = 15 out of 30 days
  New plan cost = $20 × (15/30) = $10.00

Step 3: Calculate credit balance
  Credit = $40.00 − $10.00 = $30.00

→ No charge — $30.00 credit added to subscription
→ Credit auto-applies to future renewals
→ Next renewal (Feb 1): $20.00 − $30.00 credit = $0.00
→ Following renewal (Mar 1): $20.00 − $10.00 remaining credit = $10.00
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_starter',
  quantity: 1,
  proration_billing_mode: 'prorated_immediately'
})
Immediate charge = New plan price − Old plan price
                 = $80 − $30
                 = $50.00

→ Customer pays $50.00 now (regardless of cycle position)
→ Next renewal (Feb 1): $80.00/month
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_pro',
  quantity: 1,
  proration_billing_mode: 'difference_immediately'
})
Credit = Old plan price − New plan price
       = $80 − $20
       = $60.00

→ No charge — $60.00 credit added to subscription
→ Credit auto-applies to future renewals
→ Next renewal: $20.00 − $20.00 (from credit) = $0.00
→ Following renewal: $20.00 − $20.00 (from credit) = $0.00
→ Third renewal: $20.00 − $20.00 (from remaining credit) = $0.00
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_starter',
  quantity: 1,
  proration_billing_mode: 'difference_immediately'
})
Immediate charge = Full new plan price = $80.00

→ Customer pays $80.00 now
→ No credit for unused time on old plan
→ Billing cycle resets to today (January 16)
→ Next renewal: February 16 at $80.00/month
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_pro',
  quantity: 1,
  proration_billing_mode: 'full_immediately'
})
Current: Basic plan ($30/month), no add-ons
New: Pro plan ($80/month) + Extra Seats add-on ($10/seat × 3 seats = $30/month)
Change on day 16 of 30 (15 days remaining)

Step 1: Credit from current plan
  Credit = $30 × (15/30) = $15.00

Step 2: Prorated cost of new plan + add-ons
  New plan = $80 × (15/30) = $40.00
  Add-ons = $30 × (15/30) = $15.00
  Total new = $55.00

Step 3: Immediate charge
  Charge = $55.00 − $15.00 = $40.00

→ Customer pays $40.00 now
→ Next renewal: $80.00 + $30.00 = $110.00/month
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_pro',
  quantity: 1,
  proration_billing_mode: 'prorated_immediately',
  addons: [
    { addon_id: 'addon_seats', quantity: 3 }
  ]
})

Como cada modo processa a cobrança

Escolha prorated_immediately para contabilidade justa por tempo; escolha full_immediately para reiniciar a cobrança; use difference_immediately para upgrades simples e crédito automático em downgrades; ou use do_not_bill para trocar de planos sem qualquer ajuste de cobrança.

Lidando com Falhas de Pagamento

Controle o que acontece quando uma cobrança de mudança de plano falha usando o parâmetro on_payment_failure.

Modos de Falha de Pagamento

Se não especificado, o parâmetro on_payment_failure usa sua configuração de nível empresarial padrão configurada no painel.

Quando Usar Cada Modo

CenárioModo RecomendadoRazão
Upgrade para recursos premiumprevent_changeGarantir pagamento antes de conceder acesso
Aumento de quantidade (mais assentos)prevent_changePrevenir uso sem pagamento
Downgrades de planosapply_changeO cliente está reduzindo gastos
Clientes empresariais confiáveisapply_changeMenor risco de não pagamento
Conversão de teste para pagoprevent_changeMomento 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 ativada
  • subscription.plan_changed: plano de assinatura alterado (atualizações/downgrades/mudanças de addon)
  • subscription.on_hold: falha na cobrança, assinatura pausada
  • subscription.renewed: renovação bem-sucedida
  • payment.succeeded: pagamento para mudança de plano ou renovação bem-sucedida
  • payment.failed: pagamento falhou
Recomendamos impulsionar a lógica de negócios dos eventos de assinatura e usar eventos de pagamento para confirmação e reconciliação.

Verifique assinaturas e manipule intenções

import { NextRequest, NextResponse } from 'next/server';

export async function POST(req) {
  const webhookId = req.headers.get('webhook-id');
  const webhookSignature = req.headers.get('webhook-signature');
  const webhookTimestamp = req.headers.get('webhook-timestamp');
  const secret = process.env.DODO_WEBHOOK_SECRET;

  const payload = await req.text();
  // verifySignature is a placeholder – in production, use a Standard Webhooks library
  const { valid, event } = await verifySignature(
    payload,
    { id: webhookId, signature: webhookSignature, timestamp: webhookTimestamp },
    secret
  );
  if (!valid) return NextResponse.json({ error: 'Invalid signature' }, { status: 400 });

  switch (event.type) {
    case 'subscription.active':
      // mark subscription active in your DB
      break;
    case 'subscription.plan_changed':
      // refresh entitlements and reflect the new plan in your UI
      break;
    case 'subscription.on_hold':
      // notify user to update payment method
      break;
    case 'subscription.renewed':
      // extend access window
      break;
    case 'payment.succeeded':
      // reconcile payment for plan change
      break;
    case 'payment.failed':
      // log and alert
      break;
    default:
      // ignore unknown events
      break;
  }

  return NextResponse.json({ received: true });
}
Para esquemas de payload detalhados, veja os Payloads de Webhook de Assinatura e Payloads de Webhook de Pagamento.

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:
Sintomas: Chamada de API bem-sucedida, mas a assinatura permanece no plano antigoCausas comuns:
  • 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
Soluções:
  • 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
Sintomas: Cliente faz downgrade, mas não vê saldo de créditoCausas comuns:
  • Expectativas do modo de rateio: downgrades creditam a diferença total de preço do plano com difference_immediately, enquanto prorated_immediately cria 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
Soluções:
  • Use difference_immediately para 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
Sintomas: Eventos de webhook rejeitados devido a assinatura inválidaCausas comuns:
  • Chave secreta de webhook incorreta
  • Corpo da solicitação bruta modificado antes da verificação da assinatura
  • Algoritmo de verificação de assinatura errado
Soluções:
  • Verifique se está usando o correto DODO_WEBHOOK_SECRET do 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
Sintomas: API retorna erro 422 Unprocessable EntityCausas comuns:
  • 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
Soluções:
  • 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
Sintomas: Mudança de plano iniciada, mas cobrança imediata falhaCausas comuns:
  • 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
Soluções:
  • 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
Sintomas: Cobrança de mudança de plano falha e a assinatura muda para o estado 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:
  1. Atualize o método de pagamento usando a API de Atualização de Método de Pagamento
  2. Criação automática de cobrança: A API cria automaticamente uma cobrança para as dívidas restantes
  3. Geração de fatura: Uma fatura é gerada para a cobrança
  4. Processamento de pagamento: O pagamento é processado usando o novo método de pagamento
  5. Reativação: Após o pagamento bem-sucedido, a assinatura é reativada para o estado active
// Reactivate subscription from on_hold after failed plan change
async function reactivateAfterFailedPlanChange(subscriptionId) {
  // Update payment method - automatically creates charge for remaining dues
  const response = await client.subscriptions.updatePaymentMethod(subscriptionId, {
    type: 'new',
    return_url: 'https://example.com/return'
  });
  
  if (response.payment_id) {
    console.log('Charge created for remaining dues:', response.payment_id);
    console.log('Payment link:', response.payment_link);
    
    // Redirect customer to payment_link to complete payment
    // Monitor webhooks for:
    // 1. payment.succeeded - charge succeeded
    // 2. subscription.active - subscription reactivated
  }
  
  return response;
}

// Or use existing payment method if available
async function reactivateWithExistingPaymentMethod(subscriptionId, paymentMethodId) {
  const response = await client.subscriptions.updatePaymentMethod(subscriptionId, {
    type: 'existing',
    payment_method_id: paymentMethodId
  });
  
  // Monitor webhooks for payment.succeeded and subscription.active
  return response;
}
Eventos de webhook para monitorar:
  • 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
Melhores práticas:
  • 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

Veja a documentação completa da API para atualizar métodos de pagamento e reativar assinaturas.

Testando Sua Implementação

Siga estas etapas para testar completamente a implementação de mudança de plano de assinatura:
1

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
2

Test different proration modes

  • Teste prorated_immediately com várias posições de ciclo de cobrança
  • Teste difference_immediately para upgrades e downgrades
  • Teste full_immediately para reiniciar ciclos de cobrança
  • Teste do_not_bill para trocas de plano sem cobrança/nem crédito
  • Verifique se os cálculos de crédito estão corretos
3

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
4

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
5

Monitor in production

  • Configure alertas para mudanças de plano que falharem
  • Monitore tempos de processamento de webhook
  • Acompanhe taxas de sucesso de mudanças de plano
  • Revise tickets de suporte ao cliente para problemas de mudança de plano

Tratamento de Erros

Lide com erros comuns de API de forma tranquila em sua implementação:

Códigos de Status HTTP

Solicitação de mudança de plano processada com sucesso. A assinatura está sendo atualizada e o processamento de pagamento foi iniciado.
Parâmetros de solicitação inválidos. Verifique se todos os campos obrigatórios estão fornecidos e formatados corretamente.
Chave de API inválida ou ausente. Verifique se o seu DODO_PAYMENTS_API_KEY está correto e tem permissões adequadas.
ID de assinatura não encontrado ou não pertence à sua conta.
A assinatura não pode ser alterada (por exemplo, já cancelada, produto não disponível, etc.).
Ocorreu um erro de servidor. Tente novamente após um breve atraso.

Formato de Resposta de Erro

{
  "error": {
    "code": "subscription_not_found",
    "message": "The subscription with ID 'sub_123' was not found",
    "details": {
      "subscription_id": "sub_123"
    }
  }
}

Próximos passos

Last modified on April 20, 2026