Webhook payloads
Event types, payload fields, and signatureKeys
Field-level reference for the event objects Kashier sends. For endpoint setup, acknowledgement, and signature verification, see the Webhooks guide.
Events
The event field is the transaction operation, set verbatim. Events:
payauthorizecapturerefundpartial_refundvoidrejectreversal
These are the values Kashier sets on a delivered event. The set you can subscribe a configured webhook to is narrower — see Create a webhook.
Branch on status, not on event
event is not a success signal. A webhook also fires when the operation fails: the event is unchanged and data.status is FAILURE. Read data.status — SUCCESS, FAILURE, or PENDING — to decide the outcome. Never treat the arrival of a pay event as a completed payment. status is the transaction status, not the order status.
Event payload
Each event is structured as an Event object with a data payload that contains the transaction details.
{
"event": "pay",
"data": {
"merchantOrderId": "1642935044835",
"kashierOrderId": "efb3d440-e3bf-4c86-b98e-c7bb1cbbcca1",
"orderReference": "TEST-ORD-33581",
"transactionId": "TX-249893122",
"status": "SUCCESS",
"method": "card",
"creationDate": "2022-01-23T10:50:54.261Z",
"amount": 11334,
"currency": "EGP",
"card": {
"cardInfo": {
"cardHolderName": "John Doe",
"cardBrand": "Mastercard",
"maskedCard": "511111******1118"
},
"merchant": { "merchantRedirectURL": "http://localhost:9000/callback" },
"amount": 11334,
"currency": "EGP"
},
"metaData": { "time": "2022-01-23T10:50:52.562Z" },
"transactionResponseCode": "00",
"transactionResponseMessage": { "en": "Approved", "ar": "تمت الموافقة" },
"channel": "online | e-commerce",
"merchantDetails": { "businessEmail": "[email protected]" },
"signatureKeys": [
"amount",
"channel",
"currency",
"kashierOrderId",
"merchantOrderId",
"method",
"orderReference",
"status",
"transactionId",
"transactionResponseCode"
],
"platform": {}
}
}Field notes
merchantOrderId— pass this key back to Kashier to reconcile your orders. Learn more about order reconciliation.settlementInfo— per-transaction fee and settlement reconciliation block:vat,sellingRate,sellingFlat,totalSellingRate,totalSellingFees,settledAmount.posSerialNumber,posTerminalId,posBranchName— identify the physical POS device, terminal, and branch on POS-originated transactions. Present only when the transaction came through a POS channel.installmentPlan— installment plan details when the transaction was paid via an installment plan (e.g. valU, bank installments).card— present only whenmethodiscard. Carries the maskedcardInfo(cardHolderName,cardBrand,maskedCard) andmerchant.merchantRedirectURL. This is where masked card details arrive.sourceOfFunds— source-of-funds detail. Older published samples showed full card tokens here (cardHash,ccvToken,cardDataToken) alongside a3DSecure.processACSRedirectURLblock; the current payload builder emits neither, so don't build against them. Read masked card details fromcard.cardInfoinstead.merchantDetails— merchant identification. The payload builder setsbusinessEmail; treat any other key as unconfirmed until you see it in a delivery of your own.apikeyname— the name of the API key the transaction was created with, useful when you run several keys across stores or environments.paymentMethodandchannel— the method object and the channel the payment came through (e.g.online,e-commerce).originDetails— origin detail for the transaction.platform— the originating platform. Empty for direct API integrations, populated for platform-originated orders such as ecommerce plugins, so don't assume{}.signatureKeys— the keys of thedataobject that Kashier used to compute the HMAC signature for this request. Sort the array alphabetically, select those keys and their values fromdata, and build the signature payload from them. Verify the result against thex-kashier-signatureheader — see signature verification.hash— an internal Kashier integrity field (sent for non-Wix platforms), not a merchant-facing signature. It's signed with a server-side secret you don't hold, so do not attempt to verify it. Always verify webhooks usingx-kashier-signatureas described above; ignoredata.hashif present.