Sendbound
Webhooks

Every email event, delivered to your backend

Real-time POST requests for delivery, opens, clicks, bounces, and complaints — HMAC-signed, retried automatically, and queryable via API.

Event stream
LIVE
email.deliveredjust now
em_8x9kzq3fPOST 200

{ "ms": 847, "provider": "ses", "to": "alex@acme.com" }

email.opened4s ago
em_7a1pxw2n
email.clicked11s ago
em_6b3mky8v
email.bounced38s ago
em_5c2nzq7u
email.complained2m ago
em_4d1mvp6t

Delivery health

All endpoints healthy
Delivery rate99.97%
Median latency<100ms
24h event volume48,291

Endpoint

https://acme.com/api/webhooks

Events subscribed

8 types

Signing secret

••••••••

Deliveries today

4,812

Failure rate

0.03%

HMAC-SHA256 · Signed every request

HMAC-SHA256 signatures

Every payload includes X-Sendbound-Signature. Verify in one line with our SDK or any HMAC library. Replay attacks are rejected automatically.

72-hour retry logic

Failed deliveries retry with exponential backoff: 10s, 5m, 30m, 2h, 8h, and 24h. Full retry history is visible per event.

Granular event filtering

Subscribe to exactly the events you need. Reduce noise, cut processing costs, and keep your endpoint fast and focused.

SECURITY FIRST

Verify every payload in one line

Webhook signing proves a request came from Sendbound and hasn't changed in transit. Every delivery carries an HMAC-SHA256 signature and timestamp — the SDK validates both before your handler sees the event.

Stale timestamps are rejected to prevent replay attacks. Keep your handler small: verify, return 2xx, then queue the work.

SENDBOUND_WEBHOOK_SECRET

Your per-endpoint signing secret

x-sendbound-signature

HMAC-SHA256 of body + timestamp

x-sendbound-timestamp

Rejects requests older than 5 min

webhook.ts

Incoming request

POST/webhooks/sendbound
X-Sendbound-Signature:sha256=a3f9b2c1…
X-Sendbound-Timestamp:1722873600
X-Sendbound-Delivery-Id:dlv_9x8yz7w6
verified in one call
const event = verifyWebhook(req.body, {
  secret:    process.env.WEBHOOK_SECRET,
  signature: req.headers['x-sb-signature'],
  timestamp: req.headers['x-sb-timestamp'],
});
Signature valid·Timestamp fresh·Replay safe47ms

COMPLETE COVERAGE

Every event, every edge case

Subscribe to exactly the signals your system needs. Mix and match per endpoint.

Delivery

18,113

events today

delivery rate

99.6%

Engagement

5,821

events today

open rate

39.7%

Inbound

1,047

events today

routed correctly

100%

System

3

events today

this month

0 errors

RELIABILITY

Never miss an event

Exponential retries protect your integration through outages and deploys — without you writing a single line of retry logic.

Exponential retry schedule

Endpoint recovered at 30m — event delivered successfully

Delivered on retry #3

0s

First attempt

10s

Retry #1

5m

Retry #2

30m

Retry #3

2h

Retry #4

8h

Retry #5

24h

Retry #6

72h

Marked failed

Max retry window

72 hours

Backoff strategy

Exponential

Attempts logged

Every one

<100ms

median delivery latency

99.97%

webhook delivery rate

72 hrs

automatic retry window

10+

event types supported

INTEGRATIONS

Plug into your existing stack

Copy a snippet and you're wired up. Real events, real payloads, zero abstraction.

Salesforce

Salesforce

Log delivery & opens on contact timeline

if (event.type === 'email.opened') {
  await sf.updateContact(event.data.to, {
    Last_Email_Open__c: new Date(),
  });
}
Copy snippet
Segment

Segment

Auto-suppress bounces and complaints

if (event.type === 'email.bounced') {
  await segment.suppress(event.data.to);
  await db.contacts.update({ bounced: true });
}
Copy snippet
Slack

Slack

Alert your team on complaints instantly

if (event.type === 'email.complained') {
  await slack.postMessage('#ops', {
    text: `Complaint: ${event.data.to}`,
  });
}
Copy snippet

HOW WE COMPARE

Signing, retries, filtering, and a portal — all included

Not sold separately. Not a paid add-on.

FeatureSendboundSvixHookdeckPostmark
HMAC-SHA256 signing✓✓✓✓
72-hour auto-retry✓✗✓✓
Granular event filtering✓✓✓Partial
Developer portal✓✓✓✗
Replay any event✓✓✓✗
Per-attempt delivery log✓✓✓✗
SDK verify helper✓✓✗✗
Included in email plan✓✗✗✓

Webhook questions, answered

How do I verify webhook signatures?

Use the SDK helper with your endpoint secret, raw body, signature, and timestamp. It validates the HMAC-SHA256 signature and rejects stale timestamps automatically before your handler runs.

What happens if my endpoint is down?

We retry with exponential backoff: 10s, 5m, 30m, 2h, 8h, 24h — up to 72 hours. Every attempt, response code, and payload is logged and visible in the event dashboard.

Can I replay failed events?

Yes. Replay a single event from its detail page, or batch-replay a filtered date range after fixing an endpoint issue. Replays are signed identically to the original delivery.

How do I subscribe to only what I need?

Choose exact event types per endpoint when you create it. Delivery, engagement, inbound, and system events are independently togglable — zero noise, lower processing cost.

Is there a rate limit?

Events are delivered as they occur. Sendbound queues bursts safely. Your endpoint can return 2xx immediately and process asynchronously with no risk of missing events.

Can I test webhooks locally?

Send a signed test event from the dashboard and tunnel a local port. The test event is indistinguishable from production — same structure, same signature, same headers.