SendGrid / Twilio Email Event Types

All SendGrid email event types with field names and webhook payload schema.

A searchable reference for SendGrid (Twilio) Event Webhook event types — processed, delivered, open, click, bounce, dropped, spamreport, unsubscribe and group events — each with category, key payload fields and meaning. Runs in your browser.

What is the difference between a bounce and a dropped event in SendGrid?

A bounce means the receiving server accepted then rejected the message, or rejected it during the SMTP conversation — the email reached a mail server. A dropped event means SendGrid never attempted delivery, usually because the address is on a suppression list (previous bounce, spam report, unsubscribe, or invalid).

This is a searchable reference for SendGrid (Twilio) Event Webhook event types — every event value SendGrid POSTs to your endpoint, grouped into delivery, engagement, and account categories. Each entry lists the key JSON fields the event carries and what it means, so you can build a reliable handler that updates send status, suppresses bad addresses, and records engagement.

How it works

SendGrid POSTs an array of JSON objects to your configured webhook URL. Every object shares common fields and adds event-specific ones:

{
  "email": "[email protected]",
  "timestamp": 1717689600,
  "event": "bounce",
  "sg_event_id": "abc123",
  "sg_message_id": "msg.0001",
  "reason": "550 5.1.1 user unknown",
  "type": "bounce"
}

Events fall into three categories. Delivery events (processed, deferred, delivered, bounce, dropped) track the lifecycle from acceptance into SendGrid through to the receiving server. Engagement events (open, click, spamreport, unsubscribe, group_unsubscribe, group_resubscribe) track what the recipient did. The bounce event’s type field (bounce vs blocked) and the reason field tell you whether the failure was hard (permanent) or soft (temporary).

Tips and example

Idempotency matters: SendGrid may deliver the same event more than once, so dedupe on sg_event_id before applying state changes. Drive suppression off permanent-failure and complaint events:

processed  → queued, handed to the receiving MTA
delivered  → accepted by the recipient server (success)
deferred   → temporary 4xx, will retry (not a failure)
bounce     → rejected; check type=bounce (hard) vs blocked (soft)
dropped    → never sent (on a suppression list)
spamreport → recipient hit "mark as spam" — suppress immediately

Treat open and click as engagement signals only — they can be inflated by image proxies and link scanners, so never gate critical logic on a single open event. Everything runs in your browser; nothing is uploaded.