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

# Inngest

> Triggern Sie serverlose Funktionen und Hintergrundjobs in Inngest basierend auf Dodo Payments-Ereignissen.

## Einführung

Führen Sie serverlose Funktionen und Hintergrundjobs automatisch aus, wenn Zahlungsevents auftreten. Verarbeiten Sie Zahlungen, senden Sie Benachrichtigungen, aktualisieren Sie Datenbanken und führen Sie komplexe Workflows mit der zuverlässigen Funktionsausführungsplattform von Inngest aus.

<Info>
  Diese Integration benötigt Ihre Inngest-Webhooks-URL aus Ihrer Funktionskonfiguration.
</Info>

## Erste Schritte

<Steps>
  <Step title="Open the Webhook Section">
    Navigieren Sie in Ihrem Dodo Payments-Dashboard zu <b>Webhooks → + Endpunkt hinzufügen</b> und erweitern Sie das Integrations-Dropdown.

    <Frame>
      <img src="https://mintcdn.com/dodopayments/slbAEdrLLwKHfaRf/images/integrations/inngest.png?fit=max&auto=format&n=slbAEdrLLwKHfaRf&q=85&s=b160678c00ceed38439160b4b253c8f3" alt="Endpunkt hinzufügen und Integrationen Dropdown" style={{ maxHeight: '500px', width: 'auto' }} width="1646" height="944" data-path="images/integrations/inngest.png" />
    </Frame>
  </Step>

  <Step title="Select Inngest">
    Wählen Sie die Integrationskarte <b>Inngest</b>.
  </Step>

  <Step title="Create Inngest Function">
    Erstellen Sie in Inngest eine neue Funktion und kopieren Sie die Webhook-URL aus der Funktionskonfiguration.
  </Step>

  <Step title="Paste Webhook URL">
    Fügen Sie die Inngest-Webhooks-URL in die Endpunktkonfiguration ein.
  </Step>

  <Step title="Configure Transformation">
    Bearbeiten Sie den Transformationscode, um Ereignisse für Ihre Inngest-Funktion zu formatieren.
  </Step>

  <Step title="Test & Create">
    Testen Sie mit Beispiel-Payloads und klicken Sie auf <b>Erstellen</b>, um die Integration zu aktivieren.
  </Step>

  <Step title="Done!">
    🎉 Zahlungsevents lösen nun automatisch Ihre Inngest-Funktionen aus.
  </Step>
</Steps>

## Transformationscode-Beispiele

### Basis-Ereignispayload

```javascript basic_event.js icon="js" expandable theme={null}
function handler(webhook) {
  if (webhook.eventType === "payment.succeeded") {
    const p = webhook.payload.data;
    webhook.payload = {
      name: "payment.succeeded",
      data: {
        payment_id: p.payment_id,
        amount: (p.total_amount / 100).toFixed(2),
        currency: p.currency || "USD",
        customer_email: p.customer.email,
        customer_name: p.customer.name,
        payment_method: p.payment_method || "unknown"
      },
      user: {
        email: p.customer.email
      },
      ts: Math.floor(new Date(webhook.payload.timestamp).getTime() / 1000)
    };
  }
  return webhook;
}
```

### Abonnement-Ereignis-Handler

```javascript subscription_event.js icon="js" expandable theme={null}
function handler(webhook) {
  const s = webhook.payload.data;
  switch (webhook.eventType) {
    case "subscription.active":
      webhook.payload = {
        name: "subscription.started",
        data: {
          subscription_id: s.subscription_id,
          customer_email: s.customer.email,
          customer_name: s.customer.name,
          product_id: s.product_id,
          amount: (s.recurring_pre_tax_amount / 100).toFixed(2),
          frequency: s.payment_frequency_interval,
          next_billing: s.next_billing_date
        },
        user: {
          email: s.customer.email
        },
        ts: Math.floor(new Date(webhook.payload.timestamp).getTime() / 1000)
      };
      break;
    case "subscription.cancelled":
      webhook.payload = {
        name: "subscription.cancelled",
        data: {
          subscription_id: s.subscription_id,
          customer_email: s.customer.email,
          cancelled_at: s.cancelled_at,
          cancel_at_next_billing: s.cancel_at_next_billing_date
        },
        user: {
          email: s.customer.email
        },
        ts: Math.floor(new Date(webhook.payload.timestamp).getTime() / 1000)
      };
      break;
  }
  return webhook;
}
```

### Streitfall-Ereignis-Handler

```javascript dispute_event.js icon="js" expandable theme={null}
function handler(webhook) {
  if (webhook.eventType.startsWith("dispute.")) {
    const d = webhook.payload.data;
    webhook.payload = {
      name: webhook.eventType,
      data: {
        dispute_id: d.dispute_id,
        payment_id: d.payment_id,
        amount: (d.amount / 100).toFixed(2),
        status: d.dispute_status,
        stage: d.dispute_stage,
        remarks: d.remarks || "",
        urgent: webhook.eventType === "dispute.opened"
      },
      user: {
        email: d.customer?.email || "unknown"
      },
      ts: Math.floor(new Date(webhook.payload.timestamp).getTime() / 1000)
    };
  }
  return webhook;
}
```

## Häufige Inngest-Anwendungsfälle

<AccordionGroup>
  <Accordion title="Payment Processing">
    * Bestätigungs-E-Mails senden
    * Kundenakten aktualisieren
    * Rückerstattungen bearbeiten
    * Rechnungen erstellen
    * Lagerbestand aktualisieren
  </Accordion>

  <Accordion title="Subscription Management">
    * Neue Abonnenten begrüßen
    * Kündigungen bearbeiten
    * Erinnerungen für Verlängerungen senden
    * Abrechnungszyklen aktualisieren
    * Fehlgeschlagene Zahlungen bearbeiten
  </Accordion>

  <Accordion title="Analytics & Reporting">
    * Umsatzkennzahlen aktualisieren
    * Kundenverhalten verfolgen
    * Berichte erstellen
    * Daten mit Analyseplattformen synchronisieren
    * Kündigungsraten berechnen
  </Accordion>
</AccordionGroup>

## Tipps

* Verwenden Sie beschreibende Ereignisnamen für eine bessere Funktionsorganisation
* Fügen Sie Benutzerkontext für die Funktionsausführung hinzu
* Setzen Sie korrekte Zeitstempel für die Ereignisreihenfolge
* Strukturieren Sie Daten konsistent über Ereignisse hinweg
* Nutzen Sie die Wiederholungs- und Fehlerbehandlungsfunktionen von Inngest

## Fehlersuche

<AccordionGroup>
  <Accordion title="Functions not triggering">
    * Überprüfen Sie, ob die Webhook-URL korrekt und aktiv ist
    * Stellen Sie sicher, dass die Inngest-Funktion bereitgestellt und aktiv ist
    * Stellen Sie sicher, dass die Ereignisnamen mit den Funktionsauslösern übereinstimmen
    * Überprüfen Sie die Inngest-Funktionsprotokolle auf Fehler
  </Accordion>

  <Accordion title="Data not received correctly">
    * Prüfen Sie, ob die Payload-Struktur den Inngest-Erwartungen entspricht
    * Vergewissern Sie sich, dass die Ereignisnamen richtig formatiert sind
    * Stellen Sie sicher, dass alle erforderlichen Felder enthalten sind
    * Testen Sie mit dem Webhook-Testtool von Inngest
  </Accordion>
</AccordionGroup>
