DocumentationWebhook event catalog
Webhook event catalog
Payload reference for email.* and contact.unsubscribed events.
Reference for outbound webhook event types. Register endpoints in Webhooks overview.
Event types
| Event | When it fires |
|---|---|
email.sent | Message accepted and handed to the transport queue |
email.delivered | Provider confirms delivery to recipient MX |
email.opened | Tracking pixel loaded (if enabled) |
email.clicked | Tracked link clicked |
email.bounced | Hard or soft bounce from provider |
email.complained | Spam complaint (FBL) |
email.failed | Send failed before or during delivery |
contact.unsubscribed | Recipient used hosted unsubscribe or API unsubscribe |
Envelope shape
Each delivery is a signed POST to your URL:
X-MailingCore-Signature: t=1719763200,v1=abc123...
Content-Type: application/json
{
"id": "evt_...",
"type": "email.delivered",
"createdAt": "2026-06-30T12:00:00.000Z",
"tenantId": "clxtenant...",
"data": { }
}
Verify with HMAC signature before trusting data.
email.* data (common fields)
{
"emailLogId": "clxlog...",
"to": "[email protected]",
"subject": "Welcome",
"status": "DELIVERED",
"tags": ["welcome"],
"metadata": { "userId": "123" },
"templateVersionId": "clxversion...",
"occurredAt": "2026-06-30T12:00:01.000Z"
}
Event-specific additions:
| Event | Extra fields |
|---|---|
email.bounced | bounceType (hard / soft), diagnostic |
email.complained | complaintFeedbackType |
email.opened | userAgent, ip (if collected) |
email.clicked | linkUrl, linkId |
contact.unsubscribed data
{
"contactId": "clxcontact...",
"externalId": "user-12345",
"email": "[email protected]",
"unsubscribedAt": "2026-06-30T12:00:00.000Z",
"source": "hosted_page"
}
Use this to sync unsubscribes back to your CRM and stop future campaigns.
Processing tips
- Respond 200 within a few seconds; process asynchronously.
- Use
id(oremailLogId) for deduplication — retries are expected. - On
email.bounced(hard) orcontact.unsubscribed, add the address to your local suppression logic.