Skip to main content

Webhooks

Webhooks let an external system receive real-time notifications when something happens in ProcureSwift — for example, when a purchase order is created, when an invoice status changes, or when a quotation is received. Instead of polling the API, the external system registers a URL and ProcureSwift posts a JSON payload to that URL each time a subscribed event occurs.

Where to find it​

In the main menu, open Webhooks (/webhooks). The page requires the Webhooks / View permission.

Available events​

A subscription can listen to one or more of the following events:

  • purchase_order.created
  • purchase_order.status_changed
  • invoice.created
  • invoice.status_changed
  • rfq.published
  • rfp.published
  • delivery_note.created
  • quotation.received
  • proposal.received

Creating a webhook subscription​

  1. Click Add Webhook.
  2. Fill in the form:
    • Webhook URL — a publicly reachable HTTPS endpoint that will receive the event payloads. Required.
    • Events — tick at least one event to subscribe to. The webhook is only triggered for the ticked events.
  3. Click Create.
One-time secret display

Immediately after creation, the webhook signing secret is shown once in a confirmation dialog. Copy it now and store it securely on the receiving system — the platform will never show it again. The secret is needed to verify that incoming requests genuinely originated from ProcureSwift (see Signature verification below).

Managing subscriptions​

The Subscriptions table on /webhooks shows: URL, Events, Status, Last Triggered, consecutive Failures, Created.

Per-row actions:

  • Status toggle — flip the switch to activate or deactivate a subscription without deleting it. Deactivated webhooks stop receiving events but their configuration is preserved.
  • Edit (pencil icon) — change the URL or the list of subscribed events.
  • Delete (trash icon) — permanently remove the subscription.

The Failures column counts consecutive failed delivery attempts. A non-zero value means the receiving endpoint is rejecting requests or is unreachable. Long failure streaks may cause the platform to back off or disable the webhook automatically.

Signature verification (HMAC)​

Every webhook request includes a signature header computed from the request body using the subscription's signing secret. The receiving system must verify this signature before trusting the payload — without it, anyone who can guess the URL could post fake events.

The basic verification flow on the receiver:

  1. Read the raw request body.
  2. Compute HMAC-SHA256(secret, body).
  3. Compare the result, in constant time, to the signature header on the request.
  4. Reject the request if they do not match.

Store the secret in the receiver's environment configuration — never in source control.

Retries​

If the receiving endpoint returns a non-2xx status code or times out, the platform retries the delivery on a backoff schedule. The Last Triggered column shows the most recent attempt (successful or not) and Failures shows how many consecutive attempts have failed since the last success. A successful delivery resets the failure counter to zero.

Rotating the secret​

The signing secret is generated when the webhook is created and shown once. To rotate it, delete the subscription and create a new one (which produces a new secret), then update the secret on the receiving system. Coordinate the change so that the receiving system trusts the new secret before the old subscription is removed.

Tips​

  • Use Edit to add new event types to an existing subscription instead of creating a parallel webhook for each event.
  • Make the receiver idempotent — the platform may retry, so the same event could arrive more than once. Use the event ID in the payload to deduplicate.
  • Respond with 200 OK as soon as the payload is persisted, and process it asynchronously. Long-running handlers can cause retries.
  • Monitor the Failures column or alert when it goes non-zero.

Permissions​

ActionRequired permission
View subscriptionsWebhooks / View
Add a webhookWebhooks / Create
Edit a webhook, toggle activeWebhooks / Update
Delete a webhookWebhooks / Delete