payment.* events
Payment lifecycle — succeeded, failed, pending, refunded.
Emitted by the seven payment-provider listeners. Every provider integration (Stripe, PayPal, Razorpay, Paystack, CeyPay, Skrill, CoinPayments) funnels through the same abstract listener so these event shapes are consistent.
Events
payment.succeeded
Provider confirms a successful charge.
payment.failed
Provider rejects a charge.
payment.pending
Payment initiated, awaiting provider confirmation.
payment.refunded
A specific charge is refunded (deferred).
| Event | Fires when |
|---|---|
payment.succeeded | A payment provider confirms a successful charge. |
payment.failed | A provider rejects a charge (invalid card, insufficient funds, risk rules). |
payment.pending | A payment is awaiting asynchronous provider confirmation (bank transfer, crypto). |
payment.refunded | A charge is refunded, fully or partially. |
See the dedicated pages above for full payload, field reference, and caveats per event.
Example payload
{
"id": "evt_01HX...",
"type": "payment.succeeded",
"created_at": "2026-05-18T10:05:00Z",
"api_version": "2026-05-01",
"project_id": "prj_01HX...",
"data": {
"subscription_id": "sub_01HX...",
"plan_id": "pln_01HX...",
"subscriber_id": "usr_01HX...",
"provider": "stripe",
"external_payment_id": "pi_3Nxy..",
"amount": "29.00",
"currency": "USD"
}
}What you don't get
- Card numbers / PAN / CVV. Any provider-specific credentials are stripped.
- Stripe raw webhook payloads. Use Stripe's own webhooks if you need provider internals.
- Merchant fee breakdowns. Those are an internal accounting concern surfaced only in the MemberPass dashboard.
Required abilities
Tokens subscribing to payment.* events must carry project-subscription:view-any.
How is this guide?