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

# Récupération

> Les charges utiles envoyées à votre point de terminaison webhook lors de la récupération de panier abandonné ou des événements de recouvrement d'abonnement.

## Événements de récupération de panier abandonné

Les événements webhook suivants suivent le cycle de vie de la récupération de panier abandonné :

| Événement                      | Description                                                                                                                                                            |
| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `abandoned_checkout.detected`  | Un paiement abandonné a été détecté. Envoyé lorsqu'un paiement est identifié comme abandonné (échoué ou incomplet) et que le flux de travail de récupération commence. |
| `abandoned_checkout.recovered` | Le client a complété le paiement via le lien de récupération. Le champ `recovered_payment_id` contient l'ID de paiement réussi.                                        |

### Champs de la charge utile du paiement abandonné

<ParamField body="payment_id" type="string" required>
  Le paiement original qui a été abandonné. Utilisez ceci pour rechercher les détails du produit, le montant et la devise.
</ParamField>

<ParamField body="customer_id" type="string" required>
  Le client qui a abandonné le paiement.
</ParamField>

<ParamField body="abandonment_reason" type="string" required>
  Pourquoi le paiement a été abandonné. L'un des cas suivants :

  * `payment_failed` — Le client a tenté de payer mais cela a échoué
  * `checkout_incomplete` — Le client a visité le paiement mais n'a jamais tenté de payer
</ParamField>

<ParamField body="status" type="string" required>
  État actuel du cycle de vie de cette tentative de récupération. L'un des suivants :

  * `abandoned` — Détecté, pas encore de courriels envoyés
  * `recovering` — Au moins un courriel de récupération envoyé
  * `recovered` — Le client a complété le paiement
  * `exhausted` — Tous les courriels envoyés ou nouveau paiement trouvé
  * `opted_out` — Le client s'est désabonné
</ParamField>

<ParamField body="abandoned_at" type="string" required>
  Horodatage ISO 8601 quand le paiement a été détecté comme abandonné.
</ParamField>

<ParamField body="recovered_payment_id" type="string | null">
  L'ID de paiement de la récupération réussie. `null` jusqu'à la récupération.
</ParamField>

### Exemple : Gestion des webhooks ACR

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

***

## Événements de recouvrement

Les événements webhook suivants suivent le cycle de vie du recouvrement d'abonnement :

| Événement           | Description                                                                                                                  |
| ------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `dunning.started`   | Une tentative de recouvrement a été créée pour un abonnement qui a été mis en `on_hold` ou a été annulé par le client.       |
| `dunning.recovered` | Le client a mis à jour son mode de paiement et le paiement a réussi. Le champ `payment_id` contient l'ID de paiement réussi. |

### Champs de la charge utile de tentative de recouvrement

<ParamField body="subscription_id" type="string" required>
  L'abonnement qui a déclenché la tentative de recouvrement.
</ParamField>

<ParamField body="customer_id" type="string" required>
  Le client qui possède l'abonnement.
</ParamField>

<ParamField body="trigger_state" type="string" required>
  L'état de l'abonnement qui a déclenché le recouvrement. L'un des cas suivants :

  * `on_hold` — Abonnement en pause à cause d'un échec de paiement
  * `cancelled` — Annulé par le client depuis le portail client
</ParamField>

<ParamField body="status" type="string" required>
  État actuel du cycle de vie de cette tentative de recouvrement. L'un des suivants :

  * `recovering` — Les courriels de recouvrement sont envoyés
  * `recovered` — Le client a mis à jour le mode de paiement et le paiement a réussi
  * `exhausted` — Tous les courriels envoyés ou l'état de l'abonnement a changé
</ParamField>

<ParamField body="created_at" type="string" required>
  Horodatage ISO 8601 de la création de la tentative de recouvrement.
</ParamField>

<ParamField body="payment_id" type="string | null">
  L'ID de paiement de la récupération réussie. `null` pendant la récupération.
</ParamField>

### Exemple : Gestion des webhooks de recouvrement

```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>
  Abonnez-vous à `dunning.started` et `dunning.recovered` pour suivre le cycle de vie complet du recouvrement. Utilisez `dunning.started` pour suspendre les périodes de grâce ou signaler les abonnements à risque dans votre système.
</Tip>

<CardGroup cols={2}>
  <Card title="Abandoned Cart Recovery" icon="cart-shopping" href="/features/recovery/abandoned-cart-recovery">
    Configurez les séquences d'emails ACR et les incitations pour des réductions.
  </Card>

  <Card title="Subscription Dunning" icon="rotate" href="/features/recovery/subscription-dunning">
    Configurez les séquences d'emails de recouvrement pour les abonnements échus.
  </Card>

  <Card title="Subscription Webhooks" icon="repeat" href="/developer-resources/webhooks/intents/subscription">
    Événements liés au cycle de vie d'abonnement comme `subscription.on_hold` et `subscription.cancelled`.
  </Card>
</CardGroup>

## Schéma de la charge utile du webhook
