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

# Wiederherstellung

> Die Nutzdaten, die an Ihren Webhook-Endpunkt gesendet werden, wenn Ereignisse zur Wiederherstellung von Warenkörben oder zur Abonnentenverwaltung auftreten.

## Ereignisse zur Wiederherstellung verlassener Warenkörbe

Die folgenden Webhook-Ereignisse verfolgen den Lebenszyklus der Wiederherstellung von verlassenen Warenkörben:

| Ereignis                       | Beschreibung                                                                                                                                                                          |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `abandoned_checkout.detected`  | Ein verlassener Checkout wurde erkannt. Gesendet, wenn eine Zahlung als verlassen (fehlgeschlagen oder unvollständig) identifiziert wird und der Wiederherstellungs-Workflow beginnt. |
| `abandoned_checkout.recovered` | Der Kunde hat die Zahlung über den Wiederherstellungslink abgeschlossen. Das Feld `recovered_payment_id` enthält die erfolgreiche Zahlungs-ID.                                        |

### Felder des Payloads für verlassene Checkouts

<ParamField body="payment_id" type="string" required>
  Die ursprüngliche Zahlung, die verlassen wurde. Verwenden Sie dies, um Produkt-, Betrags- und Währungsdetails nachzuschlagen.
</ParamField>

<ParamField body="customer_id" type="string" required>
  Der Kunde, der den Checkout verlassen hat.
</ParamField>

<ParamField body="abandonment_reason" type="string" required>
  Warum der Checkout verlassen wurde. Einer der folgenden:

  * `payment_failed` — Kunde hat versucht zu zahlen, aber es scheiterte
  * `checkout_incomplete` — Kunde hat den Checkout besucht, aber nie versucht zu zahlen
</ParamField>

<ParamField body="status" type="string" required>
  Aktueller Lebenszyklusstatus dieses Wiederherstellungsversuchs. Einer der folgenden:

  * `abandoned` — Erkannt, bisher keine E-Mails gesendet
  * `recovering` — Mindestens eine Wiederherstellungs-E-Mail gesendet
  * `recovered` — Kunde hat die Zahlung abgeschlossen
  * `exhausted` — Alle E-Mails gesendet oder neuerer Checkout gefunden
  * `opted_out` — Kunde hat sich abgemeldet
</ParamField>

<ParamField body="abandoned_at" type="string" required>
  ISO 8601-Zeitstempel, wann der Checkout als verlassen erkannt wurde.
</ParamField>

<ParamField body="recovered_payment_id" type="string | null">
  Die Zahlungs-ID der erfolgreichen Wiederherstellungszahlung. `null` bis der Checkout wiederhergestellt wird.
</ParamField>

### Beispiel: Umgang mit ACR-Webhooks

```javascript theme={null}
app.post('/webhooks/dodo', async (req, res) => {
  const event = req.body;

  switch (event.type) {
    case 'abandoned_checkout.detected':
      console.log(`Checkout abandoned: ${event.data.payment_id}`);
      console.log(`Reason: ${event.data.abandonment_reason}`);
      // Track abandonment in your analytics
      await trackAbandonment(event.data);
      break;

    case 'abandoned_checkout.recovered':
      console.log(`Checkout recovered: ${event.data.payment_id}`);
      console.log(`Recovery payment: ${event.data.recovered_payment_id}`);
      // Grant access, update records
      await handleRecovery(event.data);
      break;
  }

  res.json({ received: true });
});
```

***

## Dunning-Ereignisse

Die folgenden Webhook-Ereignisse verfolgen den Lebenszyklus der Abonnentenverwaltung:

| Ereignis            | Beschreibung                                                                                                                                                |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `dunning.started`   | Ein Dunning-Versuch wurde für ein Abonnement erstellt, das in `on_hold` eingetreten ist oder vom Kunden storniert wurde.                                    |
| `dunning.recovered` | Der Kunde hat seine Zahlungsmethode aktualisiert und die resultierende Zahlung war erfolgreich. Das Feld `payment_id` enthält die erfolgreiche Zahlungs-ID. |

### Felder des Payloads für Dunning-Versuche

<ParamField body="subscription_id" type="string" required>
  Das Abonnement, das den Dunning-Versuch ausgelöst hat.
</ParamField>

<ParamField body="customer_id" type="string" required>
  Der Kunde, dem das Abonnement gehört.
</ParamField>

<ParamField body="trigger_state" type="string" required>
  Der Abonnementstatus, der das Dunning ausgelöst hat. Einer der folgenden:

  * `on_hold` — Abonnement aufgrund eines Zahlungsfehlers pausiert
  * `cancelled` — Kunde hat über das Kundenportal storniert
</ParamField>

<ParamField body="status" type="string" required>
  Aktueller Lebenszyklusstatus dieses Dunning-Versuchs. Einer der folgenden:

  * `recovering` — Dunning-E-Mails werden gesendet
  * `recovered` — Kunde hat Zahlungsmethode aktualisiert und Zahlung war erfolgreich
  * `exhausted` — Alle E-Mails gesendet oder Abonnementstatus geändert
</ParamField>

<ParamField body="created_at" type="string" required>
  ISO 8601-Zeitstempel, wann der Dunning-Versuch erstellt wurde.
</ParamField>

<ParamField body="payment_id" type="string | null">
  Die Zahlungs-ID der erfolgreichen Wiederherstellungszahlung. `null` während der Wiederherstellung.
</ParamField>

### Beispiel: Umgang mit Dunning-Webhooks

```javascript theme={null}
app.post('/webhooks/dodo', async (req, res) => {
  const event = req.body;

  switch (event.type) {
    case 'dunning.started':
      console.log(`Dunning started for subscription: ${event.data.subscription_id}`);
      console.log(`Trigger: ${event.data.trigger_state}`);
      // Track dunning in your system
      await trackDunning(event.data);
      break;

    case 'dunning.recovered':
      console.log(`Subscription recovered: ${event.data.subscription_id}`);
      console.log(`Recovery payment: ${event.data.payment_id}`);
      // Reactivate access, update records
      await handleDunningRecovery(event.data);
      break;
  }

  res.json({ received: true });
});
```

<Tip>
  Abonnieren Sie sowohl `dunning.started` als auch `dunning.recovered`, um den vollständigen Lebenszyklus der Abonnentenverwaltung zu verfolgen. Verwenden Sie `dunning.started`, um Karenzzeiten zu pausieren oder gefährdete Abonnements in Ihrem System zu markieren.
</Tip>

<CardGroup cols={2}>
  <Card title="Abandoned Cart Recovery" icon="cart-shopping" href="/features/recovery/abandoned-cart-recovery">
    Konfigurieren Sie ACR-E-Mail-Sequenzen und Rabattanreize.
  </Card>

  <Card title="Subscription Dunning" icon="rotate" href="/features/recovery/subscription-dunning">
    Konfigurieren Sie Dunning-E-Mail-Sequenzen für abgelaufene Abonnements.
  </Card>

  <Card title="Subscription Webhooks" icon="repeat" href="/developer-resources/webhooks/intents/subscription">
    Verwandte Abonnement-Lebenszyklusereignisse wie `subscription.on_hold` und `subscription.cancelled`.
  </Card>
</CardGroup>

## Webhook-Payload-Schema
