Skip to main content

Event Overview

Event Type: PAYMENT_SUCCESSFUL
Category: Payment
Description: Payment transaction was successful
This webhook is triggered when a payment is marked CAPTURED (after a payment success callback or VBA transfer processor).

When the webhook is sent

  • Regular payment flow: After a payment success callback is received, the payment is updated to CAPTURED and the webhook is created.
  • VBA transfer flow: After a VBA transfer payment is successfully recorded, the webhook is created.
  • The webhook is created only if your merchant account (or parent, for sub-merchants) has a webhook URL configured.

Delivery Details

Headers

Verifying. The body is serialised once and those exact bytes are both sent and signed, so hashing the raw request body as received is correct — do not re-serialise the parsed JSON first. Both signature headers are sent. Verify V2 (recommended) or V1 — see Verifying webhooks.

Payload Schema


Field Specifications

string
required
Always "PAYMENT_SUCCESSFUL" for this webhook event
string
required
UTC, no timezone suffix, e.g. "2026-02-12T10:30:00.123456". Parse tolerantly — fractional seconds can be absent.
string
required
API version of your account, e.g. "3.0.0"
string
required
Unique ID of this event (a UUID, not an ordering counter). A retry resends the same value; use it to de-duplicate.Example: "550e8400-e29b-41d4-a716-446655440000"
object
required
Payment request details (payment_id, order_id, link_id, status, message, mop_type, amount, bank_ref_num, extended_status, payment_message, payment_completed_at, utr, virtual_account_id, subscription_id, merchant_reference_id)

What to Do When You Receive This Webhook

  1. Respond with HTTP 2xx (e.g. 200 OK) as soon as you have accepted the payload, so the platform marks the delivery as successful and does not retry.
  2. Verify the signature using your Encryption Key and the raw request body (HMAC-SHA256, hex) to ensure authenticity.
  3. Use data.payment_id and data.order_id to reconcile with your system or fetch more details from the Partner API.
  4. If data.link_id is not null, the payment was made through that payment link — refund and reconcile it by data.payment_id. See Tracking a payment link.
  5. Note: You may subsequently receive a VERIFICATION_NEEDED webhook if verification details are missing on the order (see Verification Needed). LRS payments receive LRS_VERIFICATION_NEEDED instead.