API Disbursement Timeout dan Pending: Memahami Retry, Webhook, dan Idempotency

Request API sudah dikirim, tetapi sistem tidak menerima response. Apakah transfer otomatis gagal? Belum tentu.

Dalam integrasi API disbursement, salah satu tantangan terbesar justru muncul ketika hasil transaksi belum dapat dipastikan. Request dapat mengalami timeout, transaksi berada dalam status pending, callback terlambat diterima, atau notification yang sama masuk lebih dari sekali.

Situasi seperti ini bukan sekadar edge case yang baru perlu dipikirkan setelah sistem masuk production. Timeout, retry, idempotency, webhook, transaction status, dan reconciliation merupakan bagian dari transaction lifecycle yang sebaiknya sudah dirancang sejak awal.

Bagi Anda yang ingin memahami konsep dasarnya terlebih dahulu, baca API Disbursement: Pengertian, Cara Kerja, dan Kegunaannya untuk Bisnis. Artikel ini akan lebih fokus pada reliability dan bagaimana sistem menangani transaksi ketika prosesnya tidak berjalan sesuai happy path.

Transaction Lifecycle API Disbursement Tidak Selalu Berakhir dalam Satu Response

Dalam implementasi sederhana, sebuah API sering dibayangkan bekerja melalui pola request → response. Sistem mengirim instruksi, provider memprosesnya, kemudian response diterima. Untuk transaksi pembayaran, alurnya tidak selalu sesederhana itu.

Request dapat berhasil diterima provider sementara transaksi masih diproses oleh sistem lain sebelum mencapai status final.

Karena itu, lifecycle sebuah payout bisa bergerak dari Created → Submitted → Processing → Success, atau berakhir sebagai Failed.

Ada pula transaksi yang berada dalam kondisi Pending atau Unknown sebelum status akhirnya diketahui.

Nama status akan berbeda pada setiap provider. Hal yang lebih penting adalah memahami mana status yang sudah final dan mana yang masih membutuhkan tindak lanjut.

KondisiApa yang diketahui sistem?Risiko jika salah ditangani
SuccessTransaksi mencapai status berhasilRelatif rendah
FailedTransaksi mencapai status gagalRetry yang tidak sesuai
PendingFinal status belum tersediaDianggap gagal terlalu cepat
TimeoutResponse tidak diterimaDuplicate payout
Callback terlambatInternal state mungkin tertinggalStatus tidak sinkron
Duplicate callbackNotification diterima kembaliSide effect dijalankan dua kali

Perbedaan antara failed dan unknown sangat penting. Failed berarti sistem telah memperoleh hasil bahwa transaksi gagal, sedangkan unknown berarti informasi yang tersedia belum cukup untuk menentukan hasil transaksi.

Unknown bukan sinonim dari failed.

Apa yang Terjadi Ketika API Disbursement Timeout?

API disbursement timeout terjadi ketika sistem tidak memperoleh response dalam batas waktu yang ditentukan. Kondisi ini tidak otomatis membuktikan bahwa transaksi gagal diproses.

Misalnya sistem perusahaan mengirim payout sebesar Rp5 juta kepada Vendor A. Request berhasil keluar dari internal system dan diterima oleh provider, tetapi koneksi terputus sebelum response kembali.

Dari perspektif internal system, beberapa skenario mungkin terjadi. Request bisa saja tidak pernah sampai ke provider, sudah diterima tetapi belum diproses, sedang diproses, atau bahkan sudah berhasil diproses sementara response-nya gagal diterima.

Masalahnya, seluruh skenario tersebut bisa terlihat sama dari sisi aplikasi: timeout.

Karena itu, membuat aturan otomatis berupa timeout → kirim ulang transfer dapat menimbulkan risiko. Request pertama mungkin sebenarnya sudah diterima. Ketika aplikasi membuat transaksi baru untuk menggantikannya, penerima berpotensi memperoleh payout kedua.

