Most "my webhook doesn't fire" problems are one of seven things. Work down the list; each step takes a minute.
In the Stripe Dashboard, open your webhook endpoint (under Developers or Workbench, depending on your Dashboard version) and open the event deliveries. Every attempt shows the HTTP status your server returned. That status tells you which step below applies. Stripe documents the common error statuses on its webhooks page (Stripe docs: Receive events).
Stripe does not follow redirects for webhooks: "We consider redirect responses to webhook requests as failures." (source). Typical causes: example.com redirecting to www.example.com, http to https, or a trailing-slash rule. Fix: paste the final URL (the one the redirect points to) into the endpoint settings. See the 307/308 guide.
Stripe cannot pass a login or JWT. Common culprits: Vercel deployment protection on preview URLs, Supabase Edge Functions with JWT verification on, or a bot challenge from a CDN. Supabase's own Stripe example deploys the function with verify_jwt = false because "Stripe verifies the request via its signature" (Supabase docs).
Check the exact path (/api/webhooks/stripe vs /api/webhook) and that the route accepts POST.
Stripe needs the raw request body to verify the signature, and "any manipulation to the raw body of the request causes the verification to fail" (source). The other common cause is the wrong signing secret: test and live endpoints have different secrets (source). Full fix: signature verification failed.
Your endpoint must "quickly return a successful status code (2xx) before any complex logic that could cause a timeout" (source). Verify, record the event, return 200, then do the slow work.
For Checkout, Stripe's fulfillment guide handles checkout.session.completed and, for delayed payment methods, checkout.session.async_payment_succeeded (Stripe docs: Fulfill orders). Make sure the endpoint is subscribed to those events in the mode you're testing.
Stripe retries failed live-mode deliveries for up to three days with exponential backoff, and sandbox deliveries three times over a few hours (source). To recover missed events sooner, Stripe documents how to list and process undelivered events (Stripe docs).
Paste your webhook URL. WebhookProof sends 3 harmless test requests and tells you whether Stripe can reach it and whether it rejects unsigned events.
Run the free checkNo. Stripe treats any 3xx response to a webhook request as a failed delivery. Use the final URL in your endpoint settings.
In live mode, up to three days with exponential backoff. In a sandbox, three times over a few hours.
In the Stripe Dashboard, open your webhook endpoint and look at its event deliveries; each attempt shows the HTTP status your server returned.
A customer paid but didn't get access. What went wrong? · Stripe webhook signature verification failed · Stripe webhook getting a 307 or 308 redirect · Stripe webhook on Supabase Edge Functions: fixing 401s and signature errors
Last reviewed 2026-10-18. WebhookProof is an independent tool, not affiliated with Stripe, Inc. Quotes are from the linked documentation.