Webhook Event Types & Schemas
Emalc supports 18 granular webhook event types divided into 4 core functional categories.
Standard Event Envelope Schema#
All webhook notifications deliver a JSON payload containing an event identifier, an ISO 8601 UTC created_at timestamp, and an event-specific data object:
json
{
"event": "email.delivered",
"created_at": "2026-09-28T14:59:03.000Z",
"data": {
"recipient": "customer@example.com",
"subject": "Your Order Confirmation (#1042)",
"messageId": "0100018df5608034-7546e5fa-4965-4f46-99c0-9943630f55cf-000000",
"emailId": "7132fa69-9064-44d4-9d41-4560ea605dfa",
"tags": {
"category": "receipt",
"order_id": "1042"
}
}
}1. Email Lifecycle & Telemetry Events#
| Event Type | Trigger Description | Payload Attributes |
|---|---|---|
email.sent | Email accepted and queued for transmission via Amazon SES gateways. | recipient, subject, emailId, messageId, tags |
email.delivered | Recipient mail server acknowledged successful SMTP delivery. | recipient, subject, emailId, messageId, tags |
email.soft_bounce | Temporary delivery issue (e.g. recipient mailbox full, temporary server downtime). | recipient, subject, emailId, reason, smtpCode |
email.bounced | Hard bounce or permanent non-delivery failure (SMTP 550 unknown user). | recipient, subject, emailId, reason, bounceType |
email.complained | Recipient marked email as spam / abuse complaint. | recipient, subject, emailId, complaintFeedbackType |
email.opened | Recipient opened email and rendered 1x1 tracking pixel. | recipient, subject, emailId, userAgent, ipAddress |
email.clicked | Recipient clicked a rewritten link inside the email body. | recipient, subject, emailId, targetUrl, ipAddress |
email.unsubscribed | Recipient clicked the standard one-click unsubscribe link. | recipient, emailId, campaignId |
email.suppressed | Email dispatch rejected because recipient is on organization suppression list. | recipient, subject, reason |
email.failed | Internal delivery worker error or SES transmission failure. | recipient, subject, reason |
Sample Payload: Hard Bounce (email.bounced)#
json
{
"event": "email.bounced",
"created_at": "2026-09-28T15:02:11.000Z",
"data": {
"recipient": "bounce@simulator.amazonses.com",
"subject": "Weekly Newsletter",
"emailId": "8294ba12-1094-4b11-a832-1109aef8821a",
"reason": "Hard bounce: 550 5.1.1 Unknown User",
"bounceType": "Permanent"
}
}2. Audience & Contact Events#
| Event Type | Trigger Description | Payload Attributes |
|---|---|---|
contact.created | A new contact record was added to your audience via UI or API. | contactId, email, firstName, lastName, status |
contact.updated | Contact attributes, metadata, or group assignments modified. | contactId, email, updatedFields |
contact.deleted | Contact record removed from organization audience. | contactId, email |
Sample Payload: Contact Created (contact.created)#
json
{
"event": "contact.created",
"created_at": "2026-09-28T15:10:00.000Z",
"data": {
"contactId": "cnt_99214a12",
"email": "sarah.connor@example.com",
"firstName": "Sarah",
"lastName": "Connor",
"status": "subscribed"
}
}3. Domain Authentication Events#
| Event Type | Trigger Description | Payload Attributes |
|---|---|---|
domain.created | New custom sender domain registered in dashboard. | domainId, domainName, status |
domain.updated | Domain verification status changed (e.g., pending -> verified). | domainId, domainName, status, dkimStatus, spfStatus |
domain.deleted | Custom sender domain removed from organization. | domainId, domainName |
Sample Payload: Domain Verified (domain.updated)#
json
{
"event": "domain.updated",
"created_at": "2026-09-28T15:15:30.000Z",
"data": {
"domainId": "dom_88123fa",
"domainName": "acme.com",
"status": "verified",
"dkimStatus": "success",
"spfStatus": "success"
}
}4. Suppression List Events#
| Event Type | Trigger Description | Payload Attributes |
|---|---|---|
suppression.added | Email address added to organization suppression list due to bounce, complaint, or manual block. | email, reason, source |
suppression.removed | Email address removed from suppression list by workspace admin. | email, removedBy |
Sample Payload: Suppression Added (suppression.added)#
json
{
"event": "suppression.added",
"created_at": "2026-09-28T15:20:00.000Z",
"data": {
"email": "bounced.user@example.com",
"reason": "Hard bounce",
"source": "ses_bounce_webhook"
}
}