POS Payment Status Webhook Payload
{
"merchantId": "41a77f74-8b67-4f04-be50-c8dd5ad8836f",
"customerId": "Abcam",
"consumerId": "60513141-4d0f-4d3d-9c8a-cc1bd61f40fd",
"merchantName": "My Shop",
"paymentIdempotencyId": "ATOA1695808662681",
"status": "COMPLETED",
"statusDetails": null,
"paidAmount": 25.50,
"tipAmount": 0,
"currency": "GBP",
"createdAt": "2026-03-20T14:30:00.000Z",
"updatedAt": "2026-03-20T14:31:00.000Z",
"taxAmount": 0,
"serviceAmount": 0,
"transactionType": "CARD",
"storeDetails": {
"id": "d77e02d5-4e93-46cf-a8be-50da650df562",
"address": "London",
"locationName": "London Store"
},
"orderId": "POS-ORDER-001",
"paymentRequestId": "9baa68d8-362a-4127-994d-2ea622ef35ee",
"errorDescription": null,
"redirectUrlParams": "{}",
"splitBill": false,
"notes": "POS terminal payment",
"customFields": [
{
"fieldName": "Invoice Number",
"value": "INV-2026-0042",
"filledBy": "BUSINESS"
}
],
"eventType": "POS_PAYMENT_STATUS"
}
Delivers notifications for all POS terminal (Pax machine) activity:
- Payments — Pay by Bank and card payments at the terminal.
- Refunds (voids) — refunds from the POS terminal. Not delivered under
REFUND_STATUS.
API or Dashboard refunds are delivered under REFUND_STATUS, not here.
Payment statuses
| Status | Description |
|---|---|
| COMPLETED | Payment processed successfully. Funds have been transferred to the merchant’s account. |
| FAILED | Payment was unsuccessful, including reversed transactions. The customer will need to retry. |
| EXPIRED | Payment request expired before the customer completed the payment. |
Refund statuses
| Status | Description |
|---|---|
| COMPLETED | Refund processed successfully. Funds have been credited to the customer’s account. |
| FAILED | Refund could not be processed. The refund may need to be retried. |
Distinguish payment from refund deliveries by checking for refundId. Refund payloads use refundId and refundAmount instead of payment fields like tipAmount and storeDetails.
V2 signing required: Subscribing to POS_PAYMENT_STATUS requires a V2 signing secret. All POS webhooks are delivered with V2 signing — the X-Atoa-Signature header contains the HMAC-SHA256 signature and the body includes an eventType field.
Payloads
Custom fields
Custom fields collected during the terminal payment appear as a customFields array. For refunds, custom fields from the original payment are carried over.
| Field | Type | Description |
|---|---|---|
fieldName | string | The name of the custom field (e.g. “Invoice Number”) |
value | string | The value entered for the field |
filledBy | string | Who provided the value — BUSINESS or PAYEE |
Only present when custom fields were entered at the terminal. Not included in PAYMENTS_STATUS or EXPIRED_STATUS webhooks.
Signature verification
All POS_PAYMENT_STATUS webhooks use V2 signing. To verify the signature, use the X-Atoa-Signature header as described in the V2 Webhook Signing guide.
{
"merchantId": "41a77f74-8b67-4f04-be50-c8dd5ad8836f",
"customerId": "Abcam",
"consumerId": "60513141-4d0f-4d3d-9c8a-cc1bd61f40fd",
"merchantName": "My Shop",
"paymentIdempotencyId": "ATOA1695808662681",
"status": "COMPLETED",
"statusDetails": null,
"paidAmount": 25.50,
"tipAmount": 0,
"currency": "GBP",
"createdAt": "2026-03-20T14:30:00.000Z",
"updatedAt": "2026-03-20T14:31:00.000Z",
"taxAmount": 0,
"serviceAmount": 0,
"transactionType": "CARD",
"storeDetails": {
"id": "d77e02d5-4e93-46cf-a8be-50da650df562",
"address": "London",
"locationName": "London Store"
},
"orderId": "POS-ORDER-001",
"paymentRequestId": "9baa68d8-362a-4127-994d-2ea622ef35ee",
"errorDescription": null,
"redirectUrlParams": "{}",
"splitBill": false,
"notes": "POS terminal payment",
"customFields": [
{
"fieldName": "Invoice Number",
"value": "INV-2026-0042",
"filledBy": "BUSINESS"
}
],
"eventType": "POS_PAYMENT_STATUS"
}