Di sinilah transaction identifier, status inquiry, retry policy, dan idempotency mulai menjadi penting. Kyrim sebelumnya juga membahas aspek-aspek tersebut dalam Memilih Provider API Disbursement: 12 Hal yang Perlu Dicek Sebelum Integrasi.

Bagaimana Idempotency Membantu Mencegah Duplicate Payout?

Dalam konteks pembayaran, idempotency membantu memastikan pengulangan terhadap operasi yang sama tidak menghasilkan efek finansial berulang.

Bayangkan internal system membuat transaksi dengan identifier PAYOUT-847291 untuk pembayaran Rp5 juta kepada Vendor A. Request tersebut dikirim, tetapi koneksi mengalami timeout sebelum aplikasi menerima response.

Ketika sistem perlu melakukan retry, transaksi yang sama sebaiknya tetap dapat dikenali sebagai operasi yang sama sesuai mekanisme yang ditentukan provider. Dengan begitu, retry tidak serta-merta diperlakukan sebagai instruksi untuk membuat pembayaran baru.

Masalahnya akan berbeda ketika setiap percobaan menghasilkan identifier baru seperti PAYOUT-847291-RETRY-2. Provider dapat melihat request tersebut sebagai transaksi berbeda, tergantung kontrak API yang digunakan.

Idempotency bukan sekadar unique transaction ID

Memiliki identifier unik memang penting, tetapi belum menjawab seluruh persoalan. Engineering team perlu memahami bagaimana provider memperlakukan identifier tersebut ketika request dikirim kembali.

Beberapa pertanyaan yang perlu dijawab antara lain: apakah request dengan identifier yang sama akan mengembalikan transaksi sebelumnya, apakah duplicate request ditolak, berapa lama identifier tersebut berlaku, apakah payload harus identik, serta apa yang terjadi ketika identifier sama digunakan dengan nominal berbeda.

Detail seperti ini tidak boleh diasumsikan. Implementasinya perlu mengikuti dokumentasi dan kontrak API provider yang digunakan.

Retry API Harus Mengikuti State Transaksi

Retry merupakan mekanisme penting untuk menangani gangguan sementara, tetapi retry tanpa konteks dapat mengubah masalah reliability menjadi masalah finansial.

Misalnya sebuah request ditolak karena data rekening tidak valid. Mengirim payload yang sama lima kali tidak akan memperbaiki rekening tersebut. Sistem justru perlu menghentikan proses dan meminta data diperbaiki.

Situasinya berbeda ketika koneksi timeout. Pada kondisi ini, sistem belum mengetahui apakah request sebelumnya sudah diterima atau belum. Membuat transaksi baru tanpa memeriksa state sebelumnya dapat meningkatkan risiko duplicate payout.

Karena itu, retry sebaiknya menjadi bagian dari state management. Sistem mempertahankan transaction identifier, memeriksa state yang sudah diketahui, menggunakan status inquiry atau mekanisme recovery lain yang disediakan provider, kemudian menentukan apakah retry memang diperlukan.

Prinsip sederhananya adalah:

jangan melakukan retry hanya karena tidak menerima response; lakukan retry setelah memahami state transaksi sejauh yang memungkinkan.

Pending Transaction Bukan Failed Transaction

Status pending sering menjadi sumber kebingungan karena Finance maupun pengguna ingin mendapatkan jawaban yang jelas mengenai apakah dana sudah terkirim. Namun dari perspektif sistem, pending membawa informasi penting: transaksi telah dikenal, tetapi hasil akhirnya belum tersedia.

Karena itu, aplikasi perlu memiliki definisi yang jelas mengenai non-final state dan final state.

Secara konseptual, transaksi dapat bergerak melalui Created → Submitted → Processing → Pending sebelum akhirnya mencapai Success atau Failed. Model sebenarnya tentu harus mengikuti state yang disediakan provider, bukan dibuat berdasarkan asumsi terhadap nama status.

