Skip to main content
Webhooks allow you to register a destination URL and receive HTTP POST requests when key events (like invoice creations or stock adjustments) happen in real-time.

Webhook Architecture & Event Delivery Flow

The diagram below shows how events generated in the POS backend are queued in background workers, delivered to your server, and verified via HMAC signatures.

Registering a Webhook

When creating an API integration (see API Key Management), you can optionally provide webhook configuration fields:
[!IMPORTANT] You do not set the webhook secret yourself. When you provide a webhookUrl, the server automatically generates a strong webhookSecret (prefixed veda_whs_) and returns it only once in the creation response. Copy it immediately and store it securely on your server — it cannot be retrieved again.

Example Request

Example Response

Copy webhookSecret and store it securely on your server as an environment variable (e.g. WEBHOOK_SECRET). You will use it to verify every incoming webhook request.

Supported Events

Choosing Which Events to Receive

The webhookEvents field is a subscription filter — it controls which of the above events are delivered to your endpoint. You can subscribe to any combination of the supported events by passing them as a comma-separated string. To receive everything, simply omit the webhookEvents field when creating the integration.

Webhook Request

All webhooks are delivered as an HTTP POST request to your webhookUrl with the following headers and a JSON body.

Request Headers

Body Structure


How the Webhook Secret Works

The webhookSecret is the shared key between the POS system and your server. Here is the full lifecycle: Step 1 — Secret is generated When you register a webhookUrl, the POS system generates a unique webhookSecret and returns it in the API response. You store this value on your server (e.g. as an environment variable). Step 2 — POS signs the outgoing webhook Every time the POS system dispatches a webhook to your webhookUrl, it computes a signature:
This signature is attached to the request as the x-pos-signature header.
[!NOTE] The signature is computed over the payload object only — not the entire request body.
Step 3 — Your server verifies the signature When your server receives the webhook, it recomputes the same signature using the stored webhookSecret and compares it against the x-pos-signature header. If they match, the request is authentic. If they don’t match, reject it.

Signature Verification Examples

Node.js (Express)

Python (Flask)


Retry Policy & Failure Handling

When an outgoing webhook attempt fails, the system executes an automated retry flow illustrated below:

Delivery Expectations & Errors

Webhook Error Handling Examples

1. Signature Verification Failure on Client Server (401 Unauthorized)

If your webhook listener rejects a request due to signature mismatch, return HTTP 401:

2. Temporary Server Busy / Down (503 Service Unavailable)

If your server is undergoing maintenance, return 503 Service Unavailable. The POS system will register the delivery failure and retry automatically via exponential backoff.
Last modified on July 27, 2026