Skip to content
sarmakska edited this page May 3, 2026 · 5 revisions

webhook-to-email

Tiny, production-grade webhook receiver. POST anything, get an email. Optional Slack fan-out, HMAC verification, retries.

Built by Sarma Linux. MIT licence.


What this is

A 200-line Node.js service that turns webhook traffic into formatted emails and, optionally, Slack messages. Drop it next to any service that emits webhooks: Stripe, GitHub, Typeform, Calendly, Cal.com, Vercel, Linear, Sentry, Twilio, or internal cron jobs.

Point the webhook at this service, it verifies the signature (optional but recommended), formats a readable email, and sends it via Resend. Stateless, no database, logs to stdout.

Who this is for

  • Developers who want a single notification destination for all their SaaS webhooks.
  • Teams who need a webhook firehose they can route, audit, and replay from one place.
  • Anyone forwarding Cal.com, Stripe, or GitHub events to their inbox.

Key features

  • HMAC-SHA256 verification — optional, supports multiple header formats (X-Signature, X-Hub-Signature-256, X-Stripe-Signature).
  • Per-source templates — drop a JS file in src/templates/<source>.js to format any payload.
  • Default formatter — no template? sends pretty-printed JSON. Zero config for new sources.
  • Slack fan-out — one env var away.
  • Single-attempt retry on 5xx from Resend.
  • Docker-readydocker run or docker-compose up -d.

Resource usage

~50MB RSS at idle. Handles ~1000 req/sec before Resend rate limits become the bottleneck.

Stack

Node.js 20+, Express 4, Resend email API, Docker (Alpine, ~80MB image).


Wiki pages

Repository

github.com/sarmakska/webhook-to-email

Clone this wiki locally