Stripe Webhook Not Working
Quick answer: open the endpoint in Stripe Workbench, confirm the URL and selected event types, then check delivery attempts. For local work, keep Stripe CLI open and forward to the exact local POST route; for production, use HTTPS and return 200 before slow downstream processing.
Why This Happens
- The endpoint URL, mode, or event subscription does not match the event you expect.
- The handler mutates the raw body before signature verification.
- The handler does too much work before returning a successful status code.
What To Check First
- Check Stripe Workbench delivery logs for status codes and response body.
- Confirm the route accepts POST and uses the endpoint's `whsec_` secret.
- Move slow fulfillment, email, CRM, or Zapier work after the 2xx response.
When To Escalate
- The problem is costing you money or customers per week
- You've spent more than 2 hours on it without progress
- A vendor quoted you more than $500 and you're not sure if it's necessary
FAQ
- Why are Stripe webhook events not arriving? Per Stripe webhook docs, Sept 2026, Stripe sends events to the endpoint URL and event types you register. Check that the endpoint is public HTTPS in production and subscribed to the event you expect.
- Can I test Stripe webhooks on localhost? Yes. Per Stripe docs, Sept 2026, use `stripe listen --forward-to localhost:4242/webhook` to forward events to a local POST route before registering a public URL.
- What should a Stripe webhook handler return? Per Stripe webhook docs, Sept 2026, return a 2xx status quickly before slow follow-up work. Long processing before the response can cause timeouts and retries.
Dealing with this right now?
Check endpoint health: Dashboard → Developers → Webhooks → [endpoint] → see if it shows "Disabled" status. Stripe automatically disables endpoints that fail 100 consecutive delivery attempts. Re-enable it and fix the underlying issue before re-enabling, or the endpoint will be disabled again quickly. For local development: use the Stripe CLI (`stripe listen --forward-to localhost:3000/webhook`) which creates a secure tunnel and also logs every event in real time — much faster than debugging in the Dashboard.