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

# Recuperación

> Las cargas útiles enviadas a su endpoint de webhook cuando ocurren eventos de recuperación de carrito abandonado o suscripción fallida.

## Eventos de Recuperación de Carritos Abandonados

Los siguientes eventos de webhook rastrean el ciclo de vida de la recuperación de carritos abandonados:

| Evento                         | Descripción                                                                                                                                                     |
| ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `abandoned_checkout.detected`  | Se ha detectado un pago abandonado. Enviado cuando un pago se identifica como abandonado (fallido o incompleto) y comienza el flujo de trabajo de recuperación. |
| `abandoned_checkout.recovered` | El cliente completó el pago a través del enlace de recuperación. El campo `recovered_payment_id` contiene el ID de pago exitoso.                                |

### Campos de Carga Útil de Pago Abandonado

<ParamField body="payment_id" type="string" required>
  El pago original que fue abandonado. Úselo para buscar detalles de producto, cantidad y moneda.
</ParamField>

<ParamField body="customer_id" type="string" required>
  El cliente que abandonó el pago.
</ParamField>

<ParamField body="abandonment_reason" type="string" required>
  Por qué se abandonó el pago. Uno de:

  * `payment_failed` — El cliente intentó el pago pero falló
  * `checkout_incomplete` — El cliente visitó el pago pero nunca intentó pagar
</ParamField>

<ParamField body="status" type="string" required>
  Estado actual del ciclo de vida de este intento de recuperación. Uno de:

  * `abandoned` — Detectado, aún no se han enviado correos electrónicos
  * `recovering` — Al menos un correo electrónico de recuperación enviado
  * `recovered` — El cliente completó el pago
  * `exhausted` — Todos los correos enviados o se encontró un nuevo pago
  * `opted_out` — Cliente se dio de baja
</ParamField>

<ParamField body="abandoned_at" type="string" required>
  Marca de tiempo ISO 8601 de cuando se detectó el pago como abandonado.
</ParamField>

<ParamField body="recovered_payment_id" type="string | null">
  El ID de pago del pago de recuperación exitoso. `null` hasta que el pago sea recuperado.
</ParamField>

### Ejemplo: Manejo de Webhooks de 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

Los siguientes eventos de webhook rastrean el ciclo de vida de la suscripción fallida:

| Evento              | Descripción                                                                                                                    |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `dunning.started`   | Se ha creado un intento de dunning para una suscripción que ingresó a `on_hold` o fue cancelada por el cliente.                |
| `dunning.recovered` | El cliente actualizó su método de pago y el pago resultante fue exitoso. El campo `payment_id` contiene el ID de pago exitoso. |

### Campos de Carga Útil de Intento de Dunning

<ParamField body="subscription_id" type="string" required>
  La suscripción que desencadenó el intento de dunning.
</ParamField>

<ParamField body="customer_id" type="string" required>
  El cliente que posee la suscripción.
</ParamField>

<ParamField body="trigger_state" type="string" required>
  El estado de suscripción que desencadenó el dunning. Uno de:

  * `on_hold` — Suscripción pausada por fallo en el pago
  * `cancelled` — Cliente canceló desde el portal del cliente
</ParamField>

<ParamField body="status" type="string" required>
  Estado actual del ciclo de vida de este intento de dunning. Uno de:

  * `recovering` — Se están enviando correos electrónicos de dunning
  * `recovered` — Cliente actualizó método de pago y el pago fue exitoso
  * `exhausted` — Todos los correos enviados o el estado de suscripción cambió
</ParamField>

<ParamField body="created_at" type="string" required>
  Marca de tiempo ISO 8601 de cuando se creó el intento de dunning.
</ParamField>

<ParamField body="payment_id" type="string | null">
  El ID de pago del pago de recuperación exitoso. `null` mientras se recupera.
</ParamField>

### Ejemplo: Manejo de 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>
  Suscríbase a ambos `dunning.started` e `dunning.recovered` para rastrear el ciclo de vida completo del dunning. Use `dunning.started` para pausar periodos de gracia o marcar suscripciones en riesgo en su sistema.
</Tip>

<CardGroup cols={2}>
  <Card title="Abandoned Cart Recovery" icon="cart-shopping" href="/features/recovery/abandoned-cart-recovery">
    Configure secuencias de correos electrónicos de ACR e incentivos de descuento.
  </Card>

  <Card title="Subscription Dunning" icon="rotate" href="/features/recovery/subscription-dunning">
    Configure secuencias de correos electrónicos de dunning para suscripciones vencidas.
  </Card>

  <Card title="Subscription Webhooks" icon="repeat" href="/developer-resources/webhooks/intents/subscription">
    Eventos relacionados con el ciclo de vida de suscripción como `subscription.on_hold` e `subscription.cancelled`.
  </Card>
</CardGroup>

## Esquema de Carga Útil de Webhook
