Receive transactional email delivery callbacks
Configure statusCallback and eventCallback webhooks on HTTP send.
Receive transactional email delivery callbacks
Configure webhooks on HTTP send so Routee POSTs delivery and engagement updates to your server instead of polling the tracking API.
Prerequisite: Send your first transactional email. Callbacks are configured on
POST /transactional-emailonly (not SMTP).
1. Status callback (delivery updates)
Add callback.statusCallback to your send body:
{
"from": { "address": "[email protected]" },
"to": [{ "address": "[email protected]" }],
"subject": "Order shipped",
"content": { "html": "<p>Your order is on the way.</p>" },
"callback": {
"statusCallback": {
"strategy": "OnChange",
"url": "https://partner.example/webhooks/email-status"
}
}
}strategy | Behaviour |
|---|---|
| OnChange | POST on every status transition |
| OnCompletion | POST when delivery reaches a final state |
2. Event callback (opens & clicks)
{
"callback": {
"eventCallback": {
"onOpen": "https://partner.example/webhooks/email-open",
"onClick": "https://partner.example/webhooks/email-click"
}
}
}Use together with statusCallback when you need both delivery and engagement notifications.
Routee POSTs once per open and once per click (including repeats). Engagement webhook results[] is always present and contains only the latest entry — drive handlers from top-level status / updatedAt (and click only when status is CLICKED). Full field tables: Email callback payloads.
3. Handle incoming POSTs
Your endpoint must:
- Accept
POSTwithContent-Type: application/json - Return HTTP 200 within 2 seconds
- Ignore unknown JSON fields (forward compatibility)
- Parse the JSON object payload — see Email callback payloads
- Key engagement handling off top-level
status(not the presence of aclickobject or the length ofresults[])
Routee retries failed deliveries per platform policy (same as Viber callbacks — up to 12 retries over 24 hours).
Firewall
Whitelist inbound traffic from callbacksallow.routee.net.
4. Correlate with trackingId
The send response includes trackingId. Store it when you send — use it to match callback payloads and to call Get email tracking (single message timeline) if you need full SMTP diagnostics.
5. When to poll instead
| Use callbacks | Use polling |
|---|---|
| Production backends with a public HTTPS URL | Local development without a tunnel |
| Real-time dashboards | Low-volume or batch reconciliation |
| Engagement (open/click) events | SMTP-only sends |
Full reference
- Email callback payloads — JSON field reference and examples
- Email tracking, statuses & callbacks — lifecycle statuses, timeline fields, search filters
Related
- Send a transactional email
- Track Links & Opens Explained — skip click rewriting or the open pixel (independent of webhooks)
Updated 3 days ago

