Status reference

Every webhook JKAPay delivers carries the transaction's final state in data.status. Branch on this field — there is no separate event field. The table below lists every status a transaction can hold and whether it triggers a webhook delivery.

StatusFinalTriggers webhookMeaning
PENDINGNoNoThe transaction has been created in JKAPay but the customer prompt has not been dispatched yet. Internal state — no webhook is fired.
PROCESSINGNoNoThe customer prompt has been dispatched and we're awaiting their response. Returned from /v1/payments/initialize. No webhook is fired.
SUCCESSYesYesThe customer authorised the payment and money has moved. A webhook is fired to your callbackUrl.
FAILEDYesYesThe transaction will not complete — the customer declined, the prompt timed out, there were insufficient funds, or the network rejected. A webhook is fired to your callbackUrl.
Only final states fire webhooks. PENDING and PROCESSING exist for your own polling against retrieve, not for delivery.

Sample: SUCCESS

JSON
{
  "createdAt": "2026-05-25T16:30:18.213Z",
  "data": {
    "reference": "JKA_M3A8_8F2E1B4C",
    "clientReference": "ORD-12345",
    "status": "SUCCESS",
    "amount": "1.00",
    "fee": "0.02",
    "net": "0.98",
    "currency": "GHS",
    "customer": { "msisdn": "233244000000", "network": "MTN" },
    "description": "Order #12345",
    "metadata": { "orderId": "12345" },
    "completedAt": "2026-05-25T16:30:18.213Z"
  }
}

Sample: FAILED

JSON
{
  "createdAt": "2026-05-25T16:31:02.012Z",
  "data": {
    "reference": "JKA_M3A9_7C1A2D5E",
    "clientReference": "ORD-12346",
    "status": "FAILED",
    "amount": "1.00",
    "fee": "0.00",
    "net": "0.00",
    "currency": "GHS",
    "customer": { "msisdn": "233244000000", "network": "MTN" },
    "description": "Order #12346",
    "metadata": { "orderId": "12346" },
    "completedAt": "2026-05-25T16:31:02.012Z"
  }
}

Future statuses

JKAPay will introduce REFUNDED and CANCELLED when those flows ship. They'll arrive on the same webhook channel with the same envelope — your branching on data.status will continue to work without changes.