Skip to main content

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; we POST 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

  • MethodPOST (default), PUT or PATCH.
  • 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 envelope data from the event context, e.g. { "id": "{{event.id}}", "type": "{{event.type}}", "to": "{{event.to}}" }.
Template values are interpolated into JSON. Use flat, scalar fields. Injecting a nested object via "{{event.data}}" may not render cleanly today — always check the Preview / send a Test first.
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

Always verify the signature before trusting a delivery. Without it, anyone who learns your URL could forge events.
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:
Recipients are keyed by email — names and ids are not sent; enrich on your side if needed.

Reliability

Respond fast. Return a 2xx 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.
Failed deliveries land in the Deliveries panel (Dashboard → Integrations → Webhooks) where you can inspect status, attempts and the last error, and resend from the dead-letter queue.