Billing & webhooks · 2026

Your Stripe webhook is going to silently drop a paid customer.

Stripe webhooks fail. Yours will too. Four patterns that prevent the "paid customer with no access" disaster, with Node.js and Postgres code, plus the daily reconciliation cron you should already be running.

Ship web + worker + cron on one platform.

Web service, background worker, scheduled jobs and Telegram alerts on every plan. Always-on free tier.

No credit card required 1 service free forever Workers + cron included Telegram alerts on every plan
Frequently asked

Quick answers

Why do Stripe webhooks fail in production?

Stripe retries up to 3 days when your endpoint times out or returns a 5xx. Common causes: heavy synchronous work in the handler, database deadlocks under burst, missing idempotency, and infrastructure restarts mid-request.

What is the fastest fix for Stripe webhook reliability?

Verify the signature, persist the raw event with the Stripe event ID as a unique key, return 200 within 200 ms, and process asynchronously in a worker. This single pattern eliminates most production failures.

Should I implement idempotency by event type or by event ID?

By event ID. Stripe event IDs are guaranteed unique and stable across retries. A unique constraint on the event ID column ensures a duplicate delivery becomes a no-op without complex business-logic checks.

How do I detect Stripe webhook drops after the fact?

Run a daily reconciliation cron that pulls Stripe's event list for the last 24 hours and diffs it against your local event table. Any missing IDs get replayed via the Events API.