Payment Events#
CasaPay sends webhook events for all payment lifecycle changes.
Event Types#
| Event | Description |
|---|---|
payment_intent.created | A new PaymentIntent was created |
payment_intent.requires_action | PaymentIntent needs customer action |
payment_intent.processing | Payment is being processed |
payment_intent.succeeded | Payment succeeded |
payment_intent.payment_failed | Payment attempt failed |
payment_intent.canceled | PaymentIntent was canceled |
charge.succeeded | Charge was successful |
charge.failed | Charge failed |
charge.refunded | Charge was refunded |
payment_method.attached | Payment method attached to customer |
payment_method.detached | Payment method detached |
mandate.created | Direct debit mandate created |
mandate.active | Mandate is active and ready for charges |
mandate.cancelled | Mandate was cancelled |
mandate.failed | Mandate setup failed |
bank_authorisation.authorised | Bank authorisation completed |
bank_authorisation.failed | Bank authorisation failed |
dispute.created | Dispute was opened |
dispute.updated | Dispute status changed |
dispute.won | Dispute resolved in your favor |
dispute.lost | Dispute resolved in tenant's favor |
Event Object#
{
"id": "evt_pay_abc123",
"object": "event",
"type": "payment_intent.succeeded",
"data": {
"object": {
"id": "pi_1a2b3c4d",
"object": "payment_intent",
"amount": 120000,
"currency": "eur",
"status": "succeeded",
"customer": "cus_123456789",
"payment_method": "pm_card_visa"
}
},
"created": 1706140800
}Handling Payment Events#
app.post('/webhooks/casapay', async (req, res) => {
const event = req.body;
switch (event.type) {
case 'payment_intent.succeeded':
await recordSuccessfulPayment(event.data.object);
break;
case 'payment_intent.payment_failed':
await handleFailedPayment(event.data.object);
break;
case 'mandate.active':
await enableRecurringPayments(event.data.object);
break;
case 'dispute.created':
await alertDisputeTeam(event.data.object);
break;
}
res.status(200).send();
});