Latch v1

The webhook hits.
The alert fires once.

Latch is a small production worker for a VPS. It verifies Stripe signatures, stores each event.id exactly once, and posts a short human message to Slack and/or Telegram. Retries are exponential. Failures land in a dead-letter you can inspect.

Connect Stripe $29/mo managed
1 signed ingest  →  Stripe-Signature + STRIPE_WEBHOOK_SECRET
2 idempotent store  →  SQLite, unique event.id, replays do not double-notify
3 outbound  →  Slack incoming webhook and/or Telegram bot
4 retry  →  exponential backoff, then dead-letter

What it notifies

Handled in v1:

Every other Stripe type is acknowledged with HTTP 200 and is not sent downstream. Each alert includes customer email when present, amount + currency, the event type, and a Dashboard URL.

Stripe setup

  1. Deploy Latch on a VPS (see the README). Confirm GET /health returns {"status":"ok"}.
  2. Your public endpoint is:
    https://YOUR_HOST/webhooks/stripe
  3. In Stripe Dashboard go to Developers → Webhooks → Add endpoint.
  4. Paste that URL. Select at least the three events above. Save.
  5. Reveal the endpoint’s Signing secret (whsec_…) and set it as STRIPE_WEBHOOK_SECRET on the box. Restart Latch.
  6. Send a test event from the Dashboard. You should get one Slack/Telegram message. Send it again: still one message.
Do not put secrets in git. Copy .env.example to .env on the server. Keep STATUS_TOKEN private — it gates GET /deadletter.

Pricing

$29/month

Placeholder for a managed Latch. Self-hosting this repo stays free. No checkout on this page.

Why a worker, not a Zap

Stripe retries. Humans double-click “Send test”. A naive forwarder pages you twice for one dispute. Latch latches on event.id first, then delivers. If Slack is down, it backs off and keeps the payload in SQLite instead of asking Stripe to hammer you.