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

## Moneda Adaptativa

La Moneda Adaptativa permite a los clientes pagar en su moneda local preferida, mejorando la confianza y las tasas de conversión.

### Cómo Funciona

1. **Habilitar**: Activa la Moneda Adaptativa desde **Configuración → Negocio**
2. **Seleccionar**: Los clientes pueden cambiar de moneda directamente en el pago
3. **Convertir**: Los precios se convierten dinámicamente usando tasas de cambio en tiempo real
4. **Mostrar**: La cantidad 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 el pago" 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 divisas compatibles, las tarifas de conversión y el manejo de reembolsos.
</Card>

## Pago en Múltiples Idiomas

Dodo Payments soporta múltiples idiomas en la página de pago, permitiendo a los clientes completar 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 el pago" style={{ maxHeight: '500px', width: '70%' }} width="794" height="858" data-path="images/checkout/c2.png" />
</Frame>

### Puntos Clave

* Selector de idioma disponible directamente en el pago
* Texto de la interfaz, etiquetas y mensajes del sistema están localizados
* Mejora la accesibilidad y la conversión internacional

### Idiomas Soportados

La página de pago 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 el checkout configurando el parámetro `force_language` al crear una sesión de checkout. Consulta la [API de sesiones de checkout](/developer-resources/checkout-session#14-forcing-a-language) para más detalles.
</Tip>

## Cálculo automático de impuestos

Los impuestos se calculan automáticamente en función de la ubicación de facturación del cliente, garantizando el cumplimiento de los requisitos de GST, IVA 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 monto 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á totalmente automatizado. No se requiere configuración manual para bienes digitales estándar y productos SaaS.
</Tip>

## Soporte para identificaciones fiscales de empresas

Para empresas registradas, el checkout permite que los clientes ingresen su identificación fiscal empresarial (por ejemplo, número de IVA/GST).

### Qué sucede cuando se ingresa una identificación fiscal

* Se valida la elegibilidad fiscal en tiempo real
* Se aplican exenciones de impuestos o reglas de inversión del sujeto pasivo según corresponda
* El monto del impuesto se actualiza instantáneamente en el checkout

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

<Info>
  Esto es especialmente útil para SaaS B2B y servicios digitales donde los clientes empresariales pueden ser elegibles para exenciones fiscales.
</Info>

## Códigos de descuento

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

### Experiencia en el checkout

1. El cliente introduce el código de descuento
2. El descuento se valida al instante
3. El precio actualizado y los ahorros 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="Entrada de código de descuento en el pago" style={{ maxHeight: '500px', width: '70%' }} width="794" height="858" data-path="images/checkout/c4.png" />
</Frame>

### Integración con la API

Pre-aplica uno o más códigos de descuento apilados o habilita el campo de entrada de descuento:

```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 un array de hasta 20 códigos que se apilan en orden. El campo singular `discount_code` está obsoleto pero aún funciona; las integraciones existentes no necesitan cambiar de inmediato. Migra a `discount_codes` cuando sea conveniente para usar apilamiento y la forma de respuesta más rica.
</Info>

<Card title="Discount Codes" icon="percent" href="/features/discount-codes">
  Aprende 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 usando nombres de código.
</Card>

## Recolección de Direcciones Inteligente

El proceso de pago soporta la entrada flexible de direcciones para una finalización más rápida.

### Opciones Disponibles

| Opción                                | Descripción                                                                                                                      |
| ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| **Autocompletar dirección de Google** | Selección rápida con autocompletar                                                                                               |
| **Entrada manual**                    | Control total para direcciones completas                                                                                         |
| **Selección de país**                 | Impulsa la lógica de impuestos y cumplimiento                                                                                    |
| **Dirección mínima**                  | Recoge solo el país (y el código postal donde se requiera por impuestos) — ver [Modo de Dirección Mínima](#minimal-address-mode) |

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

### Modo de Dirección Mínima

Para maximizar la conversión, habilita la recopilación mínima de direcciones para reducir la fricción en el proceso de pago. Cuando `minimal_address` está configurado en `true`, el pago solo recoge:

* **País** — siempre requerido para la determinación de impuestos
* **Código postal** — solo en regiones donde es necesario para el cálculo del IVA, GST o impuestos de venta

Se omiten todos los demás campos de dirección (calle, ciudad, estado), acelerando significativamente la finalización del pago.

<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 solo los campos de país y código postal en el pago" 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 completa de direcciones sigue siendo el valor predeterminado. Activa `minimal_address` para productos digitales y flujos SaaS donde no se requieran detalles completos de facturación.
</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 API de Sesiones de Pago.
</Card>

## Recopilación de Número de Teléfono

Controla si el campo de número de teléfono aparece en el pago — y si es obligatorio — usando las banderas de características de sesión de pago.

| Bandera                         | Predeterminado | Comportamiento                                                                                                 |
| ------------------------------- | -------------- | -------------------------------------------------------------------------------------------------------------- |
| `allow_phone_number_collection` | `true`         | Muestra el campo de número de teléfono en el formulario de pago                                                |
| `require_phone_number`          | `false`        | Hace que el campo de número de teléfono sea obligatorio (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 donde la recopilación de teléfonos está deshabilitada y el número de teléfono es obligatorio.
</Warning>

<Tip>
  Usa `require_phone_number` para SaaS B2B, industrias reguladas, o cualquier flujo donde necesites un canal de contacto verificado para soporte, revisión de fraude o cumplimiento.
</Tip>

## Campos Personalizados

Reúne información adicional de los clientes durante el pago definiendo campos personalizados en el formulario. Esto es útil para recopilar datos como el nombre de la empresa, tamaño del equipo, fuente de referencia, o cualquier otra información específica del negocio.

### Tipos de Campo Disponibles

| Tipo       | Descripción                                    |
| ---------- | ---------------------------------------------- |
| `text`     | Entrada 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 de opciones predefinidas             |
| `boolean`  | Alternar de 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 las cargas útiles de webhook (`payment.succeeded`, `subscription.active`) y en las respuestas de la API a través de la matriz `custom_field_responses`. Puedes definir hasta 5 campos personalizados por sesión de pago.
</Info>

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

## Aceptación de Política de Privacidad y Términos

Para asegurar la transparencia legal y de cumplimiento:

* Los enlaces a la [Política de Privacidad](https://dodopayments.com/privacy-policy) y [Términos para Compradores](https://dodopayments.com/buyer-terms) se muestran claramente en el pago
* Los clientes reconocen explícitamente estos antes de completar el pago

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

## Colección de Pagos

Las colecciones de productos permiten una experiencia de pago unificada donde los clientes pueden ver y seleccionar entre múltiples productos relacionados (por ejemplo, planes Starter, Pro, Enterprise) en un solo pago.

### Cómo Funciona

1. **Todos los productos mostrados**: Los clientes ven cada producto activo en la colección
2. **Primer producto preseleccionado**: El primer producto en la colección se selecciona automáticamente
3. **Comparar opciones**: Los clientes pueden comparar precios y características antes de elegir
4. **Selección única**: Después de seleccionar un producto, el pago procede con el flujo de pago estándar

### Creación de un Pago 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 utilizar `product_collection_id`, pasa una matriz `product_cart` vacía. No se pueden aplicar códigos de descuento previamente en la creación de la sesión.
</Warning>

<Card title="Product Collections" icon="layer-group" href="/features/product-collections">
  Aprende cómo crear y gestionar colecciones de productos para experiencias de pago unificadas.
</Card>

## Configuración de las Sesiones de Pago

Controla el comportamiento del pago usando la API de Sesiones de Pago:

```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 se redirigen a tu `return_url` con parámetros de consulta agregados automáticamente, incluidos `payment_id` o `subscription_id`, `status`, `email`, e `license_key` (si es aplicable). Consulta la [guía de Sesiones de Pago](/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 API para sesiones de pago.
  </Card>

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

## Personalización del Tema del Pago

Personaliza la apariencia de la página de pago para que coincida con tu marca usando el parámetro `customization.theme_config` al crear una sesión de pago a través de la API. Configura colores, fuentes, radio de borde y texto del botón para modos claros y oscuros.

<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 pago personalizada con tema" 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 temas de manera visual desde el panel de control con temas preconstruidos, tipografía, colores, y vista previa en vivo.
</Card>

<Info>
  Esta sección cubre la configuración del tema de la **API del lado del servidor** usando `customization.theme_config`. Si estás usando el **Checkout SDK** (pago superpuesto o inline), consulta la sección de personalización de temas en [Overlay Checkout](/developer-resources/overlay-checkout#theme-customization) que utiliza propiedades en 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 modo claro                                                    |
| `dark`               | Configuración de color para modo oscuro                                                   |
| `font_primary_url`   | URL para la fuente primaria                                                               |
| `font_secondary_url` | URL para la fuente secundaria                                                             |
| `font_size`          | Tamaño de la fuente: `xs`, `sm`, `md`, `lg`, `xl`, `2xl`                                  |
| `font_weight`        | Peso de la fuente: `normal`, `medium`, `bold`, `extraBold`                                |
| `radius`             | Radio de borde para elementos de UI (e.g., `4px`, `0.5rem`, `8px`)                        |
| `pay_button_text`    | Texto personalizado para el botón de pago (e.g., "Completar Compra", "Suscribirse Ahora") |

### Configuración de Colores (Modo Claro/Oscuro)

Cada modo (`light` y `dark`) soporta las siguientes propiedades de color:

| Propiedad                | Descripción                            |
| ------------------------ | -------------------------------------- |
| `bg_primary`             | Color de fondo primario                |
| `bg_secondary`           | Color de fondo secundario              |
| `text_primary`           | Color de texto primario                |
| `text_secondary`         | Color de texto secundario              |
| `text_placeholder`       | Color de texto de marcador de posición |
| `text_error`             | Color de texto de error                |
| `text_success`           | Color de texto de éxito                |
| `border_primary`         | Color de borde primario                |
| `border_secondary`       | Color de borde secundario              |
| `button_primary`         | Color de fondo del botón primario      |
| `button_primary_hover`   | Color de hover del botón primario      |
| `button_secondary`       | Color de fondo del botón secundario    |
| `button_secondary_hover` | Color de hover del botón secundario    |
| `button_text_primary`    | Color de texto del botón primario      |
| `button_text_secondary`  | Color de texto del botón secundario    |
| `input_focus_border`     | Color de borde de enfoque de entrada   |

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

  * Hex: `#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 nombrados: `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 necesitas especificar todas las propiedades de color. Cualquier propiedad no especificada utilizará los valores predeterminados del tema.
</Tip>
