Event Catalog
The complete list of webhook event types, grouped by product, with a payload example.
Each event has a type, generally in the format resource.action — with a few
resource_action (underscore) legacy exceptions noted below. Subscribe only to those you
need from the Dashboard. The envelope structure is described in the
webhooks introduction.
Orchestration does not emit webhooks
Routing decisions (which provider was tried, fallback, matched rule) are never delivered as
webhooks. There is no route.evaluated, route.fallback, or any other orchestration event type
to subscribe to. To inspect routing decisions, use
Konsole → Routing Log instead.
Payments
payment.succeededevent{
"id": "evt.7Yh2MpQ",
"type": "payment.succeeded",
"created_at": "2026-05-24T10:21:09.000Z",
"data": {
"reference": "trx.PVrU8x2kQ1",
"status": "succeeded",
"amount": 5000,
"currency": "XAF",
"channel": "cm.mtn"
}
}payment.failedevent{
"id": "evt.9Lp2KdT",
"type": "payment.failed",
"data": {
"reference": "trx.Aa11Bb22",
"status": "failed",
"amount": 5000,
"currency": "XAF",
"reason": "insufficient_funds"
}
}Also emitted: payment.created, payment.processing, payment.cancelled,
payment.split.processing, payment.split.succeeded, payment.split.failed.
There is no payment.refunded event
A successful refund is delivered as refund.succeeded (see Refunds below), not as a
payment.* event.
Refunds
refund.succeededevent{
"id": "evt.4Rf8MnQ",
"type": "refund.succeeded",
"data": {
"reference": "ref.9Kdm2Lp",
"transaction_reference": "trx.PVrU8x2kQ1",
"amount": 5000,
"currency": "XAF"
}
}Also emitted: refund_created, refund.processing, refund_failed, refund.cancelled. Note
the inconsistent separators — refund_created and refund_failed use an underscore while the
others use a dot; this is how the platform emits them today, not a documentation typo.
Transfers
transfer.succeededevent{
"id": "evt.3pQ9aZ7",
"type": "transfer.succeeded",
"data": {
"reference": "trf.9Kdm2Lp",
"status": "succeeded",
"amount": 100000,
"fee": 1500,
"channel": "cm.mtn"
}
}transfer.failedevent{
"id": "evt.5sRt8Uv",
"type": "transfer.failed",
"data": {
"reference": "trf.7Hn3Qw",
"status": "failed",
"amount": 100000,
"reason": "invalid_recipient"
}
}Also emitted: transfer.created, transfer.processing.
Exact names matter
The successful-transfer event is transfer.succeeded — not transfer.success or
transfer.complete. There is no transfer.reversed event.
Invoices
Emitted: invoice.created, invoice.updated, invoice.deleted. There is no invoice.paid or
invoice.payment_failed — invoice payment status changes surface through the payment.* events
on the underlying transaction instead.
Accounts (Sync)
Emitted: account.created, account.updated, account.deauthorized,
account.payment_activated, account.payment_suspended. There is no subaccount.activated or
split.executed — split-payment status is covered by the payment.split.* events under Payments.
Links
Emitted: link_created, link_updated, link_deleted (underscore-separated — a real
inconsistency in these three, not a typo).
Other resources
Emitted: customer.created, customer.updated, customer.deleted; beneficiary.created,
beneficiary.updated, beneficiary.deleted; dispute.created, dispute.updated,
dispute.closed, dispute.won, dispute.lost, dispute.deleted; balance.updated;
fee.received; webhook_endpoint.created, webhook_endpoint.updated, webhook_endpoint.deleted.
Quick reference
| Product | Events |
|---|---|
| Payments | payment.created, payment.processing, payment.succeeded, payment.failed, payment.cancelled, payment.split.processing, payment.split.succeeded, payment.split.failed |
| Refunds | refund_created, refund.processing, refund.succeeded, refund_failed, refund.cancelled |
| Transfers | transfer.created, transfer.processing, transfer.succeeded, transfer.failed |
| Invoices | invoice.created, invoice.updated, invoice.deleted |
| Accounts | account.created, account.updated, account.deauthorized, account.payment_activated, account.payment_suspended |
| Links | link_created, link_updated, link_deleted |
| Customers | customer.created, customer.updated, customer.deleted |
| Beneficiaries | beneficiary.created, beneficiary.updated, beneficiary.deleted |
| Disputes | dispute.created, dispute.updated, dispute.closed, dispute.won, dispute.lost, dispute.deleted |
| Balance / Fees | balance.updated, fee.received |
| Webhook endpoints | webhook_endpoint.created, webhook_endpoint.updated, webhook_endpoint.deleted |
There is no orchestration event category — see the callout above.
New events = compatible change
Adding a new event type is considered compatible (versioning). Ignore types you do not handle rather than rejecting the request.
Related pages