SendGrid's Event Webhook posts a batch of delivery events to a URL you choose. Give it your Spaw feedback URL and the loop closes without code: bounced and dropped addresses go straight onto your suppression list, deliveries confirm mailboxes for your own later lookups, and the History tab shows how the verdicts you paid for compared with what SendGrid actually saw.
Set up the Event Webhook
- In the Spaw dashboard, open the API keys page, generate a feedback key, and copy the SendGrid URL:
https://spaw.co/api/v1/email/feedback/sendgrid/fb_…
- In SendGrid, open the Event Webhook settings under Mail Settings and add a webhook with that URL as the HTTP POST destination.
- Select the Delivered, Bounced, Dropped and Spam Reports events. Leave Deferred off, or on; Spaw ignores it either way, because a deferral says nothing definitive about the address.
- Save, then use SendGrid's test feature. Spaw answers
200with how many outcomes it recorded.
What Spaw reads from the payload
SendGrid posts a JSON array with one object per event, often several events per request. For each object Spaw reads event, email, reason and timestamp, and nothing else:
| SendGrid event | Recorded as |
|---|---|
delivered |
delivered |
bounce |
bounced |
dropped |
bounced, the address was refused before sending |
spamreport |
complained |
deferred, processed, open, click and the rest |
ignored |
The reason field, which carries the receiving server's reply for a bounce or SendGrid's explanation for a drop, is stored as the reason, and the Unix timestamp becomes the time of the outcome. A request with two events, trimmed to the fields Spaw uses:
[
{ "event": "bounce", "email": "[email protected]", "reason": "550 5.1.1 user unknown", "timestamp": 1788782400 },
{ "event": "delivered", "email": "[email protected]", "timestamp": 1788782460 }
]
Treating dropped as a bounce is deliberate. SendGrid drops a message when the address is already on one of its own suppression lists or is malformed, and in both cases the address should not be sent to again.
What Spaw does with the events
A bounce, a drop or a spam report adds the address to your suppression list with source feedback. Batch, bulk and monitor runs then answer it from the stored verdict at no cost, with reason suppressed and a risk score of 100; only a single lookup re-verifies it, which is the only way off the list.
A delivery removes any entry Spaw had added automatically, and for the next 90 days the address counts as a confirmed mailbox for your own lookups, reported as smtp_reason: "delivered_recently" with no mailbox probe. Every outcome is matched against the verdict you were given for the address in the previous 90 days, and the feedback summary endpoint reports the delivery rate among addresses answered deliverable and the bounce rate among addresses answered undeliverable. Outcomes are kept for 180 days.
Keep the URL private
SendGrid can sign its webhook posts, but Spaw does not verify that signature: the feedback key in the URL is the credential. Anyone holding the URL can add outcomes to your account, so if it leaks, rotate the key on the API keys page. Every old URL then answers 401 INVALID_FEEDBACK_KEY, and you paste the new URL into SendGrid.
Cost
Feedback is free and never logged as a lookup. The endpoint is throttled at 120 requests per minute per IP; SendGrid batches events, so even busy senders stay well under it.