跳转到主要内容

遗弃的购物车恢复事件

以下 webhook 事件跟踪遗弃购物车恢复生命周期:
EventDescription
abandoned_checkout.detected检测到遗弃的结账。当付款被识别为遗弃(失败或未完成)且恢复工作流程开始时发送。
abandoned_checkout.recovered顾客通过恢复链接完成付款。recovered_payment_id 字段包含成功的付款 ID。

遗弃结账负载字段

payment_id
string
必填
遗弃的原始付款。使用此功能查找产品、金额和货币详情。
customer_id
string
必填
遗弃结账的顾客。
abandonment_reason
string
必填
遗弃结账的原因之一:
  • payment_failed — 顾客尝试付款但失败
  • checkout_incomplete — 顾客访问了结账页面但从未尝试付款
status
string
必填
此恢复尝试的当前生命周期状态之一:
  • abandoned — 检测到,但尚未发送电子邮件
  • recovering — 已发送至少一封恢复电子邮件
  • recovered — 顾客完成支付
  • exhausted — 所有电子邮件已发送或发现较新的结账
  • opted_out — 顾客取消订阅
abandoned_at
string
必填
检测到结账被遗弃的 ISO 8601 时间戳。
recovered_payment_id
string | null
成功恢复付款的付款 ID。在结账恢复之前是 null

示例:处理 ACR Webhooks

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 事件跟踪订阅催缴生命周期:
EventDescription
dunning.started为进入 on_hold 的订阅或被顾客取消创建催缴尝试。
dunning.recovered顾客更新了他们的付款方式并且结果付款成功。payment_id 字段包含成功的付款 ID。

催缴尝试负载字段

subscription_id
string
必填
触发催缴尝试的订阅。
customer_id
string
必填
拥有该订阅的顾客。
trigger_state
string
必填
触发催缴的订阅状态之一:
  • on_hold — 由于付款失败暂停订阅
  • cancelled — 顾客从顾客门户取消
status
string
必填
此催缴尝试的当前生命周期状态之一:
  • recovering — 正在发送催缴电子邮件
  • recovered — 顾客更新了支付方式,支付成功
  • exhausted — 所有电子邮件已发送或订阅状态已更改
created_at
string
必填
创建催缴尝试时的 ISO 8601 时间戳。
payment_id
string | null
成功恢复付款的付款 ID。在恢复过程中是 null

示例:处理催缴 Webhooks

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 });
});
订阅 dunning.starteddunning.recovered,以跟踪完整的催缴生命周期。使用 dunning.started 暂停宽限期或在系统中标记有风险的订阅。

Abandoned Cart Recovery

配置 ACR 邮件序列和折扣激励。

Subscription Dunning

配置迟延订阅的催缴邮件序列。

Subscription Webhooks

相关订阅生命周期事件,如 subscription.on_holdsubscription.cancelled

Webhook 负载架构

Webhook payload for abandoned_checkout.detected and abandoned_checkout.recovered events

abandoned_at
string<date-time>
必填
abandonment_reason
enum<string>
必填
可用选项:
payment_failed,
checkout_incomplete
customer_id
string
必填
payment_id
string
必填
status
enum<string>
必填
可用选项:
abandoned,
recovering,
recovered,
exhausted,
opted_out
recovered_payment_id
string | null
Last modified on April 20, 2026