Pending juga tidak seharusnya otomatis berubah menjadi failed hanya karena transaksi belum selesai setelah beberapa detik. Engineering team perlu mengetahui bagaimana provider memperbarui transaksi, kapan status inquiry dapat dilakukan, dan kapan sebuah transaksi dianggap benar-benar mencapai final state.

Topik ini juga menjadi salah satu hal yang perlu diperiksa ketika memilih provider API Disbursement

Bagaimana Sistem Mendapatkan Final Status Transaksi?

Setelah transaksi masuk ke non-final state, internal system membutuhkan mekanisme untuk mengetahui perkembangannya. Dua pola yang umum digunakan adalah status inquiry dan webhook atau callback.

Status Inquiry

Pada status inquiry, internal system secara aktif meminta status transaksi kepada provider. Misalnya sistem menanyakan status PAYOUT-847291, kemudian provider mengembalikan informasi bahwa transaksi tersebut masih PROCESSING.

Mekanisme ini berguna ketika aplikasi perlu melakukan recovery terhadap transaksi yang statusnya belum jelas. Salah satu contohnya adalah setelah request mengalami timeout. Daripada langsung membuat payout baru, internal system dapat menggunakan mekanisme pengecekan status yang tersedia untuk mengetahui apakah transaksi sebelumnya sudah dikenal atau diproses.

Webhook atau Callback

Webhook bekerja dari arah sebaliknya. Provider mengirim notification ke endpoint perusahaan ketika terdapat perubahan status tertentu.

Misalnya PAYOUT-847291 berubah dari PROCESSING menjadi SUCCESS. Provider dapat mengirim informasi tersebut ke internal system sehingga status transaksi dapat diperbarui tanpa melakukan polling terus-menerus.

Namun webhook tetap merupakan komunikasi melalui jaringan. Endpoint perusahaan bisa unavailable, acknowledgment bisa timeout, atau notification yang sama dapat dikirim kembali. Karena itu, keberadaan webhook tidak dengan sendirinya menyelesaikan seluruh masalah reliability.

Webhook Handler Harus Siap Menerima Duplicate Notification

Misalnya provider mengirim notification bahwa PAYOUT-847291 telah berhasil. Internal system menerima informasi tersebut, memperbarui transaksi, tetapi acknowledgment gagal diterima provider.

Provider kemudian mengirim notification yang sama untuk kedua kalinya.

Apabila setiap webhook langsung menjalankan seluruh business action dari awal, duplicate notification dapat menyebabkan efek yang tidak diinginkan. Sistem sebaiknya mengenali transaction atau event identifier, memeriksa current state, memastikan state transition valid, kemudian baru melakukan perubahan yang diperlukan.

Secara sederhana, flow-nya dapat berupa:

Receive notification → Verify request → Identify transaction → Check current state → Update transaction → Record event → Acknowledge

Dengan desain seperti ini, duplicate notification tidak otomatis berarti duplicate business action.

Webhook Juga Perlu Diverifikasi

Webhook endpoint menerima request dari luar sistem perusahaan. Karena itu, aplikasi tidak seharusnya memperbarui status pembayaran hanya karena menerima payload yang menyatakan payment_status = SUCCESS.

Notification perlu diverifikasi sesuai mekanisme keamanan yang ditentukan provider. Implementasinya dapat berupa autentikasi, signature verification, atau mekanisme lain sesuai kontrak API yang digunakan.

Dalam konteks Open API Pembayaran di Indonesia, Standar Nasional Open API Pembayaran (SNAP) Bank Indonesia mencakup berbagai aspek teknis dan keamanan, termasuk protokol komunikasi, arsitektur API, autentikasi, otorisasi, enkripsi, pengelolaan akses API, serta struktur request dan response. Bank Indonesia juga mengatur aspek tata kelola dan manajemen risiko melalui ketentuan implementasi SNAP.

