> ## 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.

# Características de Finalización de Compra

> Finalización de compra optimizada para la conversión, compatible a nivel global, con soporte para múltiples monedas, múltiples idiomas, cálculo automático de impuestos, códigos de descuento, complementos y recolección inteligente de direcciones.

<Frame>
  <img src="https://mintcdn.com/dodopayments/Vafy52417ELLVDIx/images/checkout/cover.png?fit=max&auto=format&n=Vafy52417ELLVDIx&q=85&s=2dc0a0db8e021e39fb17e84fc12eb5f9" alt="Página de pago" style={{ maxHeight: '500px', width: 'auto' }} width="2844" height="1556" data-path="images/checkout/cover.png" />
</Frame>

<Info>
  La pasarela de pago de Dodo Payments está optimizada para la conversión y cumple con normativas globales, diseñada para productos digitales y empresas SaaS. Admite múltiples divisas, idiomas, impuestos, descuentos, complementos y flujos de cumplimiento orientados a negocios.
</Info>

<CardGroup cols={2}>
  <Card title="Checkout Sessions API" icon="code" href="/api-reference/checkout-sessions/create">
    Crea sesiones de pago alojadas de forma programática.
  </Card>

  <Card title="Preview Checkout" icon="eye" href="/api-reference/checkout-sessions/preview">
    Calcula precios e impuestos antes de crear una sesión.
  </Card>

  <Card title="Payment Methods" icon="credit-card" href="/features/payment-methods">
    Métodos de pago admitidos y opciones de configuración.
  </Card>
</CardGroup>

<Note>
  Los enlaces de Checkout generados mediante la [Checkout Sessions API](/api-reference/checkout-sessions/create) no son reutilizables y caducan en un plazo de 24 horas. Genera una sesión nueva para cada cliente y cada intento de pago.
</Note>

## Adaptive Currency

Adaptive Currency permite a los clientes pagar en su moneda local preferida, lo que mejora la confianza y las tasas de conversión.

### Cómo funciona

1. **Activar**: Activa Adaptive Currency desde **Settings → Business**
2. **Seleccionar**: Los clientes pueden cambiar de moneda directamente en Checkout
3. **Convertir**: Los precios se convierten dinámicamente usando tipos de cambio en tiempo real
4. **Mostrar**: El importe final a pagar se muestra de forma transparente antes del pago

<Frame>
  <img src="https://mintcdn.com/dodopayments/Vafy52417ELLVDIx/images/checkout/c1.png?fit=max&auto=format&n=Vafy52417ELLVDIx&q=85&s=c2f9ee4b1748448d4ab7ab23954dcc64" alt="Selector de moneda en Checkout" style={{ maxHeight: '500px', width: '70%' }} width="794" height="858" data-path="images/checkout/c1.png" />
</Frame>

<Card title="Adaptive Currency" icon="money-bill-transfer" href="/features/adaptive-currency">
  Obtén más información sobre las monedas admitidas, las comisiones de conversión y la gestión de reembolsos.
</Card>

## Checkout multilingüe

Dodo Payments admite varios idiomas en la página de Checkout, lo que permite a los clientes completar los pagos en un idioma con el que se sientan cómodos.

<Frame>
  <img src="https://mintcdn.com/dodopayments/Vafy52417ELLVDIx/images/checkout/c2.png?fit=max&auto=format&n=Vafy52417ELLVDIx&q=85&s=ecc6eb8db604e37433d8797c51768577" alt="Selector de idioma en Checkout" style={{ maxHeight: '500px', width: '70%' }} width="794" height="858" data-path="images/checkout/c2.png" />
</Frame>

### Aspectos destacados

* Selector de idioma disponible directamente en Checkout
* El texto de la interfaz, las etiquetas y los mensajes del sistema están localizados
* Mejora la accesibilidad y la conversión internacional

### Idiomas admitidos

La página de Checkout admite 21 idiomas:

| Idioma     | Código |
| ---------- | ------ |
| Árabe      | `ar`   |
| Catalán    | `ca`   |
| Chino      | `zh`   |
| Neerlandés | `nl`   |
| Inglés     | `en`   |
| Francés    | `fr`   |
| Alemán     | `de`   |
| Hebreo     | `he`   |
| Indonesio  | `id`   |
| Italiano   | `it`   |
| Japonés    | `ja`   |
| Coreano    | `ko`   |
| Malayo     | `ms`   |
| Polaco     | `pl`   |
| Portugués  | `pt`   |
| Rumano     | `ro`   |
| Ruso       | `ru`   |
| Español    | `es`   |
| Sueco      | `sv`   |
| Tailandés  | `th`   |
| Turco      | `tr`   |

