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

# 回復

> カート放棄回復や購読催促イベントが発生した際に、Webhookエンドポイントに送信されるペイロード。

## 放棄されたカート回復イベント

以下のWebhookイベントは放棄されたカートの回復ライフサイクルを追跡します:

| Event                          | Description                                                              |
| ------------------------------ | ------------------------------------------------------------------------ |
| `abandoned_checkout.detected`  | 放棄されたチェックアウトが検出されました。支払いが放棄された（失敗または不完全）と判断され、回復ワークフローが開始されたときに送信されます。   |
| `abandoned_checkout.recovered` | 顧客が回復リンクを通じて支払いを完了しました。`recovered_payment_id` フィールドには成功した支払いのIDが含まれています。 |

### 放棄されたチェックアウトペイロードフィールド

<ParamField body="payment_id" type="string" required>
  放棄された元の支払いです。これを使用して製品、金額、通貨の詳細を調べてください。
</ParamField>

<ParamField body="customer_id" type="string" required>
  チェックアウトを放棄した顧客。
</ParamField>

<ParamField body="abandonment_reason" type="string" required>
  なぜチェックアウトが放棄されたのか。以下のいずれか:

  * `payment_failed` — 顧客が支払いを試みたが失敗した
  * `checkout_incomplete` — 顧客がチェックアウトを訪れたが支払いを試みなかった
</ParamField>

<ParamField body="status" type="string" required>
  この回復試行の現在のライフサイクル状態。以下のいずれか:

  * `abandoned` — 検出済み、まだメールは送信されていません
  * `recovering` — 少なくとも1つの回復メールが送信済み
  * `recovered` — 顧客が支払いを完了
  * `exhausted` — すべてのメールが送信済みまたは新しいチェックアウトが見つかった場合
  * `opted_out` — 客が配信停止
</ParamField>

<ParamField body="abandoned_at" type="string" required>
  放棄されたと検出されたチェックアウトのISO 8601タイムスタンプ。
</ParamField>

<ParamField body="recovered_payment_id" type="string | null">
  成功した回復支払いの支払いID。チェックアウトが回復するまで`null`。
</ParamField>

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

***

## 催促イベント

以下のWebhookイベントはサブスクリプション催促ライフサイクルを追跡します:

| Event               | Description                                                         |
| ------------------- | ------------------------------------------------------------------- |
| `dunning.started`   | サブスクリプションが`on_hold`に入った、または顧客によってキャンセルされたときに催促試行が作成されました。           |
| `dunning.recovered` | 顧客が支払い方法を更新し、その結果支払いが成功しました。`payment_id` フィールドには成功した支払いのIDが含まれています。 |

### 催促試行ペイロードフィールド

<ParamField body="subscription_id" type="string" required>
  催促試行をトリガーしたサブスクリプション。
</ParamField>

<ParamField body="customer_id" type="string" required>
  サブスクリプションを所有する顧客。
</ParamField>

<ParamField body="trigger_state" type="string" required>
  催促を引き起こしたサブスクリプションの状態。以下のいずれか:

  * `on_hold` — 支払いの失敗によりサブスクリプションが一時停止された
  * `cancelled` — 顧客ポータルから顧客がキャンセル
</ParamField>

<ParamField body="status" type="string" required>
  この催促試行の現在のライフサイクル状態。以下のいずれか:

  * `recovering` — 催促メールが送信されています
  * `recovered` — 顧客が支払い方法を更新し、支払いが成功
  * `exhausted` — すべてのメールが送信済みまたはサブスクリプションの状態が変更
</ParamField>

<ParamField body="created_at" type="string" required>
  催促試行が作成されたときのISO 8601タイムスタンプ。
</ParamField>

<ParamField body="payment_id" type="string | null">
  成功した回復支払いの支払いID。回復している間は`null`。
</ParamField>

### 例: 催促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>
  完全な催促ライフサイクルを追跡するには、`dunning.started`と`dunning.recovered`の両方を購読します。 `dunning.started`を使用して、猶予期間の一時停止や危険なサブスクリプションをシステムでフラグ付けします。
</Tip>

<CardGroup cols={2}>
  <Card title="Abandoned Cart Recovery" icon="cart-shopping" href="/features/recovery/abandoned-cart-recovery">
    ACRメールシーケンスと割引インセンティブを設定します。
  </Card>

  <Card title="Subscription Dunning" icon="rotate" href="/features/recovery/subscription-dunning">
    期限切れサブスクリプションの催促メールシーケンスを設定します。
  </Card>

  <Card title="Subscription Webhooks" icon="repeat" href="/developer-resources/webhooks/intents/subscription">
    `subscription.on_hold`や`subscription.cancelled`のような関連サブスクリプションライフサイクルイベント。
  </Card>
</CardGroup>

## Webhookペイロードスキーマ
