Langsung ke konten utama

Peristiwa Pemulihan Keranjang yang Ditinggalkan

Peristiwa webhook berikut melacak siklus hidup pemulihan keranjang yang ditinggalkan:
PeristiwaDeskripsi
abandoned_checkout.detectedCheckout yang ditinggalkan telah terdeteksi. Dikirim saat pembayaran diidentifikasi sebagai ditinggalkan (gagal atau tidak lengkap) dan alur kerja pemulihan dimulai.
abandoned_checkout.recoveredPelanggan menyelesaikan pembayaran melalui tautan pemulihan. Kolom recovered_payment_id berisi ID pembayaran yang berhasil.

Bidang Payload Checkout yang Ditinggalkan

payment_id
string
wajib
Pembayaran asli yang ditinggalkan. Gunakan ini untuk mencari detail produk, jumlah, dan mata uang.
customer_id
string
wajib
Pelanggan yang meninggalkan checkout.
abandonment_reason
string
wajib
Mengapa checkout ditinggalkan. Salah satu dari:
  • payment_failed — Pelanggan mencoba pembayaran tetapi gagal
  • checkout_incomplete — Pelanggan mengunjungi checkout tetapi tidak pernah mencoba pembayaran
status
string
wajib
Status siklus hidup saat ini dari upaya pemulihan ini. Salah satu dari:
  • abandoned — Terdeteksi, belum ada email yang dikirim
  • recovering — Setidaknya satu email pemulihan terkirim
  • recovered — Pelanggan menyelesaikan pembayaran
  • exhausted — Semua email terkirim atau checkout baru ditemukan
  • opted_out — Pelanggan berhenti berlangganan
abandoned_at
string
wajib
Timestamp ISO 8601 ketika checkout terdeteksi sebagai ditinggalkan.
recovered_payment_id
string | null
ID pembayaran dari pembayaran pemulihan yang berhasil. null sampai checkout dipulihkan.

Contoh: Menangani Webhook ACR

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 });
});

Peristiwa Dunning

Peristiwa webhook berikut melacak siklus hidup dunning langganan:
PeristiwaDeskripsi
dunning.startedPercobaan dunning telah dibuat untuk langganan yang masuk ke on_hold atau dibatalkan oleh pelanggan.
dunning.recoveredPelanggan memperbarui metode pembayaran mereka dan pembayaran yang dihasilkan berhasil. Kolom payment_id berisi ID pembayaran yang berhasil.

Bidang Payload Percobaan Dunning

subscription_id
string
wajib
Langganan yang memicu percobaan dunning.
customer_id
string
wajib
Pelanggan yang memiliki langganan.
trigger_state
string
wajib
Status langganan yang memicu dunning. Salah satu dari:
  • on_hold — Langganan dijeda karena kegagalan pembayaran
  • cancelled — Pelanggan membatalkan dari portal pelanggan
status
string
wajib
Status siklus hidup saat ini dari percobaan dunning ini. Salah satu dari:
  • recovering — Email dunning sedang dikirim
  • recovered — Pelanggan memperbarui metode pembayaran dan pembayaran berhasil
  • exhausted — Semua email terkirim atau status langganan berubah
created_at
string
wajib
Timestamp ISO 8601 ketika percobaan dunning dibuat.
payment_id
string | null
ID pembayaran dari pembayaran pemulihan yang berhasil. null saat pemulihan.

Contoh: Menangani Webhook Dunning

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 });
});
Berlangganan ke dunning.started dan dunning.recovered untuk melacak siklus hidup dunning lengkap. Gunakan dunning.started untuk menjeda periode tenggang atau menandai langganan berisiko dalam sistem Anda.

Abandoned Cart Recovery

Konfigurasi urutan email ACR dan insentif diskon.

Subscription Dunning

Konfigurasi urutan email dunning untuk langganan yang terlewat.

Subscription Webhooks

Peristiwa siklus hidup langganan terkait seperti subscription.on_hold dan subscription.cancelled.

Skema Payload Webhook

Webhook payload for abandoned_checkout.detected and abandoned_checkout.recovered events

abandoned_at
string<date-time>
wajib
abandonment_reason
enum<string>
wajib
Opsi yang tersedia:
payment_failed,
checkout_incomplete
brand_id
string
wajib

Brand id this abandoned checkout belongs to

customer_id
string
wajib
payment_id
string
wajib
status
enum<string>
wajib
Opsi yang tersedia:
abandoned,
recovering,
recovered,
exhausted,
opted_out
recovered_payment_id
string | null
Terakhir diubah pada 18 Juni 2026