Email SDK
Concepts

Hooks

Observe sends without changing adapter code.

Hooks are for logs, metrics, tracing, and retry visibility.

const email = createEmailClient({
  adapters: [resend({ apiKey: process.env.RESEND_API_KEY! })],
  hooks: {
    beforeSend(event) {
      console.log("email.send", event.provider, event.message.subject);
    },
    afterSend(event) {
      console.log("email.sent", event.response.id);
    },
    onRetry(event) {
      console.warn("email.retry", event.provider, event.nextAttempt);
    },
    onError(event) {
      console.error("email.error", event.provider, event.error);
    },
  },
});

Hook events

Each hook receives:

FieldNotes
providerRouting name used for this attempt.
messageThe original EmailMessage.
attemptCurrent attempt number.
metadataOptional metadata passed to send.

afterSend also receives response. onRetry receives nextAttempt and delayMs. onError receives error.

Keep logs safe

Do not log API keys, SMTP passwords, raw tokens, full message bodies, or unnecessary recipient data. For most production logs, routing name, status, subject category, template name, and message ID are enough.

On this page