Langsung ke konten utama
Sebagai Merchant of Record, Dodo Payments mengelola proses sengketa dan chargeback dengan jaringan kartu atas nama Anda. Webhook ini menjaga sistem Anda tetap sinkron ketika sengketa bergerak melalui siklus hidupnya sehingga Anda dapat mencabut akses, mengumpulkan bukti, dan merekonsiliasi catatan Anda.

Peristiwa Webhook Sengketa

Sebuah sengketa memancarkan peristiwa di setiap tahap siklus hidupnya:
PeristiwaBerlangsung ketikaApa artinya biasanya
dispute.openedPemegang kartu membuka sengketa pada pembayaranDana ditahan; bersiap untuk merespon
dispute.challengedBukti telah diajukan untuk menentang sengketaSengketa sedang ditinjau oleh jaringan
dispute.acceptedSengketa diterima (tidak ditentang)Dana dikembalikan kepada pemegang kartu
dispute.cancelledSengketa ditarik atau dibatalkanTidak ada tindakan lebih lanjut yang diperlukan
dispute.expiredJangka waktu respons habis tanpa resolusiBiasanya diselesaikan melawan Anda
dispute.wonSengketa diselesaikan untuk kepentingan AndaDana dipertahankan
dispute.lostSengketa diselesaikan untuk kepentingan pemegang kartuDana dikembalikan kepada pemegang kartu
Sengketa yang diselesaikan otomatis melalui Visa Rapid Dispute Resolution (RDR) muncul sebagai dispute.lost dengan is_resolved_by_rdr: true. Hal ini diharapkan — pengembalian dana dikeluarkan secara otomatis untuk mencegah chargeback formal.

Menangani Peristiwa Sengketa

Ketika dispute.opened terjadi, jumlah yang disengketakan ditahan segera. Gunakan peristiwa untuk memperbarui catatan Anda dan, jika Anda berniat menentangnya, kumpulkan bukti di dasbor.
Handling dispute events
app.post('/webhooks/dodo', async (req, res) => {
  const event = req.body;

  switch (event.type) {
    case 'dispute.opened': {
      const dispute = event.data;
      // Record the dispute and consider revoking access while it is open
      await recordDispute(dispute.dispute_id, dispute.payment_id, dispute.amount);
      // Gather and submit evidence from the Dodo Payments dashboard (within 4 days)
      break;
    }
    case 'dispute.won': {
      // Funds retained — restore normal state in your records
      await markDisputeResolved(event.data.dispute_id, 'won');
      break;
    }
    case 'dispute.lost': {
      // Funds returned to the cardholder — reconcile and keep access revoked
      await markDisputeResolved(event.data.dispute_id, 'lost');
      break;
    }
  }

  res.json({ received: true });
});
Selalu verifikasi tanda tangan webhook sebelum memproses — lihat panduan Webhooks untuk pengaturan. Penangan di atas menghilangkan verifikasi untuk singkatnya.
Anda memiliki 4 hari untuk merespon sengketa setelah dibuat. Lihat Praktik Terbaik Respons Sengketa untuk bukti yang harus dikumpulkan dan cara memformatnya.

Status dan Tahapan Sengketa

Objek sengketa melaporkan kemajuannya melalui dua bidang:
BidangNilai
dispute_statusdispute_opened, dispute_expired, dispute_accepted, dispute_cancelled, dispute_challenged, dispute_won, dispute_lost
dispute_stagepre_dispute, dispute, pre_arbitration

Terkait

Managing Disputes

Cara merespon sengketa, menyerahkan bukti, dan bagaimana RDR melindungi tingkat sengketa Anda.

Handle Payment Failures

Deteksi dan pulihkan pembayaran yang gagal sebelum menjadi sengketa.

Skema Payload Webhook

amount
string
wajib

The amount involved in the dispute, represented as a string to accommodate precision.

business_id
string
wajib

The unique identifier of the business involved in the dispute.

created_at
string<date-time>
wajib

The timestamp of when the dispute was created, in UTC.

currency
string
wajib

The currency of the disputed amount, represented as an ISO 4217 currency code.

dispute_id
string
wajib

The unique identifier of the dispute.

dispute_stage
enum<string>
wajib

The current stage of the dispute process.

Opsi yang tersedia:
pre_dispute,
dispute,
pre_arbitration
dispute_status
enum<string>
wajib

The current status of the dispute.

Opsi yang tersedia:
dispute_opened,
dispute_expired,
dispute_accepted,
dispute_cancelled,
dispute_challenged,
dispute_won,
dispute_lost
payment_id
string
wajib

The unique identifier of the payment associated with the dispute.

is_resolved_by_rdr
boolean | null

Whether the dispute was resolved by Rapid Dispute Resolution

remarks
string | null

Remarks

Terakhir diubah pada 18 Juni 2026