Artinya, reliability dan security sebaiknya tidak diperlakukan sebagai dua diskusi yang sepenuhnya terpisah. Sistem perlu memastikan status transaksi dapat diperoleh secara konsisten sekaligus memastikan informasi tersebut berasal dari pihak yang valid.

Seperti Apa Arsitektur API Disbursement yang Lebih Reliable?

Tidak ada satu arsitektur yang otomatis tepat untuk seluruh provider dan use case. Namun, salah satu prinsip yang cukup penting adalah tidak membuat seluruh payment workflow bergantung pada satu synchronous API response.

Secara sederhana, alurnya dapat terdiri dari:

Business System → Payment Service → Disbursement Provider → Payment Infrastructure

Payment service perlu menyimpan state transaksi yang dibutuhkan sistem, misalnya internal_transaction_id, provider_reference, nominal, destination, current status, timestamp, dan informasi retry yang relevan. Data yang benar-benar disimpan tentu perlu disesuaikan dengan kebutuhan bisnis dan security policy perusahaan.

Dari sana, transaction lifecycle dapat memiliki tiga jalur.

Synchronous path menangani create payout dan initial response. Asynchronous path menerima webhook atau callback ketika provider memiliki pembaruan status. Sementara itu, recovery path menangani transaksi pending atau unknown melalui status inquiry dan reconciliation.

Dengan desain tersebut, satu response API tidak menjadi satu-satunya sumber informasi mengenai apa yang terjadi terhadap transaksi setelah request meninggalkan internal system.

Contoh Transaction Lifecycle pada Payout Marketplace

Bayangkan seorang seller mencairkan saldo sebesar Rp2,5 juta. Marketplace membuat internal transaction ID WD-1009281.

Dalam kondisi normal, transaksi dibuat dan request dikirim ke provider. Provider mulai memproses pembayaran, kemudian final status diterima melalui mekanisme yang tersedia. Setelah status menjadi SUCCESS, marketplace memperbarui withdrawal seller sebagai selesai.

Flow-nya kurang lebih:

Created → Submitted → Processing → Success → Withdrawal Completed

Sekarang bayangkan request mengalami timeout setelah dikirim. Internal system tidak sebaiknya langsung membuat WD-1009282 untuk menggantikan transaksi sebelumnya karena belum diketahui apakah request pertama sudah diproses.

Sebaliknya, WD-1009281 tetap dipertahankan sebagai transaksi yang membutuhkan konfirmasi. Sistem dapat menempatkannya dalam internal state seperti UNKNOWN atau PENDING_CONFIRMATION, kemudian menggunakan mekanisme provider untuk memperoleh status terbaru.

Apabila provider kemudian menunjukkan transaksi masih PROCESSING, sistem cukup menunggu final update. Ketika status akhirnya menjadi SUCCESS, withdrawal dapat diselesaikan tanpa pernah membuat payout kedua.

Satu payout tetap memiliki satu transaction identity sepanjang lifecycle-nya.

Bagaimana Menangani Failed Payout?

Tidak semua failure memiliki penyebab dan konsekuensi yang sama. Invalid recipient information berbeda dengan temporary network issue, dan keduanya berbeda dengan transaksi yang ditolak setelah masuk tahap processing.

Karena itu, failure handling sebaiknya diterjemahkan menjadi business action yang jelas.

KondisiPendekatan umum
Invalid inputPerbaiki data sebelum request baru
PendingTunggu update atau lakukan inquiry
Timeout / unknownVerifikasi state sebelum retry
Final failedIkuti failure handling provider
SuccessSelesaikan transaksi
Duplicate callbackJangan ulangi side effect

Tabel tersebut merupakan pola konseptual, bukan aturan universal. Error code, transaction state, dan retry recommendation tetap perlu mengikuti provider yang digunakan.

