> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# v1.99.0 (25 de Maio de 2026)

> Códigos de desconto cumulativos (até 20 por checkout, pagamento ou assinatura), sete novos e-mails de notificação para clientes sobre reembolsos e eventos do ciclo de vida da assinatura, reformulação da página de pagamento do checkout, aumentando as taxas de sucesso em 2–3%, reformulação do formulário de produto com visualização ao vivo e salvamento automático, e redesign das Configurações da empresa

## Novos Recursos

### 1. **Códigos de Desconto Empilhados**

Sessões de checkout, pagamentos, assinaturas e mudanças de plano agora aceitam **até 20 códigos de desconto em uma única solicitação** via o array `discount_codes`. Os códigos são aplicados **na ordem do array** — o primeiro código elegível reduz o preço base, o segundo reduz o preço já com desconto, e assim por diante — para que você possa sobrepor campanhas sem criar códigos combinados personalizados.

<Frame>
  <img src="https://mintcdn.com/dodopayments/Ehnri26kKx69Tfxe/images/changelog/v1.99.0/stacked-discounts.png?fit=max&auto=format&n=Ehnri26kKx69Tfxe&q=85&s=7a2606d7027de6e662cf9be6b7df8213" alt="Diálogo de confirmação de mudança de plano com vários códigos de desconto empilhados" style={{ maxHeight: '500px', width: 'auto' }} width="1132" height="1023" data-path="images/changelog/v1.99.0/stacked-discounts.png" />
