Webhook Events Reference
Common Payload Structure
All webhook event payloads share this base structure:
{
"type": "EventType",
"createdAt": "2026-04-02T10:00:00Z",
"messageId": "unique-run-id",
"recipient": "user@example.com",
"senderDomain": {
"domain": "mail.yourdomain.com",
"id": "sender-domain-id"
},
"sendIntegration": {
"name": "My SendGrid",
"id": "send-integration-id"
},
"esp": "SendGrid",
"source": "ScheduledEmail",
"sourceId": "source-id",
"emailContent": {
"name": "April Newsletter",
"id": "email-content-id",
"template": {
"name": "Newsletter Template",
"id": "template-id"
},
"fromName": {
"name": "Company Name",
"id": "from-name-id"
},
"subjectLine": {
"name": "Check out our latest news",
"id": "subject-line-id"
}
}
}
Common Fields
| Field | Type | Description |
|---|---|---|
type |
string | The event type (Paused, Canceled, Failed, Submitted, Initiated, Retry, Sent, SoftBounced, HardBounced, Complained, Suppressed, Unsubscribed, Opened, Clicked) |
createdAt |
string | ISO 8601 timestamp of the event |
messageId |
string | Unique identifier for the email run |
recipient |
string | Recipient email address |
senderDomain.domain |
string | Sender domain used |
senderDomain.id |
string | Sender domain ID |
sendIntegration.name |
string | Name of the Send Integration |
sendIntegration.id |
string | Send Integration ID |
esp |
string | ESP that processed the email |
source |
string | Source type (e.g., ScheduledEmail, TriggeredSequence) |
sourceId |
string | Source identifier |
emailContent.name |
string | Email Content name |
emailContent.id |
string | Email Content ID |
emailContent.template.name |
string | Template name |
emailContent.template.id |
string | Template ID |
emailContent.fromName.name |
string | From Name value |
emailContent.subjectLine.name |
string | Subject line text |
Event Types
Initiated
Email has been queued for sending.
- Additional fields: none
Submitted
Email has been submitted to the ESP for delivery.
- Additional fields: none
Sent
ESP confirmed the email was delivered to the recipient's mail server.
- Additional fields: none
Paused
Send has been paused (manually or by system).
- Additional fields: none
Canceled
Send has been canceled.
- Additional fields: none
Retry
Email is being retried after a temporary failure.
- Additional fields: none
Failed
Send attempt failed permanently.
- Additional fields:
| Field | Type | Description |
|---|---|---|
error.reason |
string | Error message explaining why the send failed |
{
"type": "Failed",
"error": {
"reason": "Authentication failed: invalid API key"
}
}
SoftBounced
Temporary delivery failure (4xx class). May be retried.
- Additional fields:
| Field | Type | Description |
|---|---|---|
bounce.type |
string | Always "soft" |
bounce.message |
string | Bounce message from the receiving server |
{
"type": "SoftBounced",
"bounce": {
"type": "soft",
"message": "452 Insufficient storage"
}
}
HardBounced
Permanent delivery failure (5xx class). Address should be suppressed.
- Additional fields:
| Field | Type | Description |
|---|---|---|
bounce.type |
string | Always "hard" |
bounce.message |
string | Bounce message from the receiving server |
{
"type": "HardBounced",
"bounce": {
"type": "hard",
"message": "550 Mailbox not found"
}
}
Complained
Recipient marked the email as spam.
- Additional fields: none
Suppressed
Email was blocked because the recipient is on a suppression list.
- Additional fields: none
Unsubscribed
Recipient clicked the unsubscribe link.
- Additional fields:
| Field | Type | Description |
|---|---|---|
unsubscribe.reason |
string | Reason for unsubscribing (if provided) |
{
"type": "Unsubscribed",
"unsubscribe": {
"reason": "No longer interested"
}
}
Opened
Recipient opened the email.
- Additional fields:
| Field | Type | Description |
|---|---|---|
client.ipAddress |
string | IP address of the recipient |
client.userAgent |
string | User agent string of the email client |
{
"type": "Opened",
"client": {
"ipAddress": "203.0.113.42",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)"
}
}
Clicked
Recipient clicked a link in the email.
- Additional fields:
| Field | Type | Description |
|---|---|---|
client.ipAddress |
string | IP address of the recipient |
client.link |
string | URL that was clicked |
client.userAgent |
string | User agent string of the email client |
{
"type": "Clicked",
"client": {
"ipAddress": "203.0.113.42",
"link": "https://example.com/offer",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)"
}
}
Event Summary Table
| ID | Event Type | Description | Extra Fields |
|---|---|---|---|
| 1 | Paused | Send paused | — |
| 2 | Canceled | Send canceled | — |
| 3 | Failed | Send failed | error.reason |
| 4 | Submitted | Submitted to ESP | — |
| 5 | Initiated | Queued for sending | — |
| 6 | Retry | Retrying after failure | — |
| 7 | Sent | ESP confirmed delivery | — |
| 8 | SoftBounced | Temporary failure (4xx) | bounce.type, bounce.message |
| 9 | HardBounced | Permanent failure (5xx) | bounce.type, bounce.message |
| 10 | Complained | Marked as spam | — |
| 11 | Suppressed | Blocked by suppression list | — |
| 12 | Unsubscribed | Clicked unsubscribe | unsubscribe.reason |
| 13 | Opened | Opened the email | client.ipAddress, client.userAgent |
| 14 | Clicked | Clicked a link | client.ipAddress, client.link, client.userAgent |