<Tip>
  Puedes forzar un idioma específico en Checkout estableciendo el parámetro `force_language` al crear una sesión de Checkout. Consulta la [Checkout Sessions API](/developer-resources/checkout-session#14-forcing-a-language) para obtener más información.
</Tip>

## Cálculo automático de impuestos

Los impuestos se calculan automáticamente según la ubicación de facturación del cliente, lo que garantiza el cumplimiento de los requisitos de GST, VAT e impuestos sobre las ventas sin configuración manual.

### Cómo funciona el cálculo de impuestos

<Steps>
  <Step title="Location Detection">
    Las reglas fiscales se aplican según el país del cliente (y la región, cuando corresponde).
  </Step>

  <Step title="Dynamic Updates">
    El importe del impuesto se actualiza automáticamente cuando:

    * Cambia el país
    * Se actualiza la dirección
  </Step>

  <Step title="Transparent Display">
    El desglose final de impuestos se muestra claramente antes del pago.
  </Step>
</Steps>

<Tip>
  El cálculo de impuestos está completamente automatizado. No se requiere configuración manual para productos digitales y productos SaaS estándar.
</Tip>

## Compatibilidad con Business Tax ID

Para empresas registradas, Checkout permite a los clientes introducir su Business Tax ID (por ejemplo, el número de VAT/GST).

### Qué ocurre al introducir un Tax ID

* La elegibilidad fiscal se valida en tiempo real
* Se aplican las exenciones fiscales o las reglas de inversión del sujeto pasivo correspondientes
* El importe del impuesto se actualiza al instante en Checkout

<Frame>
  <img src="https://mintcdn.com/dodopayments/Vafy52417ELLVDIx/images/checkout/c3.png?fit=max&auto=format&n=Vafy52417ELLVDIx&q=85&s=76451fed5636a6ef3e5c3ec7f6a96c9f" alt="Introducción del Business Tax ID en Checkout" style={{ maxHeight: '500px', width: '70%' }} width="1440" height="1716" data-path="images/checkout/c3.png" />
</Frame>

<Info>
  Esto resulta especialmente útil para SaaS B2B y servicios digitales en los que los clientes empresariales pueden optar a exenciones fiscales.
</Info>

## Códigos de descuento

Los clientes pueden aplicar directamente en la página de Checkout los códigos de descuento o promocionales que hayas creado en el dashboard.

### Experiencia de Checkout

1. El cliente introduce el código de descuento
2. El descuento se valida al instante
3. El precio actualizado y el ahorro se muestran claramente

<Frame>
  <img src="https://mintcdn.com/dodopayments/Vafy52417ELLVDIx/images/checkout/c4.png?fit=max&auto=format&n=Vafy52417ELLVDIx&q=85&s=639dcc94ddd1b41fdd6ff200c2a28e47" alt="Introducción del código de descuento en Checkout" style={{ maxHeight: '500px', width: '70%' }} width="794" height="858" data-path="images/checkout/c4.png" />
</Frame>

### Integración de API

Preaplica uno o varios códigos de descuento acumulables o activa el campo de entrada de descuentos:

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [
    { product_id: 'prod_abc', quantity: 1 }
  ],
  discount_codes: ['WELCOME20'], // Pre-apply one or more codes (max 20, applied in order)
  feature_flags: {
    allow_discount_code: true // Show discount input field
  },
  return_url: 'https://yoursite.com/return'
});
```

<Info>
  `discount_codes` acepta una matriz de hasta 20 códigos que se acumulan en orden. El campo singular `discount_code` está obsoleto, pero sigue funcionando; las integraciones existentes no necesitan cambiar de inmediato. Migra a `discount_codes` cuando te resulte conveniente para utilizar la acumulación y la estructura de respuesta más completa.
</Info>

<Card title="Discount Codes" icon="percent" href="/features/discount-codes">
  Obtén información sobre cómo crear y gestionar códigos de descuento.
</Card>

<Card title="Validate Discount by Code" icon="tag" href="/api-reference/discounts/get-discount-by-code">
  Busca y valida descuentos mediante nombres de código.
</Card>

## Recopilación inteligente de direcciones

Checkout admite una introducción flexible de direcciones para agilizar la finalización.

### Opciones disponibles

| Opción                                      | Descripción                                                                                                                                          |
| ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Autocompletado de direcciones de Google** | Selección rápida con autocompletado                                                                                                                  |
| **Introducción manual**                     | Control total para direcciones completas                                                                                                             |
| **Selección de país**                       | Determina la lógica fiscal y de cumplimiento                                                                                                         |
| **Dirección mínima**                        | Recopila únicamente el país (y el código postal cuando sea necesario para los impuestos); consulta [Modo de dirección mínima](#minimal-address-mode) |

<Tip>
  La recopilación de direcciones equilibra la velocidad, la precisión y la cobertura global para maximizar la conversión y garantizar el cumplimiento.
</Tip>

### Modo de dirección mínima

Para maximizar la conversión, activa la recopilación de direcciones mínima para reducir la fricción en Checkout. Cuando `minimal_address` se establece en `true`, Checkout solo recopila:

* **País** — siempre necesario para determinar los impuestos
* **Código postal** — únicamente en las regiones donde sea necesario para calcular el impuesto sobre las ventas, el VAT o el GST

El resto de los campos de dirección (calle, ciudad y estado) se omiten, lo que acelera considerablemente la finalización de Checkout.

<Frame>
  <img src="https://mintcdn.com/dodopayments/7dyPZdWH7JucnLrT/images/changelog/minimal-address.png?fit=max&auto=format&n=7dyPZdWH7JucnLrT&q=85&s=cd0e5d6f8c32e052c7ab93a88d841fb8" alt="Modo de dirección mínima que muestra únicamente los campos de país y código postal en Checkout" style={{ maxHeight: '500px', width: 'auto' }} width="1459" height="817" data-path="images/changelog/minimal-address.png" />
</Frame>

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [
    { product_id: 'prod_abc', quantity: 1 }
  ],
  minimal_address: true,
  return_url: 'https://yoursite.com/return'
});
```

