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

# Embed SDK

> Integra el proceso de pago de Komerza directamente en tu sitio web con nuestro ligero Embed SDK

<img className="block dark:hidden" src="https://mintcdn.com/komerza/8H1g8ttpSLWwGTJO/images/embeds-light.png?fit=max&auto=format&n=8H1g8ttpSLWwGTJO&q=85&s=490cb3faf8eeaada1fbea996fb8df3b2" alt="Komerza Embed SDK en acción" width="3456" height="1824" data-path="images/embeds-light.png" />

<img className="hidden dark:block" src="https://mintcdn.com/komerza/8H1g8ttpSLWwGTJO/images/embeds-dark.png?fit=max&auto=format&n=8H1g8ttpSLWwGTJO&q=85&s=c458ff48dd8a7aea126d8f47b39f3021" alt="Komerza Embed SDK en acción" width="3456" height="1824" data-path="images/embeds-dark.png" />

## Descripción general

El Komerza Embed SDK te permite integrar de forma transparente nuestra experiencia de pago directamente en tu sitio web. En lugar de redirigir a los clientes a una página de pago separada, el embed crea una superposición modal que mantiene a los usuarios en tu sitio mientras proporciona un flujo de pago seguro y optimizado.

<Card title="Demo en vivo" icon="laptop-binary" href="https://checkout.komerza.com/embed/demo.html">
  Ve el Embed SDK en acción con nuestra demo interactiva
</Card>

<Note>
  También integra nuestro script de análisis para recuperar análisis de
  visitantes en tu sitio personalizado para obtener información completa sobre
  el recorrido del cliente.
</Note>

## Características

<CardGroup cols={2}>
  <Card title="Integración transparente" icon="puzzle-piece">
    La superposición modal mantiene a los clientes en tu sitio durante el pago
  </Card>

  {" "}

  <Card title="Ligero" icon="feather">
    Paquete JavaScript mínimo sin dependencias externas
  </Card>

  {" "}

  <Card title="Soporte de temas" icon="palette">
    Temas claro, oscuro y automático para combinar con el diseño de tu sitio
  </Card>

  <Card title="Compatible con CSP" icon="shield">
    Soporte completo de política de seguridad de contenido con integración de nonce
  </Card>
</CardGroup>

## Inicio rápido

Agrega el siguiente script al `<head>` de tu sitio web o antes de la etiqueta de cierre `</body>`:

```html theme={null}
<script src="https://checkout.komerza.com/embed/embed.iife.js" defer></script>
```

### Método 1: Atributos de datos (Recomendado para casos simples)

La forma más fácil de agregar botones de pago a tu sitio. Solo agrega atributos de datos a cualquier botón o elemento:

```html theme={null}
<button
  data-kmrza-product-id="YOUR_PRODUCT_ID"
  data-kmrza-variant-id="YOUR_VARIANT_ID"
  data-kmrza-quantity="1"
  data-kmrza-theme="auto"
>
  Comprar ahora
</button>

<script src="https://checkout.komerza.com/embed/embed.iife.js" defer></script>
<script>
  // Inicializar el embed para vincular todos los botones con atributos de datos
  document.addEventListener("DOMContentLoaded", () => {
    Komerza.init();
  });
</script>
```

#### Referencia de atributos de datos

| Atributo                 | Requerido | Descripción                                                     | Ejemplo                                       |
| ------------------------ | --------- | --------------------------------------------------------------- | --------------------------------------------- |
| `data-kmrza-product-id`  | ✅ Sí      | El ID del producto de Komerza                                   | `"0f6294be-25d6-4ced-96df-7d500608c54d"`      |
| `data-kmrza-variant-id`  | ✅ Sí      | El ID de la variante de Komerza                                 | `"96f846e5-5f22-46a2-97b3-a1c88f685577"`      |
| `data-kmrza-quantity`    | ❌ No      | Cantidad a comprar (predeterminado: 1)                          | `"2"`                                         |
| `data-kmrza-theme`       | ❌ No      | Modo de tema: `light`, `dark` o `auto` (predeterminado: `auto`) | `"dark"`                                      |
| `data-kmrza-return-url`  | ❌ No      | URL personalizada de redirección tras el pago                   | `"https://example.com/gracias"`               |
| `data-kmrza-email`       | ❌ No      | Prerrellenar la dirección de correo del cliente                 | `"cliente@example.com"`                       |
| `data-kmrza-coupon-code` | ❌ No      | Prerrellenar y aplicar automáticamente un código de cupón       | `"SAVE20"`                                    |
| `data-kmrza-metadata`    | ❌ No      | Cadena JSON de metadatos clave-valor personalizados             | `"{&quot;campaign&quot;:&quot;summer&quot;}"` |

