PadiMail Docs
Events

Event reference

Every webhook event type and the fields in its data.

Every delivery body is { type, created_at, data }. Subscribe an endpoint to the types you need; the Node SDK's verifyWebhook returns the event typed by type.

Endpoints in the Resend payload format receive only the events Resend also has (most email.* events, and domain.updated). The account.* events, including the usage alerts, go only to endpoints in the PadiMail format that subscribe to them.

Fields on every email event

Every email.* event has these in data, plus the fields listed under its type.

FieldType
email_idstring
recipient_idstring | null
tostring | null
fromstring
subjectstring | null
tagsobject[]
stream"transactional" | "marketing"

email.queued

We accepted the email and it's waiting its turn to send.

No fields beyond the common ones.

email.scheduled

The email was accepted with a scheduled_at time.

FieldType
scheduled_atstring

email.deferred

The email is waiting for a sending limit to open up. deferred_until is the earliest expected send time.

FieldType
reason"daily_limit" | "monthly_limit" | "no_credits" | "handle_warmup" | "sandbox_limit"
deferred_untilstring | null

email.sent

We handed the email over for delivery. sent_via says whether it went through PadiMail or your connected Gmail.

FieldType
sent_via"padimail" | "gmail_fallback"

email.delivered

The receiving server accepted the email.

FieldType
smtp_responsestring | null

email.delivery_delayed

The receiving server deferred the email. We keep trying until it's delivered or bounces.

FieldType
reasonstring | null
next_attempt_atstring | null

email.bounced

The email couldn't be delivered. A hard bounce also suppresses the address.

FieldType
bounce{ type, sub_type, diagnostic }

email.complained

The recipient marked the email as spam. The address is suppressed.

FieldType
feedback_typestring | null

email.opened

The recipient opened the email (only with open tracking on; approximate because of mail privacy proxies).

FieldType
user_agentstring | null
ip_countrystring | null

email.clicked

The recipient clicked a link (only with click tracking on).

FieldType
urlstring
user_agentstring | null

email.suppressed

We didn't send to this recipient because the address is on your suppression list.

FieldType
reason"bounce" | "complaint" | "unsubscribe" | "manual" | "invalid"

email.held

Content scanning held the email for review.

FieldType
reasonstring

email.released

A held email was approved and is sending.

FieldType
reasonstring

email.rejected

Content scanning or a review blocked the email. reason gives the general category.

FieldType
reasonstring

email.failed

The email couldn't be sent, for example because it waited longer than 30 days.

FieldType
reasonstring

email.canceled

The email was canceled before it was sent.

No fields beyond the common ones.

domain.verified

All the required DNS records for a domain were found.

FieldType
domain_idstring
namestring

domain.failed

A domain's records weren't found within 72 hours, or stopped verifying.

FieldType
domain_idstring
namestring

account.paused

Sending was paused, for example by an automatic brake on bounces or complaints.

FieldType
reasonstring

account.resumed

Sending was resumed.

FieldType
reasonstring

account.quota_reached

A daily, monthly, credit, warm-up or sandbox limit was reached. Sent once per limit window; waiting counts the emails waiting.

FieldType
limit"daily_limit" | "monthly_limit" | "no_credits" | "handle_warmup" | "sandbox_limit"
resets_atstring | null
waitinginteger

account.usage_threshold

80% or 95% of the daily or monthly sending limit is used. Sent once per threshold and window, so you can upgrade or slow down before the limit.

FieldType
alert_idstring
window"daily" | "monthly"
thresholdinteger
usedinteger
limitinteger
resets_atstring

account.usage_spike

Sending in the last hour jumped far above normal (more than 5 times the hourly average of the last 7 days, and at least 200 emails), or bounce or complaint rates went over the warning levels. Sending isn't stopped; check for a bug or a leaked key.

FieldType
alert_idstring
reason"volume" | "bounce_rate" | "complaint_rate"
accepted_last_hourinteger
baseline_per_hournumber | null
delivered_last_hourinteger
bounce_ratenumber | null
complaint_ratenumber | null
top_api_key_idstring | null
Was this page helpful?

On this page