Skip to content

fix(resend): deliver webhooks with Svix signatures - #1

Closed
xirothedev wants to merge 1 commit into
feat/sepay-adapterfrom
fix/resend-webhook-delivery
Closed

fix(resend): deliver webhooks with Svix signatures#1
xirothedev wants to merge 1 commit into
feat/sepay-adapterfrom
fix/resend-webhook-delivery

Conversation

@xirothedev

Copy link
Copy Markdown
Owner

Stacked PR: targets feat/sepay-adapter locally because the resend commit sits on top of it (shared registry/README hunks). Upstream tracking PR: vercel-labs#211 (merge first). Once vercel-labs#211 merges upstream, retarget this one to vercel-labs:main.

Summary

The resend plugin dispatched email.sent/email.delivered/etc. to the shared WebhookDispatcher, but nothing ever registered subscriptions owned by resend, so no webhook was ever delivered. This also meant Resend's real-world Svix signing scheme had no local counterpart.

  • New seed key resend.webhook_targets: [{ url, signing_secret? }]; targets register as owner-resend subscriptions (idempotent by URL)
  • Custom header factory emits Svix headers: svix-id, svix-timestamp, svix-signature: v1,<base64 HMAC-SHA256(secret, "{id}.{timestamp}.{body}")>
  • Omitted signing secrets auto-generate in Svix format (whsec_<base64>) and surface via generatedSecrets (resend.webhook_signing_secret) through a new prepareSeed hook

Test plan

  • 2 new tests: live node:http target receives email.sent + email.delivered with correct svix-* headers and signature verified by inline HMAC recomputation; omitted-vs-explicit secret behavior
  • resend package 25/25 green; monorepo pipeline green (--filter='./packages/*', 20/20)

WebhookDispatcher events for resend were dispatched but no subscription
was ever registered, so nothing was delivered.

- seed key resend.webhook_targets: [{ url, signing_secret? }]
- targets register as owner-resend subscriptions on startup
- custom header factory emits svix-id/svix-timestamp/svix-signature
  (HMAC-SHA256 over {id}.{timestamp}.{body}, base64, v1,<sig>)
- omitted signing secrets auto-generate as whsec_<base64> via new
  prepareSeed/generatedSecrets hook in the registry entry
- tests: live http target asserts headers + signature verification
@xirothedev

Copy link
Copy Markdown
Owner Author

Superseded by vercel-labs#212 — same change submitted to upstream directly.

@xirothedev xirothedev closed this Aug 26, 2026
@xirothedev
xirothedev deleted the fix/resend-webhook-delivery branch August 26, 2026 17:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant