email.bounced
email.bounced fires when delivery fails, hard or soft. A hard bounce writes a suppression, so the next send to that address never leaves.
Delivery failed. Creates a suppression automatically, so the next send to that address never leaves.
Payload
Every field, with an example body, is in the email.bounced reference, generated from the API contract.
Handling it
if (event.type === "email.bounced" && event.data.permanent) {
await markUndeliverable(event.data.recipients, event.data.reason)
}
A permanent bounce means the address is wrong — stop showing it as valid in your own UI. A soft bounce is usually transient and not worth acting on.
The suppression a hard bounce writes goes on the workspace’s * list whatever space_id the event carries — the address exists for nobody, so no space should try it either.