<Info>
  La recopilación de la dirección completa sigue siendo la opción predeterminada. Activa `minimal_address` para productos digitales y flujos SaaS en los que no se requieren datos de facturación completos.
</Info>

<Card title="Minimal Address Reference" icon="address-card" href="/developer-resources/checkout-session#request-body">
  Consulta la referencia completa del parámetro `minimal_address` en la guía de Checkout Sessions API.
</Card>

## Recopilación del número de teléfono

Controla si el campo del número de teléfono aparece en Checkout y si es obligatorio mediante las feature flags de la sesión de Checkout.

| Indicador                       | Predeterminado | Comportamiento                                                                                          |
| ------------------------------- | -------------- | ------------------------------------------------------------------------------------------------------- |
| `allow_phone_number_collection` | `true`         | Muestra el campo del número de teléfono en el formulario de Checkout                                    |
| `require_phone_number`          | `false`        | Hace obligatorio el campo del número de teléfono (la validación del formulario exige un valor no vacío) |

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [{ product_id: 'prod_abc', quantity: 1 }],
  feature_flags: {
    allow_phone_number_collection: true,
    require_phone_number: true
  },
  return_url: 'https://yoursite.com/return'
});
```

<Warning>
  `require_phone_number: true` requiere `allow_phone_number_collection: true`. La API rechaza las sesiones en las que la recopilación del teléfono está desactivada mientras el número de teléfono es obligatorio.
</Warning>

<Tip>
  Usa `require_phone_number` para SaaS B2B, sectores regulados o cualquier flujo en el que necesites un canal de contacto verificado para soporte, revisión de fraude o cumplimiento.
</Tip>

## Campos personalizados

Recopila información adicional de los clientes durante Checkout definiendo campos de formulario personalizados. Esto resulta útil para obtener datos como el nombre de la empresa, el tamaño del equipo, la fuente de referencia o cualquier otra información específica de la empresa.

### Tipos de campo disponibles

| Tipo       | Descripción                                    |
| ---------- | ---------------------------------------------- |
| `text`     | Campo de texto de una sola línea               |
| `number`   | Entrada numérica                               |
| `email`    | Dirección de correo electrónico con validación |
| `url`      | URL con validación                             |
| `date`     | Selector de fecha                              |
| `dropdown` | Selección entre opciones predefinidas          |
| `boolean`  | Selector Sí/No                                 |

### Ejemplo

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [
    { product_id: 'prod_abc', quantity: 1 }
  ],
  custom_fields: [
    {
      key: 'company_name',
      label: 'Company Name',
      field_type: 'text',
      required: true
    },
    {
      key: 'team_size',
      label: 'Team Size',
      field_type: 'dropdown',
      required: true,
      options: ['1-10', '11-50', '51-200', '200+']
    }
  ],
  return_url: 'https://yoursite.com/return'
});
```

