> ## 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 mayo de 2026)

> Códigos de descuento acumulables (hasta 20 por checkout, pago o suscripción), siete nuevos correos electrónicos de notificación para clientes sobre reembolsos y eventos del ciclo de vida de las suscripciones, renovación de la página de pago del checkout que aumenta las tasas de éxito en un 2–3 %, rediseño del formulario de productos con vista previa en vivo y guardado automático, y rediseño de Business Settings

## Nuevas Funcionalidades

### 1. **Códigos de Descuento Apilados**

Las sesiones de checkout, pagos, suscripciones y cambios de plan ahora aceptan **hasta 20 códigos de descuento en una sola solicitud** a través del array `discount_codes`. Los códigos se aplican **en el orden del array** — el primer código elegible reduce el precio base, el segundo reduce el precio ya descontado, y así sucesivamente — por lo que puedes superponer campañas sin crear códigos combinados a medida.

<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 Confirmación de Cambio de Plan con múltiples códigos de descuento apilados" 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'
});
```

**Dónde se aplica**

| Superficie           | Campo            | Máximo de códigos |
| -------------------- | ---------------- | ----------------- |
| Sesiones de Checkout | `discount_codes` | 20                |
| Pagos                | `discount_codes` | 20                |
| Suscripciones        | `discount_codes` | 20                |
| Cambios de Plan      | `discount_codes` | 20                |

**Comportamiento de cambio de plan**

| Valor `discount_codes`      | Efecto                                                                                                        |
| --------------------------- | ------------------------------------------------------------------------------------------------------------- |
| No proporcionado            | Los descuentos existentes con `preserve_on_plan_change=true` se mantienen si son aplicables al nuevo producto |
| `[]` (array vacío)          | Todos los descuentos existentes se eliminan de la suscripción                                                 |
| `['CODE_A', 'CODE_B', ...]` | Reemplaza cualquier descuento existente con este conjunto apilado, aplicado en el orden del array             |

**Forma de la respuesta**

El conjunto completo de descuentos aplicados se devuelve bajo el array `discounts` en pagos y suscripciones — cada entrada incluye `discount_id`, `position`, e `cycles_remaining` (para suscripciones). El campo singular legado `discount_id` está obsoleto pero sigue presente para compatibilidad con versiones anteriores.

<Info>
  El campo singular `discount_code` está **obsoleto** pero sigue siendo totalmente compatible — las integraciones existentes continúan funcionando sin cambios. No se puede combinar con `discount_codes` en la misma solicitud. Recomendamos migrar a `discount_codes` cuando sea conveniente, incluso para códigos únicos, para aprovechar la apilamiento y la forma de respuesta más rica.
</Info>

Aprende más: [Códigos de Descuento](/features/discount-codes) | [Sesión de Checkout](/developer-resources/checkout-session) | [Cambios de Plan](/developer-resources/subscription-upgrade-downgrade)

### 2. **Siete Nuevos Correos Electrónicos de Notificación al Cliente**

Siete nuevos correos electrónicos transaccionales ahora se envían automáticamente a tus clientes, cubriendo confirmaciones de reembolsos, hitos del ciclo de vida de suscripciones y fallos de pago. Cada correo electrónico se puede activar de forma independiente desde **Configuración → Comunicación** en la sección **Correos Electrónicos al 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="Panel de configuración de Correos Electrónicos al Cliente con conmutadores para cada correo de notificación" style={{ maxHeight: '500px', width: 'auto' }} width="1694" height="1020" data-path="images/changelog/v1.99.0/customer-notification-emails.png" />
</Frame>

**Opcional (habilitado por defecto)**

| Correo Electrónico                                                          | Cuándo se envía                                                                            |
| --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| **Reembolso Exitoso**                                                       | Un reembolso se procesa con éxito y los fondos están de regreso para el cliente            |
| **Trial de Suscripción Finalizando**                                        | \~2 días antes de que expire un trial y ocurra el primer cargo de facturación              |
| **Suscripción Cancelada Inmediatamente**                                    | Una suscripción es cancelada con efecto inmediato                                          |
| **Suscripción Programada para Cancelar en la Próxima Fecha de Facturación** | Una suscripción está programada para cancelarse al final del período de facturación actual |

**Opcional hacia fuera (desactivado por defecto)**

| Correo Electrónico                     | Cuándo se envía                                                                                                                                            |
| -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Pago Fallido**                       | Un intento de pago falla — habilita si quieres que Dodo Payments notifique al cliente directamente en lugar de hacerlo en tu propio sistema                |
| **Renovación de Suscripción Fallida**  | Un pago de renovación de suscripción falla específicamente; se envía en lugar de (no además de) el correo general de Pago Fallido para pagos de renovación |
| **Recordatorio de Renovación Próxima** | \~2 días antes de que una suscripción se renueve                                                                                                           |

<Tip>
  Si gestionas la comunicación con el cliente por ti mismo a través de webhooks, deja los correos electrónicos opcionales hacia fuera desactivados para evitar enviar notificaciones duplicadas al cliente para el mismo evento.
</Tip>

<Note>
  Los correos electrónicos al cliente son independientes de los correos de notificación enviados a tu equipo. Desactivar un correo electrónico al cliente no afecta las notificaciones de tu equipo para el mismo evento.
</Note>

Aprende más: [Preferencias de Comunicación](/features/communication-preferences)

## Mejoras

### 3. **Renovación de la página de pago del checkout**

La página de pago del checkout se ha renovado sustancialmente de principio a fin: diseño más compacto, carga percibida más rápida, estados de validación más claros y una UX mejorada para la introducción de datos de tarjeta. En conjunto, estos cambios aumentaron las **tasas de éxito observadas del checkout en aproximadamente un 2–3 %** en el tráfico 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 pago anterior del 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 pago rediseñada del checkout" width="1114" height="1612" data-path="images/changelog/v1.99.0/checkout-payment-after.png" />
    </Frame>
  </div>
</div>

Qué ha cambiado:

* **Interacciones más fluidas con los campos** — enfoque automático, orden de tabulación más inteligente y navegación mejorada con el teclado en el formulario de tarjeta
* **Estados de error y carga más claros** — la validación en línea aparece exactamente donde el cliente debe actuar, reemplazando el patrón anterior de un banner de error para todo el formulario
* **Renderizado más rápido** — los skeletons y la hidratación progresiva eliminan el breve parpadeo del estado en blanco en redes lentas
* **Mejoras para móviles** — objetivos táctiles, comportamiento del desplazamiento y gestión del teclado ajustados específicamente para el checkout móvil, donde ahora se concentra la mayoría del tráfico

<Tip>
  No se requieren cambios de integración. Las sesiones de checkout existentes adoptan automáticamente la nueva página de pago.
</Tip>

### 4. **Rediseño del formulario de productos**

Los flujos de **creación**, **edición** y **duplicación** de productos se han reconstruido desde cero en torno a una experiencia de formulario única y coherente.

<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="Formulario de producto unificado con Detalles básicos, Multimedia y descripción, Precios y una vista previa del checkout en vivo, uno junto al otro" style={{ maxHeight: '500px', width: 'auto' }} width="1143" height="959" data-path="images/changelog/v1.99.0/product-form.png" />
</Frame>

Aspectos destacados:

* **Vista previa en vivo** — observa cómo aparece tu producto en el checkout y Customer Portal mientras lo editas, junto al formulario
* **Guardado automático** — los borradores se guardan automáticamente, por lo que salir de la página o perder la pestaña ya no implica perder tu trabajo
* **Editor de Markdown** — las descripciones de productos ahora admiten un editor completo de Markdown con renderizado en vivo, vistas previas de enlaces y controles de formato en línea
* **Paridad en el flujo de duplicación** — al duplicar un producto se abre el mismo formulario unificado ya rellenado, en lugar de un cuadro de diálogo simplificado, para que puedas ajustar todos los campos antes de guardar la copia

<Tip>
  Usa **Duplicate** para crear variantes regionales o por nivel de precios de un producto existente sin volver a introducir descripciones, metadatos ni la configuración de fulfilment.
</Tip>

### 5. **Rediseño de la página Business Settings**

La página **Settings → Business** se ha rediseñado para que sea más fácil revisar la configuración y actualizarla más rápidamente. Ahora los ajustes están agrupados en secciones más claras, con textos explicativos que describen el impacto de cada opción antes de activarla o desactivarla.

No hay **cambios de comportamiento** en los ajustes existentes; solo han mejorado el diseño, la agrupación y las explicaciones complementarias.

<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 Business Settings rediseñada con secciones agrupadas para información empresarial, marcas, moneda, seguridad y seguimiento" style={{ maxHeight: '500px', width: 'auto' }} width="1195" height="893" data-path="images/changelog/v1.99.0/business-settings.png" />
</Frame>

## Mejoras

* **La sobrescritura `credits_amount` ahora se propaga correctamente a las rutas GET de sesiones de checkout y enlaces de pago** — cuando se creaba una sesión de checkout o un enlace de pago con una sobrescritura `credit_entitlements` específica del checkout, al obtener esa sesión o enlace mediante GET se devolvía el valor predeterminado `credits_amount` a nivel de producto en lugar del valor sobrescrito. Esto ya está solucionado.
* **Acción de reembolso desactivada para pagos totalmente reembolsados** — el botón Refund de un pago ahora se desactiva cuando el pago se ha reembolsado por completo, con un tooltip que explica el motivo. Antes, el botón permanecía activo y devolvía un error solo después del envío.
* Correcciones menores de errores y mejoras de estabilidad en toda la plataforma
