Pré-requisitos
Antes de começar, você precisa de:- Uma conta de comerciante do Dodo Payments
- Uma chave de API em Developer → API Keys no dashboard, armazenada em
DODO_PAYMENTS_API_KEY - Um segredo de webhook em Developer → Webhooks, armazenado em
DODO_PAYMENTS_WEBHOOK_KEY - Pelo menos um produto de assinatura criado em Products
Integração da API
Sessões de Checkout
Crie uma assinatura construindo uma sessão de checkout com seu produto de assinatura. O cliente autoriza uma forma de pagamento e a assinatura é ativada quando ele conclui o checkout.- Node.js SDK
- Python SDK
- REST API
Resposta da API
A resposta inclui umcheckout_url:
Webhooks
Os webhooks notificam seu servidor quando ocorrem eventos de assinatura. Configure seu endpoint em Developer → Webhooks no dashboard. Para configurar seu endpoint de webhook, consulte Webhooks.Tipos de eventos de assinatura
Acompanhe estes eventos para gerenciar o ciclo de vida da assinatura:subscription.active— A assinatura foi ativadasubscription.updated— Um campo da assinatura foi alteradosubscription.on_hold— Uma cobrança de renovação ou alteração de plano falhousubscription.failed— A criação da assinatura falhou (terminal; o cliente precisa assinar novamente)subscription.renewed— Uma cobrança recorrente foi bem-sucedidasubscription.past_due— Uma renovação falhou e o período de carência começou; o cliente mantém o acesso atépast_due_ends_atsubscription.plan_changed— O plano foi atualizado, reduzido ou alteradosubscription.cancelled— A assinatura foi canceladasubscription.expired— A assinatura chegou ao fim do prazo
paused, unpaused e update_payment_method, consulte Webhooks de assinatura.
Cenários de pagamento
Fluxo de pagamento bem-sucedido A sequência de webhooks depende de a assinatura ter um período de teste. Cobrança imediata (0 dias de teste):subscription.active: o mandato é autorizado e a assinatura é ativada.payment.succeeded: confirma a primeira cobrança. Espere recebê-lo em até 2–10 minutos após o checkout.
- No início do teste (checkout):
subscription.activeé disparado quando a forma de pagamento é autorizada. Nenhuma cobrança recorrente é feita ainda. A primeira cobrança real é adiada até o fim do teste. - No fim do teste: o valor recorrente é cobrado, e você recebe
payment.succeededjunto comsubscription.renewed.
subscription.renewed: é disparado a cada ciclo de cobrança quando o pagamento da renovação é debitado, sempre junto compayment.succeeded. Ele também inclui onext_billing_dateatualizado.
Sempre que houver um débito real por um produto de assinatura, você receberá
subscription.renewed e payment.succeeded. Use subscription.renewed (em vez de apenas payment.succeeded) como sinal para estender o acesso para o próximo ciclo.- Falha da assinatura
subscription.failed- A criação da assinatura falhou porque não foi possível criar um mandato.payment.failed- Indica falha no pagamento.
- Assinatura suspensa
subscription.on_hold- A assinatura foi suspensa devido a uma falha no pagamento da renovação ou da cobrança de alteração de plano. Se sua empresa tiver um período de carência, uma renovação com falha primeiro move a assinatura parapast_due(subscription.past_due), e ela é movida paraon_hold(oucancelled, dependendo das configurações do período de carência) somente quando o período termina. Consulte Estados da assinatura.- Quando uma assinatura é suspensa, ela não será renovada automaticamente até que a forma de pagamento seja atualizada.
Boa prática: para simplificar a implementação, recomendamos acompanhar principalmente os eventos de assinatura para gerenciar o ciclo de vida da assinatura.
subscription.failed vs. subscription.on_hold
É fácil confundir esses dois eventos, mas eles exigem tratamentos muito diferentes:
Como lidar com uma assinatura suspensa
Quando uma assinatura entra no estadoon_hold, você precisa atualizar a forma de pagamento para reativá-la. Esta seção explica quando as assinaturas são suspensas e como lidar com elas.
Quando as assinaturas são suspensas
Uma assinatura é suspensa quando:- O pagamento da renovação falha: a cobrança automática da renovação falha devido a fundos insuficientes, cartão expirado ou recusa do banco
- A cobrança de alteração de plano falha: uma cobrança imediata durante a atualização ou redução do plano falha
- A autorização da forma de pagamento falha: não é possível autorizar a forma de pagamento para cobranças recorrentes
Reativação de assinaturas suspensas
Para reativar uma assinatura no estadoon_hold, use a API Update Payment Method. Ela automaticamente:
- Cria uma cobrança pelos valores pendentes
- Gera uma invoice para a cobrança
- Processa o pagamento usando a nova forma de pagamento
- Reativa a assinatura para o estado
activeapós um pagamento bem-sucedido
1
Handle subscription.on_hold webhook
Quando receber um webhook
subscription.on_hold, atualize o estado da sua aplicação e notifique o cliente:2
Update payment method
Quando o cliente estiver pronto para atualizar a forma de pagamento, chame a API Update Payment Method:
Você também pode usar um ID de forma de pagamento existente se o cliente tiver formas de pagamento salvas:
3
Monitor webhook events
Depois de atualizar a forma de pagamento, monitore estes eventos de webhook:
payment.succeeded- A cobrança pelos valores pendentes foi bem-sucedidasubscription.active- A assinatura foi reativada
Exemplo de payload de evento de assinatura
Alteração de planos de assinatura
Você pode atualizar ou reduzir um plano de assinatura usando o endpoint da API de alteração de plano. Isso permite modificar o produto, a quantidade e lidar com proration da assinatura.Change Plan API Reference
Para obter informações detalhadas sobre a alteração de planos de assinatura, consulte nossa documentação da API Change Plan.
Opções de proration
Ao alterar planos de assinatura, você tem quatro opções para lidar com a cobrança imediata:1. prorated_immediately
- Credita a parte não utilizada do ciclo de cobrança atual, calculada proporcionalmente ao tempo restante. O crédito cobre o plano base, a quantidade e quaisquer add-ons
- Em seguida, cobra um ciclo completo no novo plano, quantidade e add-ons. A cobrança em si nunca é calculada proporcionalmente
- Cobrança imediata líquida = (novo ciclo completo) menos (fração restante x ciclo antigo completo). Se o crédito for maior, a diferença é mantida como crédito vinculado à assinatura para futuras renovações
- Durante um período de teste, isso muda imediatamente o usuário para o novo plano e cobra o cliente na hora
2. full_immediately
- Cobra do cliente o valor total da assinatura do novo plano, sem crédito pelo ciclo anterior
- Tanto na atualização quanto na redução, o cliente paga o preço integral do novo plano desde o início
- Útil quando você deseja cobrar o valor total independentemente de quanto tempo restava no plano antigo
3. difference_immediately
- O cliente paga apenas a diferença entre o preço do plano antigo e o novo
- O valor não depende do momento do ciclo em que a alteração é feita. A mesma atualização custa o mesmo no dia 1 e no dia 29
- Ao atualizar, o cliente é cobrado imediatamente pela diferença. Por exemplo, $30/mês → $80/mês = $50 cobrados na hora
- Ao reduzir, a diferença de preço é armazenada como crédito vinculado à assinatura e aplicada automaticamente a futuras renovações. Por exemplo, $50/mês → $20/mês = $30 armazenados como crédito
4. do_not_bill
- Aplica a alteração do plano imediatamente, mas não cobra nada no momento da alteração. O novo plano, a quantidade e os add-ons ficam disponíveis imediatamente
- Como nada é cobrado agora, uma atualização oferece ao cliente o plano superior gratuitamente pelo restante do ciclo atual. Uma redução entra em vigor imediatamente, sem crédito pela parte não utilizada do ciclo que já foi paga
- Add-ons concedidos por meio de
do_not_billnão recebem crédito em uma alteração posterior de plano, pois nunca foram cobrados. Uma alteração subsequente cobra integralmente a nova quantidade de add-ons - O plano atualizado (e a quantidade/add-ons) é cobrado na próxima renovação programada, e a data de cobrança original é preservada
Comportamento
- Quando você chama essa API, o Dodo Payments inicia imediatamente uma cobrança com base na opção de proration selecionada
- Com
prorated_immediately, um crédito pela parte não utilizada do ciclo atual é calculado a cada alteração, tanto para atualização quanto para redução. Se esse crédito exceder a cobrança do novo ciclo, o restante será adicionado ao saldo de crédito da assinatura. Esses créditos são específicos dessa assinatura e só serão usados para compensar futuros pagamentos recorrentes da mesma assinatura - Com
difference_immediately, o valor líquido é sempre a diferença exata de preço. Para reduções, o excedente é armazenado como crédito vinculado à assinatura, assim como emprorated_immediately - A opção
full_immediatelyignora os cálculos de crédito e cobra o valor total do novo plano - A opção
do_not_billaplica a alteração imediatamente, mas adia a cobrança para a próxima data de renovação, que é preservada
Processamento da cobrança
- A cobrança imediata iniciada após a alteração do plano normalmente termina de ser processada em menos de 2 minutos
- Se essa cobrança imediata falhar por qualquer motivo, a assinatura será automaticamente suspensa até que o problema seja resolvido
Assinaturas sob demanda
As assinaturas sob demanda permitem cobrar clientes com flexibilidade, não apenas em uma periodicidade fixa. Esse recurso está disponível para todas as contas.
subscription_data.on_demand no corpo da solicitação. Isso permite autorizar uma forma de pagamento sem uma cobrança imediata ou definir um preço inicial personalizado.
Para cobrar uma assinatura sob demanda:
Para cobranças subsequentes, use o endpoint POST /subscriptions//charge e especifique o valor a ser cobrado do cliente nessa transação.
Para obter um guia completo passo a passo (incluindo exemplos de solicitação/resposta, políticas seguras de novas tentativas e processamento de webhooks), consulte o Guia de assinaturas sob demanda.
Principais informações sobre a cobrança de assinaturas
Os testes usam uma autorização de $0, não uma cobrança. Quando uma assinatura tem um período de teste, o início do teste cria uma autorização de mandato de $0 para salvar o cartão; a primeira cobrança real ocorre quando o teste termina. Na lista de pagamentos, uma assinatura em teste gratuito mostra exatamente um pagamento com
total_amount igual a 0. Um teste pago cobra o trial_amount antecipadamente.Ciclo de vida da assinatura:
past_due = uma renovação falhou e o período de carência está em andamento (o cliente mantém o acesso). on_hold = uma renovação falhou (recuperável: solicite ao cliente que atualize a forma de pagamento; novas tentativas de cobrança se aplicam). expired = o prazo terminou sem renovação e não pode ser reativado. O cliente precisa assinar novamente. cancelled = encerrado pelo cliente ou pelo comerciante. A maioria das falhas de renovação são recusas do emissor (fundos insuficientes, cartão recusado), não um erro do Dodo.Referência de API relacionada
Create Subscription (Deprecated)
API legada para criar uma assinatura diretamente. Use Checkout Sessions para novas integrações
Change Subscription Plan
Referência da API para atualizar, reduzir ou alterar planos de assinatura com opções de proration
Update Payment Method
Referência da API para atualizar formas de pagamento e reativar assinaturas suspensas
Patch Subscription
Referência da API para atualizar detalhes e configurações de assinaturas