<Info>
  Las respuestas de los clientes se incluyen automáticamente en los payloads de webhook (`payment.succeeded`, `subscription.active`) y en las respuestas de la API mediante la matriz `custom_field_responses`. Puedes definir hasta 5 campos personalizados por sesión de Checkout.
</Info>

<Card title="Custom Fields Guide" icon="input-text" href="/developer-resources/checkout-session#15-collecting-custom-fields">
  Obtén más información sobre la configuración de campos personalizados y el acceso a las respuestas.
</Card>

## Aceptación de la política de privacidad y los términos

Para garantizar la transparencia legal y de cumplimiento:

* Los enlaces a la [Política de privacidad](https://dodopayments.com/privacy-policy) y los [Términos del comprador](https://dodopayments.com/buyer-terms) se muestran claramente en Checkout
* Los clientes deben aceptar explícitamente estos documentos antes de completar el pago

<Info>
  Esto ayuda a cumplir los requisitos globales de protección del consumidor y privacidad de datos, incluido el cumplimiento del RGPD.
</Info>

## Checkout de colecciones

Product Collections permiten una experiencia de Checkout unificada en la que los clientes pueden ver y seleccionar varios productos relacionados (por ejemplo, los planes Starter, Pro y Enterprise) en un único Checkout.

### Cómo funciona

1. **Todos los productos se muestran**: Los clientes ven cada producto activo de la colección
2. **Primer producto preseleccionado**: El primer producto de la colección se selecciona automáticamente
3. **Comparar opciones**: Los clientes pueden comparar precios y funciones antes de elegir
4. **Selección única**: Tras seleccionar un producto, Checkout continúa con el flujo de pago estándar

### Crear un Checkout de colección

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_collection_id: 'pdc_abc123',
  product_cart: [], // Required: pass an empty array for collection checkout
  return_url: 'https://yoursite.com/return'
});
```

<Warning>
  Al usar `product_collection_id`, pasa una matriz `product_cart` vacía. Los códigos de descuento no pueden preaplicarse al crear la sesión.
</Warning>

<Card title="Product Collections" icon="layer-group" href="/features/product-collections">
  Obtén información sobre cómo crear y gestionar colecciones de productos para experiencias de Checkout unificadas.
</Card>

## Configuración de la sesión de Checkout

Controla el comportamiento de Checkout mediante Checkout Sessions API:

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [
    { product_id: 'prod_abc', quantity: 1 }
  ],
  customer: {
    email: 'customer@example.com',
    name: 'Jane Doe'
  },
  billing_currency: 'EUR', // Set specific currency
  discount_codes: ['PROMO10'],
  feature_flags: {
    allow_discount_code: true
  },
  return_url: 'https://yoursite.com/return',
  cancel_url: 'https://yoursite.com/pricing', // Optional: where to redirect on cancel
  metadata: {
    order_ref: 'ORD-12345'
  }
});
```