</Frame>

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [{ product_id: 'pdt_abc', quantity: 1 }],
  discount_codes: ['WELCOME10', 'BLACKFRIDAY20'], // applied in this order
  customer: { email: 'user@example.com' },
  return_url: 'https://yoursite.com/return'
});
```

**Onde se aplica**

| Superfície          | Campo            | Máx. de códigos |
| ------------------- | ---------------- | --------------- |
| Sessões de Checkout | `discount_codes` | 20              |
| Pagamentos          | `discount_codes` | 20              |
| Assinaturas         | `discount_codes` | 20              |
| Mudanças de Plano   | `discount_codes` | 20              |

**Comportamento de mudança de plano**

| Valor `discount_codes`      | Efeito                                                                                             |
| --------------------------- | -------------------------------------------------------------------------------------------------- |
| Não fornecido               | Descontos existentes com `preserve_on_plan_change=true` são mantidos se aplicáveis ao novo produto |
| `[]` (array vazio)          | Todos os descontos existentes são removidos da assinatura                                          |
| `['CODE_A', 'CODE_B', ...]` | Substitui qualquer desconto existente com este conjunto empilhado, aplicado na ordem do array      |

**Formato de resposta**

O conjunto completo de descontos aplicados é retornado sob o array `discounts` em pagamentos e assinaturas — cada entrada inclui `discount_id`, `position`, e `cycles_remaining` (para assinaturas). O campo singular legado `discount_id` está obsoleto, mas ainda presente para compatibilidade retroativa.

<Info>
  O campo singular `discount_code` está **obsoleto**, mas ainda é totalmente suportado — integrações existentes continuam a funcionar sem mudanças. Não pode ser combinado com `discount_codes` na mesma solicitação. Recomendamos migrar para `discount_codes` quando conveniente, mesmo para códigos únicos, para aproveitar o empilhamento e o formato de resposta mais rico.
</Info>

Saiba mais: [Códigos de Desconto](/features/discount-codes) | [Sessão de Checkout](/developer-resources/checkout-session) | [Mudanças de Plano](/developer-resources/subscription-upgrade-downgrade)

### 2. **Sete Novos E-mails de Notificação ao Cliente**

Sete novos e-mails transacionais são agora enviados automaticamente aos seus clientes, cobrindo confirmações de reembolso, marcos do ciclo de vida da assinatura e falhas de pagamento. Cada e-mail pode ser alternado independentemente em **Configurações → Comunicação** na seção **E-mails do Cliente**.

<Frame>
  <img src="https://mintcdn.com/dodopayments/Ehnri26kKx69Tfxe/images/changelog/v1.99.0/customer-notification-emails.png?fit=max&auto=format&n=Ehnri26kKx69Tfxe&q=85&s=44cad42723269d9728a9dae2a061613b" alt="Painel de configurações de E-mails do Cliente com alternâncias para cada e-mail de notificação" style={{ maxHeight: '500px', width: 'auto' }} width="1694" height="1020" data-path="images/changelog/v1.99.0/customer-notification-emails.png" />
</Frame>

**Opt-in (ativado por padrão)**

| E-mail                                                              | Quando é acionado                                                                         |
| ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| **Reembolso Bem-sucedido**                                          | Um reembolso é processado com sucesso e os fundos estão a caminho de volta para o cliente |
| **Fim do Período de Avaliação da Assinatura**                       | \~2 dias antes de um período de avaliação expirar e ocorrer a primeira cobrança           |
| **Assinatura Cancelada Imediatamente**                              | Uma assinatura é cancelada com efeito imediato                                            |
| **Assinatura Programada para Cancelar na Próxima Data de Cobrança** | Uma assinatura está programada para cancelar no final do período de cobrança atual        |

**Opt-out (desativado por padrão)**

| E-mail                               | Quando é acionado                                                                                                                                              |
| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Falha no Pagamento**               | Uma tentativa de pagamento falhou — ative se você deseja que o Dodo Payments notifique o cliente diretamente ao invés de lidar com isso no seu próprio sistema |
| **Falha na Renovação da Assinatura** | Um pagamento de renovação de assinatura falha especificamente; é acionado em vez de (e não junto com) o e-mail geral de Falha de Pagamento para renovações     |
| **Lembrete de Renovação Próxima**    | \~2 dias antes de uma assinatura renovar                                                                                                                       |

<Tip>
  Se você gerencia a comunicação com o cliente via webhooks, deixe os e-mails de opt-out desativados para evitar enviar notificações duplicadas para o mesmo evento.
</Tip>

<Note>
  Os e-mails de clientes são separados dos e-mails de notificação enviados para sua equipe. Desativar um e-mail de cliente não afeta as notificações da sua equipe para o mesmo evento.
</Note>

Saiba mais: [Preferências de Comunicação](/features/communication-preferences)

## Melhorias

### 3. **Reformulação da página de pagamento do checkout**

A página de pagamento do checkout foi substancialmente reformulada de ponta a ponta — layout mais compacto, carregamento percebido mais rápido, estados de validação mais claros e UX aprimorada para a entrada de dados do cartão. No conjunto, essas mudanças aumentaram as **taxas de sucesso observadas no checkout em aproximadamente 2–3%** em todo o tráfego global.

<div style={{ display: 'flex', gap: '16px', alignItems: 'flex-start', flexWrap: 'wrap' }}>
  <div style={{ flex: '1 1 280px', minWidth: '260px' }}>
    <Frame caption="Before">
      <img src="https://mintcdn.com/dodopayments/Ehnri26kKx69Tfxe/images/changelog/v1.99.0/checkout-payment-before.png?fit=max&auto=format&n=Ehnri26kKx69Tfxe&q=85&s=cd86eb287a4688e14bb01e836382744f" alt="Página de pagamento anterior do checkout" width="509" height="695" data-path="images/changelog/v1.99.0/checkout-payment-before.png" />
    </Frame>
  </div>

  <div style={{ flex: '1 1 280px', minWidth: '260px' }}>
    <Frame caption="After">
      <img src="https://mintcdn.com/dodopayments/Ehnri26kKx69Tfxe/images/changelog/v1.99.0/checkout-payment-after.png?fit=max&auto=format&n=Ehnri26kKx69Tfxe&q=85&s=4eb10926ab5a1a1c97ab4cbf16e78fb2" alt="Página de pagamento reformulada do checkout" width="1114" height="1612" data-path="images/changelog/v1.99.0/checkout-payment-after.png" />
    </Frame>
  </div>
</div>

O que mudou:

* **Interações mais fluidas com os campos** — autofocus, ordem de tabulação mais inteligente e navegação aprimorada pelo teclado no formulário do cartão
* **Estados de erro e carregamento mais limpos** — a validação inline aparece precisamente onde o cliente precisa agir, substituindo o padrão anterior de banner de erro no formulário inteiro
* **Renderização mais rápida** — skeletons e hidratação progressiva eliminam a breve oscilação de estado em branco em redes lentas
* **Aprimoramentos para dispositivos móveis** — áreas de toque, comportamento de rolagem e gerenciamento do teclado ajustados especificamente para o checkout em dispositivos móveis, onde agora está a maioria do tráfego

<Tip>
  Nenhuma alteração de integração é necessária. As sessões de checkout existentes passam a usar automaticamente a nova página de pagamento.
</Tip>

### 4. **Reformulação do formulário de produto**

Os fluxos de **criação**, **edição** e **duplicação** de produtos foram reconstruídos do zero em torno de uma experiência de formulário única e consistente.

<Frame>
  <img src="https://mintcdn.com/dodopayments/Ehnri26kKx69Tfxe/images/changelog/v1.99.0/product-form.png?fit=max&auto=format&n=Ehnri26kKx69Tfxe&q=85&s=12693e04457400a4aa33063ef0d73221" alt="Formulário de produto unificado com Detalhes básicos, Mídia e descrição, Preços e uma visualização ao vivo do checkout lado a lado" style={{ maxHeight: '500px', width: 'auto' }} width="1143" height="959" data-path="images/changelog/v1.99.0/product-form.png" />
</Frame>

Destaques:

* **Visualização ao vivo** — veja como seu produto aparece no checkout e no Customer Portal enquanto você o edita, lado a lado com o formulário
* **Salvamento automático** — os rascunhos são persistidos automaticamente, portanto sair da página ou perder a aba não significa mais perder seu trabalho
* **Editor Markdown** — as descrições de produtos agora oferecem suporte a um editor Markdown completo, com renderização ao vivo, visualizações de links e controles de formatação inline
* **Paridade no fluxo de duplicação** — duplicar um produto abre o mesmo formulário unificado já preenchido, em vez de uma caixa de diálogo simplificada, para que você possa ajustar todos os campos antes de salvar a cópia

<Tip>
  Use **Duplicar** para criar variantes regionais ou de faixas de preço de um produto existente sem inserir novamente descrições, metadados ou configurações de fulfillment.
</Tip>

### 5. **Redesign da página de Configurações da empresa**

A página **Configurações → Empresa** foi reformulada para facilitar a visualização da configuração e agilizar as atualizações. As configurações agora estão agrupadas em seções mais claras, com textos explicativos que descrevem o impacto de cada alternância antes de você ativá-la ou desativá-la.

Não há **alterações de comportamento** nas configurações existentes — apenas o layout, o agrupamento e as explicações ao redor foram aprimorados.

<Frame>
  <img src="https://mintcdn.com/dodopayments/Ehnri26kKx69Tfxe/images/changelog/v1.99.0/business-settings.png?fit=max&auto=format&n=Ehnri26kKx69Tfxe&q=85&s=7603e02f67bb05a590681400f1e3f4b5" alt="Página de Configurações da empresa reformulada, com seções agrupadas para informações da empresa, marcas, moeda, segurança e rastreamento" style={{ maxHeight: '500px', width: 'auto' }} width="1195" height="893" data-path="images/changelog/v1.99.0/business-settings.png" />
</Frame>

## Melhorias

* **A substituição de `credits_amount` agora é propagada corretamente para as rotas GET de sessão de checkout e link de pagamento** — quando uma sessão de checkout ou um link de pagamento era criado com uma substituição `credit_entitlements` específica do checkout, buscar essa sessão ou esse link via GET retornava o valor padrão `credits_amount` no nível do produto, em vez do valor substituído. Isso foi corrigido.
* **A ação de reembolso é desativada para pagamentos totalmente reembolsados** — o botão Reembolsar em um pagamento agora é desativado quando o pagamento é totalmente reembolsado, com uma tooltip explicando o motivo. Antes, o botão permanecia ativo e retornava um erro somente após o envio.
* Pequenas correções de bugs e melhorias de estabilidade em toda a plataforma
