SendGrid webhook
Collect email delivery and engagement events from your own SendGrid account. SendGrid is already an Intempt destination; this page is the source direction.
Research Preview. This connector is rolling out account by account. Ask your Intempt contact to enable it for your workspace.
Two SendGrid integrations, two directions. The SendGrid destination lets Journeys send email through Intempt's SendGrid connection and already reports engagement on those sends. This page is the source: your own SendGrid account, sending email from your own systems, streaming its Event Webhook into Intempt. If you only send through Intempt Journeys, you don't need this page.
The SendGrid webhook collects email delivery and engagement for mail you send from your own SendGrid account: processed, delivered, deferred, bounced, opened, clicked, marked as spam, unsubscribed. Inbound Parse adds replies.
The result is one timeline. A transactional receipt sent from your app and a campaign sent from an Intempt journey land on the same profile, with the same event names.
Available events
SendGrid's Event Webhook has exactly twelve types. Eleven map; account_status_change is account-level and isn't stored on a profile.
| Event | Description | Intempt event |
|---|---|---|
processed | SendGrid accepted the message for delivery | messaged_email |
dropped | SendGrid dropped it before sending (suppressed, invalid, over quota) | email_dropped |
delivered | Receiving server accepted it | delivered_email |
deferred | Receiving server asked SendGrid to retry later | deferred_email |
bounce | Rejected. type is bounce (hard) or blocked (soft) | bounced_email |
open | Recipient opened. sg_machine_open flags Apple Mail Privacy Protection prefetches | opened_email |
click | Recipient clicked a tracked link | clicked_email |
spamreport | Recipient marked it as spam | marked_as_spam_email |
unsubscribe | Recipient used the global unsubscribe link | unsubscribed_email |
group_unsubscribe | Recipient left an unsubscribe group | unsubscribed_consent |
group_resubscribe | Recipient rejoined an unsubscribe group | subscribed_consent |
account_status_change | Your SendGrid account status changed | Not mapped |
| Inbound Parse POST | A reply or inbound message to a domain you route to SendGrid | email_inbound_received |
Each event is normalised onto a named stream, so you build segments and journey triggers on the event name rather than on the payload shape.
Intempt also derives suppression_added and suppression_removed from the bounce, spam report and unsubscribe events, so one attribute tells you whether a person is currently suppressed on any channel.
Identity
The identity key is the email field, present on every Event Webhook type. Inbound Parse uses envelope.from, and Intempt matches it against Event Webhook addresses so a reply joins the profile of the person you wrote to.
Custom args come through as top-level keys on the event. SendGrid doesn't wrap them, so every non-reserved key on the payload is treated as a custom arg. If your app sets a customer id there, Intempt keeps it on the event.
What doesn't arrive by webhook
Contacts, lists and unsubscribe groups aren't webhook events. There's no Event Webhook type for a contact being created, changed or deleted, or for list membership. Those come from the historical load and scheduled reads of the Marketing Campaigns Contacts API.
Endpoint
The collector path for SendGrid events is:
https://<your collector host>/webhooks/events/sendgridSendGrid doesn't let you add request headers, so the source token travels in the endpoint URL Intempt gives you. Events arrive batched as a JSON array; Intempt splits them and de-duplicates on sg_event_id.
Historical load
SendGrid's historical load runs on the certified Airbyte source source-sendgrid,
using the same API key you enter above. It loads contacts, lists, segments, campaigns and
unsubscribe groups.
Engagement history is the exception. Opens, clicks and bounces before setup live in the Email Activity Feed API, a paid add-on throttled to 6 requests a minute, and this connector does not read it. Engagement starts at the first Event Webhook delivery.
Setup
The Event Webhook is configured under Mail Settings in SendGrid. Inbound Parse is a separate setting and needs an MX record. Create the source in Intempt first.
Configure SendGrid
-
Create a SendGrid source on the Integrations page and copy the endpoint URL.
-
In SendGrid, go to Settings, Mail Settings, then Event Webhooks, and click Create new webhook.
-
Paste the Intempt endpoint as the Post URL.
-
Under Actions to be posted, turn on every type in the table above. Under Engagement, opens and clicks only fire if click and open tracking are enabled on your account.
-
Set the webhook to Enabled and save. Use Test Your Integration and confirm a
processedevent appears in the Intempt event stream. -
For replies, go to Settings, Inbound Parse, add the subdomain you receive on, and paste the same Intempt endpoint as the Destination URL. Point that subdomain's MX record at
mx.sendgrid.netas SendGrid instructs.