<Info>
  Después del pago, los clientes son redirigidos a tu `return_url` con parámetros de consulta añadidos automáticamente, incluidos `payment_id` o `subscription_id`, `status`, `email` y `license_key` (si corresponde). Consulta la [guía de Checkout Sessions](/developer-resources/checkout-session#request-body) para ver la lista completa.
</Info>

<CardGroup cols={2}>
  <Card title="Checkout Sessions API" icon="code" href="/api-reference/checkout-sessions/create">
    Referencia completa de la API para las sesiones de Checkout.
  </Card>

  <Card title="Checkout Integration Guide" icon="book" href="/developer-resources/checkout-session">
    Guía paso a paso para integrar Checkout.
  </Card>
</CardGroup>

## Personalización del tema de Checkout

Personaliza el aspecto de la página de Checkout para adaptarlo a tu marca mediante el parámetro `customization.theme_config` al crear una sesión de Checkout mediante la API. Configura colores, fuentes, radio de los bordes y texto de los botones para los modos claro y oscuro.

<Frame>
  <img src="https://mintcdn.com/dodopayments/rTHkQICkStFgSdh-/images/checkout/theme-example.png?fit=max&auto=format&n=rTHkQICkStFgSdh-&q=85&s=5277b69d67c90fd87e7c5d9c125fee12" alt="Página de Checkout con tema personalizado" style={{ maxHeight: '500px', width: 'auto' }} width="2856" height="1490" data-path="images/checkout/theme-example.png" />
</Frame>

<Card title="Design & Theme Customization" icon="palette" href="/features/design">
  Configura visualmente los temas desde el dashboard con temas prediseñados, tipografía, colores y vista previa en tiempo real.
</Card>

<Info>
  Esta sección explica la configuración del tema mediante la **API del servidor** usando `customization.theme_config`. Si utilizas el **Checkout SDK** (Checkout superpuesto o integrado), consulta la sección de personalización del tema en [Overlay Checkout](/developer-resources/overlay-checkout#theme-customization), que utiliza propiedades camelCase (por ejemplo, `bgPrimary` en lugar de `bg_primary`).
</Info>

### Opciones de configuración del tema

| Propiedad            | Descripción                                                                                      |
| -------------------- | ------------------------------------------------------------------------------------------------ |
| `light`              | Configuración de color para el modo claro                                                        |
| `dark`               | Configuración de color para el modo oscuro                                                       |
| `font_primary_url`   | URL de la fuente principal                                                                       |
| `font_secondary_url` | URL de la fuente secundaria                                                                      |
| `font_size`          | Tamaño de fuente: `xs`, `sm`, `md`, `lg`, `xl`, `2xl`                                            |
| `font_weight`        | Peso de fuente: `normal`, `medium`, `bold`, `extraBold`                                          |
| `radius`             | Radio de los bordes de los elementos de la interfaz (por ejemplo, `4px`, `0.5rem`, `8px`)        |
| `pay_button_text`    | Texto personalizado para el botón de pago (por ejemplo, "Completar compra", "Suscribirse ahora") |

### Configuración de colores (modo claro/oscuro)

Cada modo (`light` e `dark`) admite las siguientes propiedades de color:

| Propiedad                | Descripción                                   |
| ------------------------ | --------------------------------------------- |
| `bg_primary`             | Color principal del fondo                     |
| `bg_secondary`           | Color secundario del fondo                    |
| `text_primary`           | Color principal del texto                     |
| `text_secondary`         | Color secundario del texto                    |
| `text_placeholder`       | Color del texto de marcador de posición       |
| `text_error`             | Color del texto de error                      |
| `text_success`           | Color del texto de éxito                      |
| `border_primary`         | Color principal del borde                     |
| `border_secondary`       | Color secundario del borde                    |
| `button_primary`         | Color de fondo del botón principal            |
| `button_primary_hover`   | Color del botón principal al pasar el cursor  |
| `button_secondary`       | Color de fondo del botón secundario           |
| `button_secondary_hover` | Color del botón secundario al pasar el cursor |
| `button_text_primary`    | Color del texto del botón principal           |
| `button_text_secondary`  | Color del texto del botón secundario          |
| `input_focus_border`     | Color del borde al enfocar una entrada        |

<Info>
  Todos los campos de color aceptan formatos de color CSS estándar:

  * Hexadecimal: `#fff`, `#ffffff`, `#ffffffff`
  * RGB/RGBA: `rgb(255, 255, 255)`, `rgba(255, 255, 255, 0.5)`
  * HSL/HSLA: `hsl(120, 100%, 50%)`, `hsla(120, 100%, 50%, 0.5)`
  * Colores con nombre: `red`, `blue`, `transparent`
</Info>

### Ejemplo

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [
    { product_id: 'prod_abc', quantity: 1 }
  ],
  customization: {
    theme_config: {
      // Custom fonts
      font_primary_url: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap',
      font_size: 'md',
      font_weight: 'medium',
      radius: '8px',
      pay_button_text: 'Complete Purchase',
      
      // Light mode colors
      light: {
        bg_primary: '#ffffff',
        bg_secondary: '#f5f5f5',
        text_primary: '#1a1a1a',
        text_secondary: '#666666',
        button_primary: '#0066ff',
        button_primary_hover: '#0052cc',
        button_text_primary: '#ffffff',
        border_primary: '#e0e0e0'
      },
      
      // Dark mode colors
      dark: {
        bg_primary: '#1a1a1a',
        bg_secondary: '#2d2d2d',
        text_primary: '#ffffff',
        text_secondary: '#a0a0a0',
        button_primary: '#3385ff',
        button_primary_hover: '#4d99ff',
        button_text_primary: '#ffffff',
        border_primary: '#404040'
      }
    }
  },
  return_url: 'https://yoursite.com/return'
});
```

<Tip>
  No es necesario especificar todas las propiedades de color. Las propiedades no especificadas utilizarán los valores del tema predeterminado.
</Tip>
