Webhooks (Outbound)
Webhooks let SalesOS call your system when something happens (a lead is offered, a ranking is published, a message is dispatched). You give us an HTTPS URL and a secret; wePOST a signed JSON
payload to it whenever a subscribed event fires.
This page covers outbound webhooks (SalesOS → your endpoint). For sending data into SalesOS,
see Activities and API Keys.
Configure a webhook in the Dashboard
Go to Integrations → Webhooks → New Webhook and fill in the form.1
Basic
- Name (required) — e.g.
Notify CRM. - Key — a stable identifier (e.g.
notify_crm). - Description — optional.
2
Events (triggers)
Pick a Category, then select the events that fire this webhook — this is your
subscription (see the catalog). Leave it empty for a webhook you only
trigger manually (the Test button) or from a workflow.
3
Destination
- Method —
POST(default),PUTorPATCH. - Timeout (seconds) — how long we wait for your
2xx(default 30). - URL (required) — your endpoint. Must be
https://and public (internal/loopback hosts are blocked). - Authentication — choose HMAC to sign every delivery, then in Auth Config (JSON) set your secret:
(Other schemes are available: Bearer, API Key, Basic, OAuth2.)
4
Advanced
- Custom Headers (JSON) — extra headers sent with every delivery.
- Payload Template (JSON with
{{ }}variables) — shapes the envelopedatafrom the event context, e.g.{ "id": "{{event.id}}", "type": "{{event.type}}", "to": "{{event.to}}" }.
5
Preview, test & save
The form shows a live Preview (headers + body). Click Save webhook, then use Test Webhook
to send a sample delivery and confirm your endpoint receives — and verifies — it.
The envelope
On the event path, every delivery is a single JSON object:Headers
Verify the signature
On the event path, the signature covers{id}.{timestamp}.{rawBody} (Standard-Webhooks style),
so it authenticates the payload and the timestamp (anti-replay). Recompute the HMAC with your
secret, compare in constant time, and reject if the timestamp is more than 300s off.
Test deliveries (the “Test Webhook” button) and legacy workflow triggers currently use a simpler
scheme: the body is the raw rendered template (not the envelope) and the signature header is
X-Signature: <prefix><hmac(body)> — without the id.timestamp. prefix, so it has no
anti-replay. Prefer the event path above for production.Event catalog
Check-in: the three moments a queue changes
Eligibility changes at exactly three moments, and each has its own event. If you route leads by who is on duty, subscribe to all three — taking only the first leaves people enabled forever.A check-in that does not make someone eligible never reaches you. Delivering it would tell you to enable somebody who cannot receive leads.
user block — the identity of whoever entered or left the queue, resolved on our side so you can recognize the person without any prior identity agreement. Example data for checkin.confirmed:
user.cpf may be null — not every collaborator has a document on file; fall back to user.email. Fields that do not exist at the moment of the event (e.g. shift on a clock-out) arrive as null, never dropped from the schema.data for ranking.weekly.published:
Reliability
Respond fast. Return a2xx status quickly (before heavy processing) to acknowledge receipt.
Idempotency. The same event may be delivered more than once (retries). Deduplicate on
X-SalesOS-Event-Id — it stays the same across retries.

