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

> Integriere Komerza-Checkout direkt in deine Website mit unserem leichtgewichtigen 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 in Aktion" 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 in Aktion" width="3456" height="1824" data-path="images/embeds-dark.png" />

## Übersicht

Das Komerza Embed SDK ermöglicht es dir, unsere Checkout-Erfahrung nahtlos direkt in deine Website zu integrieren. Anstatt Kunden auf eine separate Checkout-Seite weiterzuleiten, erstellt das Embed eine modale Überlagerung, die Nutzer auf deiner Website behält und gleichzeitig einen sicheren, optimierten Zahlungsablauf bietet.

<Card title="Live-Demo" icon="laptop-binary" href="https://checkout.komerza.com/embed/demo.html">
  Sieh das Embed SDK in Aktion mit unserer interaktiven Demo
</Card>

<Note>
  Integriere auch unser Analytics-Skript, um Besucheranalysen auf deiner
  benutzerdefinierten Website für vollständige Einblicke in die Customer Journey
  zurückzubringen.
</Note>

## Funktionen

<CardGroup cols={2}>
  <Card title="Nahtlose Integration" icon="puzzle-piece">
    Modale Überlagerung hält Kunden während des Checkouts auf deiner Website
  </Card>

  {" "}

  <Card title="Leichtgewichtig" icon="feather">
    Minimales JavaScript-Bundle ohne externe Abhängigkeiten
  </Card>

  {" "}

  <Card title="Theme-Unterstützung" icon="palette">
    Helle, dunkle und automatische Themes passend zum Design deiner Website
  </Card>

  <Card title="CSP-kompatibel" icon="shield">
    Vollständige Content Security Policy-Unterstützung mit Nonce-Integration
  </Card>
</CardGroup>

## Schnellstart

Füge das folgende Skript in das `<head>` deiner Website oder vor dem schließenden `</body>`-Tag ein:

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

### Methode 1: Datenattribute (Empfohlen für einfache Anwendungsfälle)

Die einfachste Möglichkeit, Checkout-Buttons zu deiner Website hinzuzufügen. Füge einfach Datenattribute zu einem beliebigen Button oder Element hinzu:

```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"
>
  Jetzt kaufen
</button>

<script src="https://checkout.komerza.com/embed/embed.iife.js" defer></script>
<script>
  // Embed initialisieren, um alle Buttons mit Datenattributen zu verknüpfen
  document.addEventListener("DOMContentLoaded", () => {
    Komerza.init();
  });
</script>
```

#### Datenattribute-Referenz

| Attribut                 | Erforderlich | Beschreibung                                                 | Beispiel                                      |
| ------------------------ | ------------ | ------------------------------------------------------------ | --------------------------------------------- |
| `data-kmrza-product-id`  | ✅ Ja         | Die Produkt-ID aus Komerza                                   | `"0f6294be-25d6-4ced-96df-7d500608c54d"`      |
| `data-kmrza-variant-id`  | ✅ Ja         | Die Varianten-ID aus Komerza                                 | `"96f846e5-5f22-46a2-97b3-a1c88f685577"`      |
| `data-kmrza-quantity`    | ❌ Nein       | Zu kaufende Menge (Standard: 1)                              | `"2"`                                         |
| `data-kmrza-theme`       | ❌ Nein       | Theme-Modus: `light`, `dark` oder `auto` (Standard: `auto`)  | `"dark"`                                      |
| `data-kmrza-return-url`  | ❌ Nein       | Benutzerdefinierte URL zur Weiterleitung nach der Zahlung    | `"https://example.com/danke"`                 |
| `data-kmrza-email`       | ❌ Nein       | E-Mail-Adresse des Kunden vorausfüllen                       | `"kunde@example.com"`                         |
| `data-kmrza-coupon-code` | ❌ Nein       | Couponcode vorausfüllen und automatisch anwenden             | `"SAVE20"`                                    |
| `data-kmrza-metadata`    | ❌ Nein       | JSON-String mit benutzerdefinierten Schlüssel-Wert-Metadaten | `"{&quot;campaign&quot;:&quot;summer&quot;}"` |

### Methode 2: JavaScript-API (Für fortgeschrittene Anwendungsfälle)

Für mehr Kontrolle nutze die JavaScript-API, um den Checkout programmgesteuert zu öffnen:

```html theme={null}
<button id="checkout-btn">Jetzt kaufen</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' oder 'auto'
    });
  });
</script>
```

#### Mehrere Artikel

Du kannst mehrere Produkte gleichzeitig zum Checkout hinzufügen:

```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",
});
```

## Vollständiger Implementierungsleitfaden

### HTML-Setup

