email.bounced
Delivery failed. Creates a suppression automatically.
Delivery failed. Creates a suppression automatically, so the next send to that address never leaves.
Payload
email_idstring
eml_…
stringthread_idstring
The conversation.
stringdomain_idstring | null
The domain it was sent from, or null when sent through a mailbox.
string | nullmailbox_idstring | null
The mailbox it was sent through, or null when sent from a domain.
string | nullsuppression_keystring | null
The list the send named, when it named one.
string | nullrecipientsstring[]
Which recipients bounced.
string[]permanentboolean
true for a hard bounce — the address doesn't exist. false for a soft one — full mailbox, temporary failure.
booleanreasonstring
What the receiving server said.
stringHandling 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.