topic field that identifies what happened, and a data object containing the full serialized resource at the time of the change. This page describes every event type, when it fires, and what its payload looks like.
Event status lifecycle
Every event moves through the following states:| Status | Meaning |
|---|---|
PENDING | Event has been created and is queued for delivery |
PROCESSING | Kulmi Pay is actively attempting to deliver the event |
DELIVERED | Your endpoint returned a 200 response |
FAILED | Delivery failed — your endpoint was unreachable or returned a non-200 response |
GET /api/v1/webhooks/events/.
collection_event
Fires whenever a payment invoice changes state — for example, when a customer completes an M-Pesa STK push payment or a card transaction is authorized. Enable this event with thecollection_event flag on your webhook.
When it fires:
- A new invoice is created
- The invoice state transitions (e.g.
PENDING→COMPLETEorPENDING→FAILED)
state field tells you whether the payment succeeded. A COMPLETE state means funds have been received into your wallet.
send_money_event
Fires whenever a disbursement payment file changes state — for example, when a bulk payout moves fromPENDING to PROCESSED.
Enable this event with the send_money_event flag on your webhook.
When it fires:
- A payment file is created
- The file state transitions (e.g.
PENDING→PROCESSED,PREVIEW-AND-APPROVE→PENDING)
reversal_event
Fires when a chargeback or reversal is processed against your account. Use this event to update your internal records when a previously completed payment is reversed. Enable this event with thereversal_event flag on your webhook.
When it fires:
- A chargeback is created
- A chargeback status changes
subscription_event
Fires whenever a subscription changes status or completes a billing cycle. Use this event to update customer access in your application when a recurring payment succeeds or fails. Enable this event with thesubscription_event flag on your webhook.
When it fires:
- A subscription is created (status:
PENDING) - A subscription becomes active (status:
ACTIVE) - A billing cycle completes and
completed_cyclesincrements - A billing cycle fails and
fail_reasonis set - A subscription is cancelled (status:
CANCELED) or completes all cycles (status:COMPLETE)
wallet_transfer_event
Fires when a transfer occurs between your Kulmi Pay wallets — for example, moving funds from a USD wallet to a KES wallet. Enable this event with thewallet_transfer_event flag on your webhook.
When it fires:
- An intra-wallet transfer is initiated or completed
Replay failed events
If an event fails to deliver, you can replay it from your dashboard or via the API. Replaying resends the exact original payload to your webhook endpoint. To replay from the dashboard:- Go to Settings → Webhooks.
- Select your webhook and open the Events tab.
- Find the failed event and click Replay.
GET /api/v1/webhooks/events/, identify the event by its id, and trigger a replay from the dashboard. Events retain their original payload regardless of how many times they are replayed.
Replaying an event does not create a new event record — it resends the existing event. Make sure your event handler is idempotent so that processing the same event twice does not cause duplicate side effects in your system.
