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
Example
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.

