Webhooks
Webhooks
One signed JSON POST per event: sent, replied, clicked, bounced, unsubscribed. Payload shape, headers, retries and what to do on your side.
Updated 4 September 2026
Seegnals tells your systems what happened by POSTing a signed JSON event to a URL you control. Use it to push replies into a CRM that has no native connector, to mirror bounces into your own data, or to trigger a Zap.
Setting it up
- Settings → Integrations → Webhooks. Paste an
https://URL and press Save URL. - Copy the signing secret (
whsec_…). It is shown once now and can be revealed again from the same tab. - Press Send test event. Your endpoint receives a
type: "test"payload; the tab shows the HTTP status it answered with.
The URL must be public and https://. Local hosts, private IP ranges, credentials in the URL and hosts that resolve to private addresses are rejected when you save and again before every delivery.
Events
type |
Sent when | metadata |
|---|---|---|
sent |
A step of a sequence was sent to a prospect | { "step": 2, "messageId": "<Message-ID header>" } |
replied |
A reply from the prospect arrived in a connected mailbox | { "replyId": "<uuid>", "from": "<sender address>" } |
clicked |
The prospect clicked a tracked link (needs a verified tracking domain) | { "url": "<target url>", "messageId": "<Message-ID>", "via": "redirect" } |
bounced |
The mailbox reported a bounce for the message | { "error": "<SMTP error text>", "step": 1 } |
unsubscribed |
The prospect used the one-click unsubscribe | { "via": "one-click" } |
test |
You pressed Send test event | { "note": "Test event sent from Seegnals settings." } |
opened is deliberately not sent. Apple Mail Privacy Protection and similar clients fetch the tracking pixel whether or not a person read the message, so an open is not a signal your automation should act on. It appears in the app per campaign, labelled as an upper bound.
The request
POST https://hooks.example.com/seegnals
Content-Type: application/json
User-Agent: Seegnals-Webhook/1
X-Seegnals-Event: replied
X-Seegnals-Delivery: 5d2f1c8a-3b4e-4f60-9a71-2c8e7d9f0b13
X-Seegnals-Signature: t=1767225600,v1=3f6a…c9e1
{"id":"10000000-0000-0000-0000-000000000002","type":"replied","occurred_at":"2026-08-23T09:00:00Z","workspace_id":"00000000-0000-0000-0000-000000000001","prospect_id":"00000000-0000-0000-0000-000000000002","prospect_email":"jane@example.com","campaign_id":"00000000-0000-0000-0000-000000000003","campaign_name":"Q3 outbound","metadata":{"replyId":"20000000-0000-0000-0000-000000000001","from":"jane@example.com"}}
Payload fields
| Key | Type | Notes |
|---|---|---|
id |
uuid | The event id. For positive_reply subscriptions, the reply id. |
type |
string | Event type as above. |
occurred_at |
string | UTC, second precision, YYYY-MM-DDTHH:MM:SSZ. |
workspace_id |
uuid | Your workspace. |
prospect_id |
uuid or null | null only in the test event. |
prospect_email |
string or null | Looked up at event time; null if the prospect was deleted. |
campaign_id |
uuid or null | null for events outside a campaign and for the test event. |
campaign_name |
string or null | |
metadata |
object | Per type, see the table above. |
The body is compact JSON without whitespace and the key order is not guaranteed (it is the database’s JSONB order). Verify the signature over the raw bytes you received, never over a re-serialised object. See Verifying signatures.
Delivery, retries, timeouts
- Your endpoint has 10 seconds to answer. Any
2xxcounts as delivered. The response body is never read. - Redirects are not followed. A
3xxis a failure; point the webhook at the final URL. - Failed attempts are retried by a worker that scans every minute: 3 attempts in total, roughly a minute apart. After the third failure the delivery is marked
failedand stays in the log with the status or error. - The first attempt of a new event also waits for the next scan, so expect a delivery within about a minute of the event. The test event is the exception: it is sent immediately.
- A dead endpoint does not disable the webhook. New events keep creating deliveries, each with its own three attempts. Nobody is emailed about failures; watch Recent deliveries in the Webhooks tab (last 10) or Settings → Integrations → History.
- The payload and the URL are snapshotted when the event happens. Changing the URL later does not redirect deliveries already queued.
Duplicates and ordering
X-Seegnals-Delivery is stable across retries of the same delivery; the timestamp and signature change with each attempt. Use the delivery id to deduplicate. Deliveries are independent, so a retried old event can arrive after a newer one; order by occurred_at if it matters.
Zapier
If your receiver is Zapier, use Webhooks by Zapier → Catch Hook as the trigger and filter on type. The full walk-through, including the action side (adding prospects from a Zap), is in Zapier.