Webhooks

How Icone Pay notifies your server when payments complete.

Receiving Events

When a payment's status changes, we POST a JSON event to your route's webhook URL. Each request is HMAC signed (see Verifying Webhooks) and retried with backoff if your endpoint is unavailable (see Delivery and Retries).

Event Payload

Every event carries both the presentment and the charged amounts, plus the COD split where relevant, so you can reconcile precisely.

{
  "orderId": "V1StGXR8_Z5jdHi6B-myT",
  "referenceId": "order_1024",
  "action": "purchase",
  "status": "successful",
  "event": "payment.success",
  "paymentMethod": "moncash",
  "amount": 2500,
  "currency": "htg",
  "paymentAmount": 2500,
  "paymentCurrency": "htg",
  "exchangeRate": 1,
  "codAmount": 0,
  "prepaidAmount": 0,
  "timestamp": "2026-06-11T14:05:00.000Z"
}
FieldTypeDescription
amount / currencynumber / stringWhat you priced (presentment).
paymentAmount / paymentCurrencynumber / stringWhat the customer was charged.
exchangeRatenumberPresentment → payment rate used (1 when no conversion).
codAmount / prepaidAmountnumberPay-on-delivery split; 0 for fully-online orders.

Event Types

eventWhen
payment.successPayment completed (or COD collected).
payment.failedPayment failed, expired, or COD cancelled.
order.cod_placedA pay-on-delivery order was placed, awaiting collection.

Responding

Return any 2xx status to acknowledge an event. A non-2xx response (or a timeout) is treated as a failed delivery and the event is retried. Make your handler idempotent — use orderId to ignore duplicates.