Supported events
campaign_sent · campaign_opened · campaign_clicked · unsubscribe · campaign_error · spam · hard_bounce
Create a webhook
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_errorevents
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):
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 aWebhook-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.