Skip to content

Webhooks

Admin, API and webhooks (/admin/integrations). Needs module.integrations.

Register a URL and receive a signed HTTP callback when something happens.

Field
URLWhere to deliver. Must be publicly reachable
EventsWhich event types to receive. Empty means all
EnabledWhether it is active

A signing secret is generated when you create the endpoint. It starts whsec_ and is used to verify that a delivery genuinely came from your deployment.

There is a Test button. Use it before wiring anything up.

Every request is signed with HMAC-SHA256 over the body, using your endpoint’s secret.

Verify the signature on every request. Your endpoint URL will eventually be known to somebody who should not be able to post to it, and the signature is the only thing distinguishing a real delivery from a fabricated one.

Compare using a constant-time comparison, not ==.

The same events that drive the console’s realtime stream:

EventFires when
submission.createdA repair is lodged
submission.statusIts status changes
submission.vendorIt is sent to or updated by a vendor
ticket.createdA ticket is raised
ticket.statusIts status changes
ticket.commentA public reply is added
ticket.mergedTwo tickets are merged
loan.assignedA loan is issued
loan.returnedA loan comes back
loan.registeredA device is added to a pool
loan.removedOne is removed
loan.bulkA bulk action runs
loan.syncedA pool syncs from an MDM
sla.breachA target is missed
monitor.up, monitor.down, monitor.alertMonitor state changes
backup.success, backup.failedA backup completes or fails
kiosk.request, kiosk.resolvedA kiosk assistance request is raised or resolved
security.resolvedA security approval is decided
automation.matchAn automation rule matched

Full list in events.

Return 2xx quickly. Acknowledge and process asynchronously. A receiver that does thirty seconds of work before responding will time out.

Be idempotent. Assume you will occasionally see the same event twice. Key on the event and the record id.

Do not assume order. Two events fired close together can arrive in either order.

Log what you reject. A silently dropped delivery is a debugging session nobody enjoys.

Plugboard blocks outbound requests to private, loopback and link-local addresses by default, so a webhook cannot be pointed at an internal host or a cloud metadata endpoint.

A self-hosted install that legitimately delivers to a LAN address needs:

Terminal window
ALLOW_PRIVATE_EGRESS=1

Leave that off for anything multi-tenant. See the security model.

Notify a chat channel. Post submission.created into a staff channel so the desk sees kiosk bookings without watching the queue.

Feed an asset register. React to loan.assigned and loan.returned to keep a finance system current.

Escalate breaches. sla.breach into whatever your school uses for escalation.

Trigger your own automation. Anything the built-in automation rules cannot express, because they only run on creation and only do three things.

For a browser client, use the server-sent event stream instead. Same events, no signature verification needed, because it runs inside an authenticated session.

Delete the endpoint. Deliveries stop immediately.

Registering, testing and deleting are all recorded in the audit log.