Email Events (Resend)
Synapse receives webhook events from Resend for email delivery tracking. These events update email log records, create contact activity timeline entries, and power your analytics dashboard.
Webhook Endpoint
This endpoint is configured automatically when you set up Resend integration in your workspace settings.
You do not need to configure this webhook yourself. Synapse manages the Resend webhook subscription. This documentation is for understanding how email tracking works.
Supported Events
| Resend Event | Synapse Event Name | Description | Action |
|---|---|---|---|
email.sent | email_sent | Email accepted by Resend for delivery | Logged only (already marked as sent during send) |
email.delivered | email_delivered | Email accepted by recipient's mail server | email_logs.status set to delivered, delivered_at set |
email.delivery_delayed | email_delivery_delayed | Temporary delivery delay (soft bounce, server busy) | Delay reason logged; status unchanged (Resend retries automatically) |
email.opened | email_opened | Recipient opened the email (pixel tracking) | email_logs.first_opened_at set on first open |
email.clicked | email_clicked | Recipient clicked a link in the email | email_logs.first_clicked_at set on first click |
email.bounced | email_bounced | Email permanently rejected (hard bounce) | email_logs.status set to bounced, contact auto-unsubscribed |
email.complained | email_spam_reported | Recipient marked the email as spam | email_logs.status set to complained, contact auto-unsubscribed |
email.failed | email_failed | Send failure on Resend's side | email_logs.status set to failed, error message captured |
email.suppressed | email_suppressed | Email blocked by Resend suppression list | email_logs.status set to suppressed, reason captured |
Webhook Payload
Resend sends individual event objects (not batches). Each event has this structure:
Synapse matches events to email log records using the X-Email-Log-Id custom header, which is injected into every outgoing email. If the header is missing, Synapse falls back to matching by data.email_id against the provider_message_id field.
Signature Verification
Resend uses Svix for webhook signing. Verification uses three headers:
| Header | Description |
|---|---|
svix-id | Unique message identifier |
svix-timestamp | Timestamp used in signature generation |
svix-signature | HMAC signature of the payload |
See Signature Verification for implementation details and code examples.
Event Processing
Delivered
When an email is delivered, Synapse updates the log record:
Opened
First-open tracking (subsequent opens are counted but do not update the timestamp):
Open tracking relies on a 1x1 pixel image. Email clients that block images (Apple Mail Privacy, Outlook) may not register opens. Open rates should be treated as a lower-bound estimate.
Clicked
First-click tracking:
Bounced (Hard Bounce)
Hard bounces indicate a permanent delivery failure:
Contacts that bounce are automatically unsubscribed to protect your sender reputation. Do not re-subscribe contacts who have bounced -- verify the email address first.
Complained (Spam Report)
When a recipient marks your email as spam:
Contacts who file spam complaints are automatically unsubscribed and will not receive any further emails. This is enforced at the delivery pipeline level.
Delivery Delayed
Resend fires this event when delivery is temporarily delayed (soft bounce, recipient server busy). Synapse logs the delay reason but does not change the email status -- Resend retries delivery automatically.
Failed
A send failure on Resend's side (infrastructure error, rejected by Resend):
Suppressed (Provider)
The email was blocked because the recipient is on Resend's suppression list (previous hard bounce or spam complaint on Resend's side):
Provider-level suppression (from Resend's suppression list) is different from NLT suppression (from the required modifier). Both result in a suppressed status, but the error message indicates the cause.
Activity Timeline
For each recognized event, Synapse creates an Event record on the contact's activity timeline. Timeline events include:
email_log_id-- the internal email log recordemail_subject-- the rendered email subjectto-- the recipient addressemail_provider-- always"resend"for Resend eventsresend_email_id-- the Resend email ID (when available)url-- the clicked link URL (for click events)
Viewing Email Events
Dashboard
Navigate to Email Logs in the Synapse dashboard to see per-email delivery status, open/click tracking, and bounce details.
API
Use the Email Logs API to query email logs programmatically:
Contact Status Lifecycle
| Status | Can Receive Email | Triggered By |
|---|---|---|
subscribed | Yes | Default state, manual re-subscribe |
unsubscribed | No | Hard bounce, spam complaint, user opt-out |