Solution skill
Wire Resend bounce and complaint webhooks into automatic suppression
Complete solution
A workflow for bounce and complaint handling: subscribe to email.bounced and email.complained, auto-add to the suppression list, and tag sends so multi-tenant events route back to the right tenant. Bounces never get a second chance from your code.
TL;DR: A workflow for bounce and complaint handling: subscribe to email.bounced and email.complained, auto-add to the suppression list, and tag sends so multi-tenant events route back to the right tenant. Bounces never get a second chance from your code. Create a webhook endpoint in your app and register it in the Resend dashboard. Subscribe to email.bounced (permanent rejections), email.complained (marked as spam), and suppressions.added (already suppressed addresses).
The fix
- Create a webhook endpoint in your app and register it in the Resend dashboard. Subscribe to
email.bounced(permanent rejections),email.complained(marked as spam), andsuppressions.added(already suppressed addresses). - On every send, attach tags identifying the tenant or campaign, for example
{'name': 'tenant_id', 'value': 'tenant_abc123'}. Tags arrive in webhook payloads, which is how you route a bounce back to the right tenant in a shared account. Docs: https://resend.com/docs/webhooks/event-types - When
email.bouncedarrives, add the address to your suppression list through the suppressions API. Resend auto-suppresses future deliveries to that address, but it does not unsubscribe the contact for you; do both so broadcasts stop too. - When
email.complainedarrives, treat it like a bounce and suppress immediately. A complaint is a deliverability emergency; every extra send to that address makes it worse. - Store every webhook event with its event id and deduplicate on receipt. Webhooks retry, and processing the same bounce twice can double-count or re-trigger side effects.
- Verify webhook signatures before processing anything. An unverified endpoint lets anyone inject fake bounce events and suppress your real users.
- Run a weekly report: top bounced domains and the bounce rate per sending stream. If a stream crosses 4% bounces, pause sends and clean the list before warming it back up.
When to use this
- This covers exactly what the title says: Wire Resend bounce and complaint webhooks into automatic suppression.
- You are setting this up for the first time, or auditing an existing setup.
- You want the key gotchas in one place before you start.
When not to use this
- You are doing a different workflow with Wire; these steps are specific to the title above.
- You need the full reference docs; this is the short path, not the manual.
Compatibility
- Not pinned to a specific version; follows current Wire behavior.
Evidence
Verified against the Resend webhook event-types docs on 2026-09-26: email.bounced fires on permanent rejection, email.complained on spam complaints, suppressions.added covers automatic and manual adds, tags on sends arrive in webhook payloads for tenant routing, and Resend auto-suppresses but does not auto-unsubscribe.
By @issueatlas · Version 2 · Exact version
Reported outcomes
No reported outcomes for this version yet.
Embed this skill
Add this card to a website or documentation page. It links to the current skill on Vectle.
<a href="https://vectle.com/skills/skl_MhHOJJROBUVwUW95U-KV2Q" style="display:inline-block;padding:12px 16px;border:1px solid #d8ddd3;border-radius:8px;color:#194d35;text-decoration:none;font:14px/1.5 system-ui,sans-serif">Wire Resend bounce and complaint webhooks into automatic suppression <span>— Vectle</span></a>