Payout events are delivered through the same Pulse (webhook) mechanism as payments. Register
a project webhook endpoint in the dashboard and subscribe it to the payout triggers. Unlike
payment intents, payouts have no per-payout webhook_url field; delivery is configured at
the project level.
For the full delivery mechanics — retries, at-least-once semantics, signed vs. unsigned
delivery, and how to verify authenticity — see Payment webhooks.
Everything described there applies equally to payout events.
Events
| Event | Description |
|---|
payout.completed | The payout was successfully settled to the recipient. |
payout.failed | The payout failed and the amount was not delivered. |
Payload
{
"event": "payout.completed",
"payout": {
"id": "po_...",
"amount": { "value": 5000, "formatted": "5,000 XOF", "short": "5K", "currency": "XOF" },
"method": "momo_mtn",
"status": "completed",
"reference": "PO-2026-0001",
"description": "Salary payout",
"customer": { "id": "cus_...", "first_name": "Jane", "last_name": "Doe", "email": "[email protected]" },
"instrument": { "id": "poi_...", "type": "phone", "phone_number": "+22990000000", "country": "BJ" },
"gateway": { "transaction": { "id": "gw_tx_123", "reference": "po_ref_generated", "external_id": null } },
"fee_amount": 0,
"failure": { "code": null, "message": null },
"initiated_at": "2026-06-14T10:00:00+00:00",
"completed_at": "2026-06-14T12:00:00+00:00",
"failed_at": null,
"created_at": "2026-06-14T10:00:00+00:00"
}
}
Handler pattern
$event = json_decode(file_get_contents('php://input'), true);
// Re-fetch to get the authoritative status — do not trust the payload alone.
$payout = $orqex->payouts()->retrieve($event['payout']['id']);
if ($payout->status === 'completed') {
// process the successful payout (idempotently)
}
if ($payout->status === 'failed') {
// handle failure: inspect $payout->failure
}
http_response_code(200);
Handling rules
- Respond with 2xx quickly; do slow work asynchronously.
- Events are at-least-once — key your processing on
payout.id + event.
- Always re-fetch the payout from the API and act on that authoritative status.
The payout.completed event signals that Orqex has verified the outcome — not merely that
the gateway acknowledged the request. You can act on it confidently after re-fetching.