Skip to main content
Webhooks push campaign events to your endpoint as they happen — no polling.

Supported events

campaign_sent · campaign_opened · campaign_clicked · unsubscribe · campaign_error · spam · hard_bounce

Create a webhook

Your endpoint should return a 2xx status quickly; do any heavy processing asynchronously.

Test it

Fire a sample payload at your endpoint before going live with Test webhook, and pause/resume delivery any time with Toggle webhook status.

Typical uses

  • Sync unsubscribes and hard bounces back to your CRM so you stop emailing dead addresses everywhere
  • Trigger in-app flows when a customer opens or clicks a campaign
  • Alert your team on campaign_error events

Transactional webhooks

Transactional sends — through the Email API or SMTP relay — have their own webhooks, configured in the dashboard under Transactional → Settings → Webhooks (not the campaign API above). Subscribe to any of these events: Sent, Delivery, Open, Bounce, Spam, Unsubscribe, Reject. Each event is an HTTP POST with a JSON body:
Open adds browser, device, os, userAgent and a geo object; Bounce, Spam and Reject add a description with the reason.

Your custom data on every event

Any passthrough key you attach to a send — metadata.custom on the Email API, or X-MC-Custom-* headers over SMTP relay — is returned on every event for that message, inside a custom object (values as strings):
Keys that break a limit (max 10 keys, key name ≤ 50 chars, value ≤ 256 chars) are dropped and named in a custom_dropped array — the send always succeeds. When no custom data was sent, neither field appears.

Payload signing

Turn on Payload signing when creating the webhook and every request carries a Webhook-Signature (HMAC-SHA256 of the body, keyed by your secret) and a Webhook-Timestamp. Recompute the HMAC and compare it in constant time, and reject stale timestamps to prevent replay. With signing off, the payload is byte-identical and no signature headers are added.
For the full field reference per event, the custom-data limits, and signature-verification code, see the Transactional webhooks help guide.