### Método 2: API de JavaScript (Para casos de uso avanzados)

Para mayor control, usa la API de JavaScript para abrir el pago programáticamente:

```html theme={null}
<button id="checkout-btn">Comprar ahora</button>

<script src="https://checkout.komerza.com/embed/embed.iife.js" defer></script>
<script>
  document.getElementById("checkout-btn").addEventListener("click", () => {
    Komerza.open({
      items: [
        {
          productId: "YOUR_PRODUCT_ID",
          variantId: "YOUR_VARIANT_ID",
          quantity: 1,
        },
      ],
      theme: "auto", // 'light', 'dark' o 'auto'
    });
  });
</script>
```

#### Múltiples artículos

Puedes agregar varios productos al pago a la vez:

```javascript theme={null}
Komerza.open({
  items: [
    {
      productId: "0f6294be-25d6-4ced-96df-7d500608c54d",
      variantId: "96f846e5-5f22-46a2-97b3-a1c88f685577",
      quantity: 2,
    },
    {
      productId: "54d6adb4-c160-4f73-b9c0-6c16970fff41",
      variantId: "37e70705-c603-4ab2-8a2e-d16e80288c8c",
      quantity: 1,
    },
  ],
  theme: "light",
});
```

## Guía de implementación completa

### Configuración HTML

Aquí hay un ejemplo completo de página HTML:

```html theme={null}
<!DOCTYPE html>
<html lang="es">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Mi Tienda</title>

    <!-- Encabezado CSP (recomendado) -->
    <meta
      http-equiv="Content-Security-Policy"
      content="frame-src https://checkout.komerza.com; script-src 'self' 'nonce-abc123' https://checkout.komerza.com;"
    />
  </head>
  <body>
    <div class="product-container">
      <h1>Producto increíble</h1>
      <p>Precio: 29,99 €</p>

      <!-- Tu botón de compra -->
      <button id="buy-now" class="buy-button">Comprar ahora</button>
    </div>

    <!-- Komerza Embed SDK -->
    <script
      src="https://checkout.komerza.com/embed/embed.iife.js"
      nonce="abc123"
    ></script>

    <script nonce="abc123">
      // Tu código de integración aquí
    </script>
  </body>
</html>
```

### Integración JavaScript

<Tabs>
  <Tab title="Integración básica">
    ```javascript theme={null}
    document.addEventListener('DOMContentLoaded', function() {
      KomerzaEmbed.init();
      
      document.getElementById('buy-now').addEventListener('click', function() {
        KomerzaEmbed.open({
          items: [{ productId: 'prod_123', variantId: 'var_456', quantity: 1 }]
        });
      });
    });
    ```
  </Tab>

  <Tab title="Integración avanzada">
    ```javascript theme={null}
    class CheckoutManager {
      constructor() {
        this.isInitialized = false;
        this.init();
      }
      
      init() {
        KomerzaEmbed.init({ nonce: this.getCSPNonce() });
        this.isInitialized = true;
        this.bindEvents();
      }
      
      bindEvents() {
        document.querySelectorAll('[data-buy-button]').forEach(button => {
          button.addEventListener('click', (e) => { e.preventDefault(); this.handlePurchase(button); });
        });
        document.addEventListener('keydown', (e) => { if (e.key === 'Escape') KomerzaEmbed.close(); });
      }
      
      handlePurchase(button) {
        const { productId, variantId } = button.dataset;
        const quantity = parseInt(button.dataset.quantity) || 1;
        if (!productId || !variantId) { console.error('Falta ID de producto o variante'); return; }
        try {
          KomerzaEmbed.open({ items: [{ productId, variantId, quantity }], theme: this.getTheme() });
        } catch (error) {
          console.error('No se pudo abrir el pago:', error);
          window.location.href = `https://checkout.komerza.com/product/${productId}/${variantId}?qty=${quantity}`;
        }
      }
      
      getTheme() { return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; }
      getCSPNonce() { return document.querySelector('script[nonce]')?.getAttribute('nonce') ?? null; }
    }

    document.addEventListener('DOMContentLoaded', () => new CheckoutManager());
    ```
  </Tab>

  <Tab title="Integración React">
    ```jsx theme={null}
    import React, { useEffect, useState } from 'react';

    const ProductPage: React.FC = () => {
      const [isEmbedReady, setIsEmbedReady] = useState(false);
      
      useEffect(() => {
        const script = document.createElement('script');
        script.src = 'https://checkout.komerza.com/embed/embed.iife.js';
        script.onload = () => { window.KomerzaEmbed.init(); setIsEmbedReady(true); };
        document.head.appendChild(script);
        return () => document.head.removeChild(script);
      }, []);
      
      const handleBuyClick = () => {
        if (!isEmbedReady) return;
        window.KomerzaEmbed.open({
          items: [{ productId: 'prod_123', variantId: 'var_456', quantity: 1 }],
          theme: 'auto'
        });
      };
      
      return (
        <div className="product-page">
          <h1>Producto increíble</h1>
          <p>Precio: 29,99 €</p>
          <button onClick={handleBuyClick} disabled={!isEmbedReady} className="buy-button">
            {isEmbedReady ? 'Comprar ahora' : 'Cargando...'}
          </button>
        </div>
      );
    };

    export default ProductPage;
    ```
  </Tab>
</Tabs>

## Referencia de API

### `Komerza.init(options?)`

Inicializa el embed y vincula automáticamente todos los elementos con atributos `data-kmrza-*`.

```javascript theme={null}
Komerza.init({
  nonce: "TU_NONCE_CSP", // Opcional: para política de seguridad de contenido
});
```

### `Komerza.open(options)`

Abre la modal de pago programáticamente.

```javascript theme={null}
Komerza.open({
  items: [{ productId: string, variantId: string, quantity?: number }],
  theme?: 'light' | 'dark' | 'auto',
  affiliateCode?: string,
  returnUrl?: string,
  email?: string,
  couponCode?: string,
  metadata?: Record<string, string>
});
```

### `Komerza.close()`

Cierra la modal de pago programáticamente.

```javascript theme={null}
Komerza.close();
```

### Integración Next.js

```jsx theme={null}
// components/CheckoutButton.jsx
"use client";