Inilah alasan dokumentasi API yang baik perlu menjelaskan lebih dari sekadar cara membuat transaksi. Engineering team perlu memahami seluruh perjalanan create → response → processing → status → recovery → reconciliation.

Reliability Bukan Berarti Semua Transaksi Selalu Berhasil

Sistem pembayaran yang reliable bukan sistem yang tidak pernah mengalami kegagalan. Gangguan jaringan bisa terjadi, destination bank dapat mengalami kendala, provider dapat mengalami incident, webhook dapat terlambat, dan internal service perusahaan sendiri juga dapat unavailable.

Reliability lebih dekat dengan kemampuan sistem untuk mengetahui kondisi transaksi ketika salah satu bagian tersebut gagal dan memulihkannya tanpa menciptakan pembayaran ganda.

Karena itu, reliability API disbursement biasanya dibangun dari beberapa komponen yang saling melengkapi: transaction state, unique reference, idempotency, controlled retry, webhook atau callback, status inquiry, reconciliation, dan audit trail.

Pedoman tata kelola SNAP Bank Indonesia juga mencakup risk assessment, mitigasi risiko, internal control, monitoring, serta security control dalam penyelenggaraan Open API Pembayaran. Informasi lebih lanjut dapat dilihat melalui Pedoman Tata Kelola SNAP Bank Indonesia.

Reconciliation Tetap Penting Meski Sistem Sudah Real-Time

Penggunaan API dan webhook tidak menghilangkan kebutuhan reconciliation.

Bayangkan database internal masih mencatat WD-1009281 = PROCESSING, sedangkan provider sudah mencatat WD-1009281 = SUCCESS. Perbedaan tersebut dapat terjadi karena webhook gagal diterima, update database internal gagal tersimpan, atau terdapat incident di antara dua proses.

Reconciliation membantu menemukan discrepancy seperti ini dengan mencocokkan internal transaction ID, provider reference, final provider status, dan Finance record.

Karena itu, reference ID dan reconciliation sebaiknya sudah dipertimbangkan ketika merancang integrasi. Menambahkannya setelah Finance mulai menemukan transaksi yang tidak cocok akan jauh lebih merepotkan.

Pembahasan mengenai reconciliation juga menjadi bagian dari checklist 12 hal yang perlu dicek sebelum memilih provider API Disbursement.

Jangan Hanya Menguji Happy Path di Sandbox

Sandbox yang hanya menghasilkan request → success belum cukup menggambarkan kondisi production.

Engineering team juga perlu memahami bagaimana sistem berperilaku ketika request invalid, transaksi gagal atau pending, koneksi timeout, notification diterima dua kali, webhook endpoint unavailable, atau status internal tidak lagi sama dengan status provider.

Selain success scenario, testing idealnya mencakup:

  • invalid request dan validation error;
  • pending transaction;
  • timeout atau unknown state;
  • duplicate request;
  • failed payout;
  • delayed atau duplicate webhook;
  • retry dan status inquiry;
  • reconciliation setelah terjadi discrepancy.

SNAP juga menyediakan informasi mengenai pengujian Open API Pembayaran berbasis standar teknis dan keamanan melalui ekosistem Developer Site-nya. Informasi resminya tersedia pada halaman SNAP Bank Indonesia.

Sementara itu, perusahaan yang masih menentukan apakah workflow pembayaran membutuhkan API atau cukup menggunakan metode lain dapat membaca Bulk Payment, Host-to-Host, atau API: Mana yang Tepat untuk Pembayaran Bisnis?.

Checklist Reliability Sebelum API Disbursement Masuk Production

