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

# Recupero

> I payload inviati al tuo endpoint webhook quando si verificano eventi di recupero carrelli abbandonati o di gestione delle sottoscrizioni.

## Eventi di Recupero del Carrello Abbandonato

I seguenti eventi webhook tracciano il ciclo di vita del recupero del carrello abbandonato:

| Evento                         | Descrizione                                                                                                                                                                |
| ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `abandoned_checkout.detected`  | È stato rilevato un checkout abbandonato. Inviato quando un pagamento viene identificato come abbandonato (fallito o incompleto) e inizia il flusso di lavoro di recupero. |
| `abandoned_checkout.recovered` | Il cliente ha completato il pagamento tramite il link di recupero. Il campo `recovered_payment_id` contiene l'ID del pagamento riuscito.                                   |

### Campi del Payload del Checkout Abbandonato

<ParamField body="payment_id" type="string" required>
  Il pagamento originale che è stato abbandonato. Usalo per cercare i dettagli del prodotto, importo e valuta.
</ParamField>

<ParamField body="customer_id" type="string" required>
  Il cliente che ha abbandonato il checkout.
</ParamField>

<ParamField body="abandonment_reason" type="string" required>
  Perché il checkout è stato abbandonato. Uno di:

  * `payment_failed` — Il cliente ha tentato il pagamento ma è fallito
  * `checkout_incomplete` — Il cliente ha visitato il checkout ma non ha mai tentato il pagamento
</ParamField>

<ParamField body="status" type="string" required>
  Stato attuale del ciclo di vita di questo tentativo di recupero. Uno di:

  * `abandoned` — Rilevato, nessuna email ancora inviata
  * `recovering` — Almeno un'email di recupero inviata
  * `recovered` — Il cliente ha completato il pagamento
  * `exhausted` — Tutte le email inviate o nuovo checkout trovato
  * `opted_out` — Cliente disiscritto
</ParamField>

<ParamField body="abandoned_at" type="string" required>
  Timestamp ISO 8601 di quando il checkout è stato rilevato come abbandonato.
</ParamField>

<ParamField body="recovered_payment_id" type="string | null">
  L'ID del pagamento di recupero riuscito. `null` fino a quando il checkout non viene recuperato.
</ParamField>

### Esempio: Gestione dei Webhook 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 });
});
```

***

## Eventi Dunning

I seguenti eventi webhook tracciano il ciclo di vita della gestione delle sottoscrizioni:

| Evento              | Descrizione                                                                                                                                       |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| `dunning.started`   | È stato creato un tentativo di dunning per una sottoscrizione entrata in `on_hold` o cancellata dal cliente.                                      |
| `dunning.recovered` | Il cliente ha aggiornato il metodo di pagamento e il pagamento risultante è riuscito. Il campo `payment_id` contiene l'ID del pagamento riuscito. |

### Campi del Payload del Tentativo di Dunning

<ParamField body="subscription_id" type="string" required>
  La sottoscrizione che ha attivato il tentativo di dunning.
</ParamField>

<ParamField body="customer_id" type="string" required>
  Il cliente che possiede la sottoscrizione.
</ParamField>

<ParamField body="trigger_state" type="string" required>
  Lo stato della sottoscrizione che ha attivato il dunning. Uno di:

  * `on_hold` — Sottoscrizione sospesa a causa di un fallimento del pagamento
  * `cancelled` — Cliente cancellato dal portale clienti
</ParamField>

<ParamField body="status" type="string" required>
  Stato attuale del ciclo di vita di questo tentativo di dunning. Uno di:

  * `recovering` — Le email di dunning sono in invio
  * `recovered` — Il cliente ha aggiornato il metodo di pagamento e il pagamento è riuscito
  * `exhausted` — Tutte le email inviate o lo stato della sottoscrizione è cambiato
</ParamField>

<ParamField body="created_at" type="string" required>
  Timestamp ISO 8601 di quando il tentativo di dunning è stato creato.
</ParamField>

<ParamField body="payment_id" type="string | null">
  L'ID del pagamento di recupero riuscito. `null` durante il recupero.
</ParamField>

### Esempio: Gestione dei Webhook Dunning

```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>
  Iscriviti a `dunning.started` e `dunning.recovered` per tracciare l'intero ciclo di vita del dunning. Utilizza `dunning.started` per sospendere i periodi di grazia o segnalare sottoscrizioni a rischio nel tuo sistema.
</Tip>

<CardGroup cols={2}>
  <Card title="Abandoned Cart Recovery" icon="cart-shopping" href="/features/recovery/abandoned-cart-recovery">
    Configura sequenze email ACR e incentivi scontati.
  </Card>

  <Card title="Subscription Dunning" icon="rotate" href="/features/recovery/subscription-dunning">
    Configura sequenze email di dunning per le sottoscrizioni scadute.
  </Card>

  <Card title="Subscription Webhooks" icon="repeat" href="/developer-resources/webhooks/intents/subscription">
    Eventi del ciclo di vita delle sottoscrizioni correlati come `subscription.on_hold` e `subscription.cancelled`.
  </Card>
</CardGroup>

## Schema del Payload del Webhook