Hier ist ein vollständiges HTML-Seitenbeispiel:

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

    <!-- CSP-Header (empfohlen) -->
    <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>Tolles Produkt</h1>
      <p>Preis: 29,99 €</p>

      <!-- Dein Kaufen-Button -->
      <button id="buy-now" class="buy-button">Jetzt kaufen</button>
    </div>

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

    <script nonce="abc123">
      // Dein Integrationscode hier
    </script>
  </body>
</html>
```

### JavaScript-Integration

<Tabs>
  <Tab title="Basis-Integration">
    ```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="Erweiterte Integration">
    ```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 = button.dataset.productId;
        const variantId = button.dataset.variantId;
        const quantity = parseInt(button.dataset.quantity) || 1;
        
        if (!productId || !variantId) {
          console.error('Produkt- oder Varianten-ID fehlt');
          return;
        }
        
        try {
          KomerzaEmbed.open({ items: [{ productId, variantId, quantity }], theme: this.getTheme() });
        } catch (error) {
          console.error('Checkout konnte nicht geöffnet werden:', error);
          this.fallbackCheckout(productId, variantId, quantity);
        }
      }
      
      getTheme() {
        return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
      }
      
      getCSPNonce() {
        return document.querySelector('script[nonce]')?.getAttribute('nonce') ?? null;
      }
      
      fallbackCheckout(productId, variantId, quantity) {
        window.location.href = `https://checkout.komerza.com/product/${productId}/${variantId}?qty=${quantity}`;
      }
    }

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

  <Tab title="React-Integration">
    ```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>Tolles Produkt</h1>
          <p>Preis: 29,99 €</p>
          <button onClick={handleBuyClick} disabled={!isEmbedReady} className="buy-button">
            {isEmbedReady ? 'Jetzt kaufen' : 'Wird geladen...'}
          </button>
        </div>
      );
    };

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

## API-Referenz

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

Initialisiert das Embed und verknüpft automatisch alle Elemente mit `data-kmrza-*`-Attributen.

```javascript theme={null}
Komerza.init({
  nonce: "DEIN_CSP_NONCE", // Optional: für Content Security Policy
});
```

**Hinweis:** Dies wird automatisch aufgerufen, wenn die JS-API (`Komerza.open()`) verwendet wird, muss aber explizit aufgerufen werden, wenn Datenattribute verwendet werden.

### `Komerza.open(options)`

Öffnet die Checkout-Modal programmgesteuert.

```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()`

Schließt die Checkout-Modal programmgesteuert.

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

### Next.js-Integration

```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}>Jetzt kaufen</button>
    </>
  );
}
```

## Fehlerbehebung

### Der Checkout öffnet sich nicht

1. Stelle sicher, dass das Skript geladen ist (das `defer`-Attribut wird empfohlen)
2. Prüfe die Browserkonsole auf Fehler
3. Überprüfe, ob deine Produkt- und Varianten-IDs korrekt sind
4. Wenn du Datenattribute verwendest, stelle sicher, dass `Komerza.init()` nach dem DOM-Laden aufgerufen wird

### Modal erscheint hinter anderen Elementen

Das Modal verwendet einen hohen z-index (9999). Wenn es noch hinter Elementen liegt, überprüfe dein CSS auf konkurrierende z-index-Werte.

## Affiliates

Das Komerza Embed SDK unterstützt Affiliate-Tracking sofort einsatzbereit. Der `?ref`-Abfrageparameter wird automatisch unterstützt, und der `kmrza_affiliate`-Cookie wird automatisch gelesen.

***

## Content Security Policy (CSP)

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

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

## Best Practices

<AccordionGroup>
  <Accordion title="Performance">
    * SDK-Skript asynchron laden, wenn möglich
    * SDK früh initialisieren, aber Modals nur bei Benutzerinteraktion öffnen
    * Ordnungsgemäße Ladezustände für Kauf-Buttons implementieren
  </Accordion>

  {" "}

  <Accordion title="Benutzererfahrung">
    * Klare Ladeindikatoren bereitstellen - Netzwerkfehler mit Fallback-URLs
      behandeln - Tastaturnavigation unterstützen (Esc zum Schließen)
  </Accordion>

  <Accordion title="Sicherheit">
    * Immer CSP-Header in Produktion verwenden
    * Produkt- und Varianten-IDs vor dem Öffnen des Checkouts validieren
    * Niemals sensible Daten im clientseitigen Code offenlegen
  </Accordion>
</AccordionGroup>

## Support

Brauchst du Hilfe bei der Integration?

<CardGroup cols={2}>
  <Card title="Demo-Seite" icon="laptop-binary" href="https://checkout.komerza.com/embed/demo.html">
    Interaktive Demo mit Quellcode-Beispielen
  </Card>

  <Card title="Entwickler-Support" icon="headset" href="mailto:support@komerza.com?subject=Embed SDK Support">
    Technischen Support für Integrationsprobleme erhalten
  </Card>
</CardGroup>