Sebelum go-live, Product, Engineering, dan Finance sebaiknya sudah memiliki jawaban yang konsisten terhadap beberapa pertanyaan berikut:

  1. Apa seluruh transaction state yang dapat terjadi?
  2. Mana yang merupakan final dan non-final state?
  3. Apa yang dilakukan ketika create request timeout?
  4. Bagaimana duplicate payout dicegah?
  5. Bagaimana provider menangani idempotency atau duplicate request?
  6. Kondisi apa yang aman untuk di-retry?
  7. Bagaimana transaction status diperiksa?
  8. Bagaimana webhook atau callback diverifikasi?
  9. Apa yang terjadi ketika webhook endpoint unavailable?
  10. Apakah duplicate webhook aman diproses?
  11. Bagaimana internal transaction ID dipetakan dengan provider reference?
  12. Bagaimana transaksi yang terlalu lama pending ditangani?
  13. Bagaimana reconciliation dilakukan?
  14. Apakah perubahan state dapat ditelusuri melalui audit trail?

Kalau sebagian besar jawabannya masih bergantung pada “nanti lihat response API”, integration design kemungkinan masih terlalu fokus pada happy path.

API Disbursement Kyrim untuk Workflow Pembayaran Bisnis

Implementasi API yang baik bukan hanya soal apakah sistem berhasil melakukan transfer. Hal yang sama pentingnya adalah bagaimana pembayaran masuk ke keseluruhan workflow perusahaan, mulai dari instruksi dibuat, transaksi diproses, status dipantau, sampai hasil akhirnya dapat ditelusuri kembali.

Kyrim menyediakan solusi pembayaran bisnis melalui API maupun dashboard, sehingga perusahaan dapat memilih pendekatan berdasarkan karakter workflow-nya. Pembayaran periodik yang sudah terjadwal, misalnya, tidak selalu membutuhkan metode yang sama dengan payout yang dipicu langsung oleh aktivitas dalam sebuah aplikasi.

Pada marketplace, flow pembayaran dapat dimulai dari seller withdrawal, kemudian masuk ke validation, payout, status update, dan pembaruan saldo seller. Untuk vendor payment, prosesnya bisa dimulai dari invoice approval, diteruskan ke payout, lalu berakhir pada status dan reconciliation. Sementara pada bisnis berbasis kemitraan, perhitungan komisi dapat langsung menjadi sumber instruksi pembayaran.

Pendekatan seperti ini membuat API lebih dari sekadar kanal transfer. API menjadi penghubung antara business event dan payment execution.

Kyrim juga mendukung kebutuhan pembayaran bisnis melalui solusi transfer dan pembayaran, sementara perusahaan yang ingin memahami fondasi API disbursement dapat memulai dari panduan API Disbursement Kyrim.

Dari API yang Bisa Transfer ke API yang Siap Production

Demo API sering terlihat sederhana: request dikirim, response berhasil diterima, kemudian transaksi selesai. Production memiliki lebih banyak kemungkinan. Ada request yang timeout, transaksi yang belum mencapai final state, callback yang terlambat, internal service yang sempat unavailable, dan state antar-sistem yang perlu direkonsiliasi.

Karena itu, kualitas integrasi API disbursement tidak cukup dinilai dari keberhasilan melakukan payout pada kondisi normal.

Pertanyaan yang lebih penting adalah: ketika happy path tidak terjadi, apakah sistem masih mengetahui apa yang terjadi terhadap transaksi tersebut?

Bagi perusahaan yang sedang merancang payout, vendor payment, atau pembayaran bisnis lainnya melalui API, evaluasi sebaiknya mencakup transaction lifecycle, failure handling, retry behaviour, webhook, reconciliation, dan kebutuhan operasional Finance setelah integrasi berjalan.

Ingin mendiskusikan API Disbursement untuk sistem perusahaan Anda?

Kyrim membantu bisnis mengelola pembayaran melalui API maupun dashboard, sehingga workflow dapat disesuaikan dengan kebutuhan integrasi dan operasional perusahaan.

Pelajari solusi pembayaran Kyrim atau kunjungi Kyrim untuk mendiskusikan kebutuhan integrasi perusahaan Anda.

Table of Contents