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

# Recuperação

> Os payloads enviados para o seu endpoint de webhook quando ocorrem eventos de recuperação de carrinho abandonado ou subscription dunning.

## Eventos de Recuperação de Carrinho Abandonado

Os seguintes eventos de webhook rastreiam o ciclo de vida da recuperação de carrinho abandonado:

| Evento                         | Descrição                                                                                                                                                                 |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `abandoned_checkout.detected`  | Um checkout abandonado foi detectado. Enviado quando um pagamento é identificado como abandonado (falhou ou está incompleto) e o fluxo de trabalho de recuperação começa. |
| `abandoned_checkout.recovered` | O cliente completou o pagamento através do link de recuperação. O campo `recovered_payment_id` contém o ID do pagamento bem-sucedido.                                     |

### Campos de Payload de Checkout Abandonado

<ParamField body="payment_id" type="string" required>
  O pagamento original que foi abandonado. Use isso para procurar detalhes de produto, valor e moeda.
</ParamField>

<ParamField body="customer_id" type="string" required>
  O cliente que abandonou o checkout.
</ParamField>

<ParamField body="abandonment_reason" type="string" required>
  Por que o checkout foi abandonado. Um dos:

  * `payment_failed` — O cliente tentou o pagamento, mas ele falhou
  * `checkout_incomplete` — O cliente visitou o checkout, mas nunca tentou o pagamento
</ParamField>

<ParamField body="status" type="string" required>
  Estado atual do ciclo de vida dessa tentativa de recuperação. Um dos:

  * `abandoned` — Detectado, nenhum e-mail enviado ainda
  * `recovering` — Pelo menos um e-mail de recuperação enviado
  * `recovered` — Cliente completou o pagamento
  * `exhausted` — Todos os e-mails enviados ou checkout mais recente encontrado
  * `opted_out` — Cliente cancelou a inscrição
</ParamField>

<ParamField body="abandoned_at" type="string" required>
  Timestamp ISO 8601 de quando o checkout foi detectado como abandonado.
</ParamField>

<ParamField body="recovered_payment_id" type="string | null">
  O ID do pagamento da recuperação bem-sucedida. `null` até que o checkout seja recuperado.
</ParamField>

### Exemplo: Lidando com 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 });
});
```

***

## Eventos de Dunning

Os seguintes eventos de webhook rastreiam o ciclo de vida de subscription dunning:

| Evento              | Descrição                                                                                                                                          |
| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `dunning.started`   | Uma tentativa de dunning foi criada para uma inscrição que entrou em `on_hold` ou foi cancelada pelo cliente.                                      |
| `dunning.recovered` | O cliente atualizou seu método de pagamento e o pagamento resultante foi bem-sucedido. O campo `payment_id` contém o ID do pagamento bem-sucedido. |

### Campos de Payload de Tentativa de Dunning

<ParamField body="subscription_id" type="string" required>
  A inscrição que acionou a tentativa de dunning.
</ParamField>

<ParamField body="customer_id" type="string" required>
  O cliente que possui a inscrição.
</ParamField>

<ParamField body="trigger_state" type="string" required>
  O estado da inscrição que acionou o dunning. Um dos:

  * `on_hold` — Inscrição pausada devido a falha de pagamento
  * `cancelled` — Cliente cancelou pelo portal do cliente
</ParamField>

<ParamField body="status" type="string" required>
  Estado atual do ciclo de vida dessa tentativa de dunning. Um dos:

  * `recovering` — E-mails de dunning estão sendo enviados
  * `recovered` — Cliente atualizou o método de pagamento e o pagamento foi bem-sucedido
  * `exhausted` — Todos os e-mails foram enviados ou o estado da inscrição mudou
</ParamField>

<ParamField body="created_at" type="string" required>
  Timestamp ISO 8601 de quando a tentativa de dunning foi criada.
</ParamField>

<ParamField body="payment_id" type="string | null">
  O ID do pagamento da recuperação bem-sucedida. `null` durante a recuperação.
</ParamField>

### Exemplo: Lidando com Webhooks de 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>
  Inscreva-se em ambos `dunning.started` e `dunning.recovered` para rastrear o ciclo de vida completo do dunning. Use `dunning.started` para pausar períodos de carência ou marcar inscrições em risco no seu sistema.
</Tip>

<CardGroup cols={2}>
  <Card title="Abandoned Cart Recovery" icon="cart-shopping" href="/features/recovery/abandoned-cart-recovery">
    Configure sequências de e-mail e incentivos de desconto para ACR.
  </Card>

  <Card title="Subscription Dunning" icon="rotate" href="/features/recovery/subscription-dunning">
    Configure as sequências de e-mail de dunning para inscrições expiradas.
  </Card>

  <Card title="Subscription Webhooks" icon="repeat" href="/developer-resources/webhooks/intents/subscription">
    Eventos relacionados ao ciclo de vida da inscrição, como `subscription.on_hold` e `subscription.cancelled`.
  </Card>
</CardGroup>

## Esquema de Payload de Webhook