import Script from "next/script";

export default function CheckoutButton({ productId, variantId, quantity = 1 }) {
  const handleClick = () => {
    if (window.Komerza) {
      window.Komerza.open({ items: [{ productId, variantId, quantity }] });
    }
  };

  return (
    <>
      <Script
        src="https://checkout.komerza.com/embed/embed.iife.js"
        strategy="lazyOnload"
      />
      <button onClick={handleClick}>Comprar ahora</button>
    </>
  );
}
```

## Solución de problemas

### El pago no se abre

1. Asegúrate de que el script está cargado (se recomienda el atributo `defer`)
2. Revisa la consola del navegador para ver errores
3. Verifica que tus IDs de producto y variante sean correctos
4. Si usas atributos de datos, asegúrate de que `Komerza.init()` se llama después de que el DOM esté cargado

### El modal aparece detrás de otros elementos

El modal usa un z-index alto (9999). Si sigue detrás de otros elementos, revisa tu CSS para valores z-index competidores.

## Afiliados

El Komerza Embed SDK admite el seguimiento de afiliados de forma nativa. El parámetro de consulta `?ref` se admite automáticamente y la cookie `kmrza_affiliate` se lee automáticamente.

***

## Política de seguridad de contenido (CSP)

```http theme={null}
Content-Security-Policy:
  frame-src https://checkout.komerza.com;
  script-src 'self' 'nonce-TU_NONCE' https://checkout.komerza.com;
  style-src 'self' 'nonce-TU_NONCE';
```

```javascript theme={null}
KomerzaEmbed.init({ nonce: "TU_NONCE" });
```

## Mejores prácticas

<AccordionGroup>
  <Accordion title="Rendimiento">
    * Carga el script del SDK de forma asíncrona cuando sea posible
    * Inicializa el SDK temprano pero abre los modales solo con la interacción del usuario
    * Implementa estados de carga adecuados para los botones de compra
  </Accordion>

  {" "}

  <Accordion title="Experiencia de usuario">
    * Proporciona indicadores de carga claros - Maneja los errores de red
      graciosamente con URLs de respaldo - Admite la navegación por teclado (Esc
      para cerrar)
  </Accordion>

  <Accordion title="Seguridad">
    * Usa siempre encabezados CSP en producción
    * Valida los IDs de producto y variante antes de abrir el pago
    * Nunca expongas datos sensibles en el código del lado del cliente
  </Accordion>
</AccordionGroup>

## Soporte

¿Necesitas ayuda con la integración?

<CardGroup cols={2}>
  <Card title="Página de demo" icon="laptop-binary" href="https://checkout.komerza.com/embed/demo.html">
    Demo interactiva con ejemplos de código fuente
  </Card>

  <Card title="Soporte para desarrolladores" icon="headset" href="mailto:support@komerza.com?subject=Embed SDK Support">
    Obtén soporte técnico para problemas de integración
  </Card>
</CardGroup>
