Skip to content

Payment Events

EventFires when
merchant_of_record.payment_intent.createdPayment intent created.
merchant_of_record.payment_intent.succeededPayment successful.
merchant_of_record.payment_intent.payment_failedPayment attempt failed.
merchant_of_record.payment_intent.processingPayment is being processed.
EventFires when
merchant_of_record.transaction.createdTransaction created.
merchant_of_record.transaction.completedTransaction completed.
merchant_of_record.transaction.failedTransaction failed.
merchant_of_record.transaction.requires_actionTransaction requires additional action (e.g. 3DS).
EventFires when
merchant_of_record.refund.createdRefund initiated.
EventFires when
merchant_of_record.chargeback.createdChargeback opened.
merchant_of_record.chargeback.completedChargeback resolved.
merchant_of_record.chargeback.reversedChargeback reversed in your favour.
merchant_of_record.chargeback.failedChargeback dispute lost.
EventFires when
merchant_of_record.payout.createdPayout initiated.
merchant_of_record.payout.confirmedPayout confirmed by provider.
merchant_of_record.payout.appliedPayout applied to your account.
merchant_of_record.payout.completedPayout funds delivered.
merchant_of_record.payout.failedPayout failed.
{
"type": "merchant_of_record.payment_intent.succeeded",
"data": {
"object": {
"id": "45678",
"object": "payment_intent",
"status": "PROCESSED",
"billing_amount": 100000,
"billing_currency": "ZAR",
"processing_amount": 5200,
"processing_currency": "EUR",
"merchant_reference": "BOOKING-2026-001",
"company_id": 10,
"account_id": 123
}
}
}

If you provided callback_url when creating the intent, TurnStay POSTs to {your_callback_url}/callback/payment/intent:

{
"type": "payment_intent.processed",
"status": "processed",
"payment_intent": {
"id": 45678,
"status": { "name": "PROCESSED" },
"billing_amount": 100000,
"billing_currency": { "code": "ZAR" },
"processing_amount": 5200,
"processing_currency": { "code": "EUR" },
"merchant_reference": "BOOKING-2026-001",
"customer": "Jean Dupont",
"customer_email": "jean.dupont@example.com"
}
}
@app.route("/api/turnstay/callback/payment/intent", methods=["POST"])
def turnstay_callback():
data = request.get_json()
if data["status"] == "processed":
intent = data["payment_intent"]
mark_booking_as_paid(intent["merchant_reference"], intent["billing_amount"])
return jsonify({"ok": True}), 200
app.post("/api/turnstay/callback/payment/intent", (req, res) => {
const { status, payment_intent } = req.body;
if (status === "processed") {
markBookingAsPaid(payment_intent.merchant_reference, payment_intent.billing_amount);
}
res.status(200).json({ ok: true });
});
GET /api/v1/payments/intent?payment_intent_lookup_id=pi_abc123def456

Useful for reconciliation, but don’t rely on it as your primary notification method.