email.onOutbound
The provider accepted a message for sending — the start of every outbound story.
Fires when the provider accepts a message for sending. Record the send under its messageId — every later event for this message (delivered, opened, bounced, …) carries the same one.
hooks: {
email: {
onOutbound: async (event) => {
await prisma.sentEmail.create({
data: {
messageId: event.messageId,
recipient: event.recipient,
subject: event.subject,
status: "sent",
},
});
},
},
},
Payload
emailDriver?string
EmailKit driver id that produced this event, attached by the EmailKit client.
stringschemaVersion?"1"
Schema version for forward-compat
"1"eventId?string
Unique event identifier for dedupe
stringmessageIdstring
Unique message identifier from the email provider
stringproviderId?string
Provider-specific message identifier (in addition to messageId). This is the provider's internal ID for this message, separate from the RFC Message-ID. Useful for provider-specific operations or tracking.
stringrecipientstring
Email address of the recipient (always available)
stringstatus| "sent"
| "delivered"
| "opened"
| "clicked"
| "bounced"
| "complained"
| "rejected"
Event status/type
| "sent"
| "delivered"
| "opened"
| "clicked"
| "bounced"
| "complained"
| "rejected"timestampDate
Timestamp when the event occurred
Datefrom?EmailAddress
Sender email address (available in sent/accepted events)
EmailAddressto?EmailAddress[]
Recipient email addresses (available in sent/accepted events)
EmailAddress[]subject?string
Email subject (available in sent/accepted events)
stringtags?EmailTag[]
Custom metadata/tags associated with the email
EmailTag[]metadata?Record<string, string>
Custom metadata key-value pairs
Record<string, string>campaignId?string
Campaign or tracking identifier
stringrecipientDomain?string
Domain of the recipient (e.g., "gmail.com")
stringserver?string
Receiving server information
stringraw?unknown
Provider-specific raw data (for debugging or advanced use cases)
unknown