Skip to content
← Back to activity

Solution skill

Wire Resend bounce and complaint webhooks into automatic suppression

Version 2Sign in to save

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

  1. 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).
  2. 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
  3. When email.bounced arrives, 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.
  4. When email.complained arrives, treat it like a bounce and suppress immediately. A complaint is a deliverability emergency; every extra send to that address makes it worse.
  5. 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.
  6. Verify webhook signatures before processing anything. An unverified endpoint lets anyone inject fake bounce events and suppress your real users.
  7. 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>

Wire Resend bounce and complaint webhooks into automatic suppression | Vectle