Skip to content

Email Events

Connect records an event each time something happens to an email. You can have events sent to your server as webhooks, or see them in an email’s timeline.

TypeWhen
email.queuedThe email was accepted, or scheduled
email.sentThe email was handed to the recipient’s email server
email.deliveredThe recipient’s email server accepted the email
email.bouncedThe email bounced. reason.category is hard_bounce or soft_bounce
email.complainedThe recipient marked the email as spam
email.failedThe email could not be sent or delivered. reason says why
email.openedThe email was opened for the first time (email sent with trackOpens only)
email.cancelledA scheduled email was cancelled
suppression.createdAn address was added to your suppression list, for example after a hard bounce, a complaint or an unsubscribe

A soft bounce can be followed by email.delivered if the recipient’s server accepts the email later.

Every webhook is a POST with a JSON body. data is the email object as it was when the event happened:

{
"id": "358120561368793088",
"type": "email.delivered",
"occurredAt": "2026-10-10T09:30:03Z",
"apiVersion": "2026-10-01",
"workspaceId": "301245883010879488",
"data": {
"id": "358120554712436736",
"kind": "transactional",
"sender": "hello@yourcompany.com",
"recipient": "sam@example.com",
"subject": "Your order has shipped",
"content": { "html": null, "text": "Hi Sam, your order is on its way." },
"status": "delivered",
"reason": null,
"clientReference": "order-991",
"clientTag": null,
"openCount": 0,
"createdAt": "2026-10-10T09:30:00Z",
"scheduledAt": null,
"sentAt": "2026-10-10T09:30:01Z",
"deliveredAt": "2026-10-10T09:30:03Z",
"openedAt": null,
"updatedAt": "2026-10-10T09:30:03Z"
}
}

For suppression.created, data is the suppression, with email and scope set.

Each delivery has a Webhook-Id header that stays the same if we retry it. Use it to ignore a webhook you have already handled. Reply with any 2xx status to tell us you received it. Otherwise we retry.

Every webhook is signed. See Verifying webhooks.

Create a webhook with the email events you want:

{
"url": "https://yourcompany.com/webhooks/connect",
"events": ["email.delivered", "email.bounced", "email.complained", "email.failed"]
}

The response includes the webhook’s id and its secret, which you use to verify webhooks.

API reference: POST /v2/webhooks