Webhooks Events

A webhook is a way for our system to automatically send updates to your server when a status change happens. You give us a URL on your server, and whenever there’s an update, we send the details to that URL.

For example, if you set up a URL to receive payment.completed webhook, we’ll instantly notify your server with a payment.completed event as soon as a payment is successful.

Supported Payment Webhook Events

Here’s a list of possible events we can send to your webhook URL, allowing your system to stay up-to-date with all key payment activities.

Event NameDescription
order.createdThis event is triggered when an order is successfully created on our end.
order.completedThis event is triggered when a order is successfully paid for (Fully) on our end which means that one or more payments against the order has been successfully made and total amount of order has been captured.
payment.completedThis event is triggered when a payment is successfully completed by the customer. Only when payment is completed on our end, we fire this event so you can safely use it to mark transaction/order completed on your side.
payment.failedThis event is triggered when a payment is failed due to either timeout OR some other error.
payment.expiredThis event is triggered when a payment is expired.
payment.cancelledThis event is triggered when a payment is cancelled by the end user/customer for some reason.

Sample Webhook Payloads

{
  "id": "ord_ABC123456789",
  "amount": 256393200,
  "status": "started",
  "is_live": true,
  "currency": "IDR",
  "metadata": {
    "order_ref_id": "OD1726627699282612DO",
    "payment_ref_id": "P1234567890123"
  },
  "signature": "35d10020e4469eb22b3bf956e1ba0eca5f9afcb2f8557fe6e7db85816b8d43cb",
  "amount_str": "2563932.00",
  "created_at": "2024-09-18T02:48:35.274789Z",
  "customer_id": "cus_XYZ987654321",
  "description": "",
  "expiry_date": "2024-09-18T03:48:34.488Z",
  "merchant_id": "mer_DEF123456789",
  "payment_link_url": "https://checkout.durianpay.id/payment-link/S41w1u"
}

{
  "id": "ord_ABC123456789",
  "amount": 4500000,
  "status": "completed",
  "is_live": true,
  "currency": "IDR",
  "metadata": {},
  "signature": "be9635a6baa184243c23766b3cbb08d72201c396db735b0201a2ae534dbc1895",
  "amount_str": "45000.00",
  "created_at": "2024-09-11T14:54:32.218432Z",
  "customer_id": "cus_XYZ987654321",
  "description": "",
  "expiry_date": "2024-09-12T03:54:31Z",
  "merchant_id": "mer_DEF123456789"
}
{
  "id": "pay_ABC123456789",
  "amount": 20400000,
  "is_live": true,
  "currency": "IDR",
  "metadata": {},
  "order_id": "ord_DEF987654321",
  "signature": "f6b89ace04f7bf677e8a3df214be8ec71387b2dab79c931270cd1f0cb5682da9",
  "amount_str": "204000.00",
  "created_at": "2024-10-10T06:50:30.230085Z",
  "updated_at": "2024-10-10T06:50:47.378726Z",
  "customer_id": "cus_XYZ654321987",
  "merchant_id": "mer_GHI654321987",
  "order_ref_id": "12345678",
  "customer_name": "John Doe",
  "customer_email": "[email protected]",
  "failure_reason": {},
  "payment_method": "OVO",
  "payment_ref_id": ""
}

{
  "id": "pay_ABC123456789",
  "amount": 6800000,
  "is_live": true,
  "currency": "IDR",
  "metadata": {
    "failure_reason": "Downstream Error"
  },
  "order_id": "ord_DEF987654321",
  "signature": "ed1d3f8b51d9a5ee49dd8d651412318d6e71efe671967dc4a277b28c18571754",
  "amount_str": "68000.00",
  "created_at": "2024-10-01T13:03:07.401725Z",
  "updated_at": "2024-10-01T13:04:32.643716Z",
  "customer_id": "cus_XYZ654321987",
  "merchant_id": "mer_GHI654321987",
  "failure_reason": {
    "code": 20013,
    "message": "Downstream Error"
  },
  "payment_method": "OVO",
  "payment_ref_id": ""
}

{
  "id": "pay_ABC123456789",
  "amount": 25481600,
  "is_live": true,
  "currency": "IDR",
  "metadata": {
    "transaction_id": "1234567890123456"
  },
  "order_id": "ord_DEF987654321",
  "signature": "d9821d6ab7cebb406ea69c709446e4e58e7cb4832397368c9b76ccddba69b0f4",
  "amount_str": "254816.00",
  "created_at": "2024-10-24T07:29:21.006374Z",
  "updated_at": "2024-10-24T10:29:29.359035Z",
  "customer_id": "cus_XYZ654321987",
  "merchant_id": "mer_GHI654321987",
  "order_ref_id": "1234567890123456",
  "customer_email": "[email protected]",
  "failure_reason": {},
  "payment_method": "DANA",
  "payment_ref_id": ""
}

{
  "id": "pay_ABC123456789",
  "amount": 1800000,
  "is_live": true,
  "currency": "IDR",
  "metadata": {
    "RRN": "",
    "ISSUER_NAME": "DANA"
  },
  "order_id": "ord_DEF987654321",
  "signature": "ce2f4b930223ad12965a4489e44444563dd856437e0d3b2428f16c880c68ac59",
  "amount_str": "18000.00",
  "created_at": "2024-10-01T12:06:08.611298Z",
  "updated_at": "2024-10-01T15:06:29.773149Z",
  "customer_id": "cus_XYZ654321987",
  "merchant_id": "mer_GHI654321987",
  "order_ref_id": "J+1234567890123456789",
  "customer_name": "John Doe",
  "customer_email": "[email protected]",
  "failure_reason": {},
  "payment_method": "DANA",
  "payment_ref_id": ""
}

❗️

The amount in the webhook payload is normalized (i.e., multiplied by 100). To get the actual payment amount, please divide it by 100.

Setting Up Webhook

  1. Create Webhooks in Settings > Create New

  1. Fill up the event you want to subscribe to, give a name to webhook event and add your URL which you want us to call.

  1. Click on the create button. Where afterwards, you'll see that the webhook will be successfully created.

  1. By default, the webhook will be disabled / won't be set as primary. To enable it, you have to select the three dots on the webhook event that you want to enable > press on "Edit Webhook"

  1. Set the webhook as primary by checkmarking the "primary" checkbox then press save.

    🚧

    We only send webhooks if the event is marked as primary. Make sure the webhook you plan to use has the "primary" value set to true.

  • After you have saved the changes, the new webhook will be functional. Where it will be triggered whenever the respective event happened.

  • To test if you have implemented the webhook properly, you can send a sample webhook payload to your server by selecting "Send sample webhook" for the respective webhook.



Ensuring You Receive Every Webhook Event

Durianpay uses a retry system to ensure every status change reaches your server. When an event occurs, we send a webhook to your server. If it’s not acknowledged with a 200 OK response, we retry at intervals of 2, 5, 10, 90, and 210 minutes to ensure successful delivery.