Stripe webhook says 'No signatures found matching the expected signature'? Two causes
Ship ItChecked against the official source
Source checked 8 Nov 2026 · Published 9 Nov 2026 · Last reviewed 9 Nov 2026 · By Ctrl+Z Therapy (how we test)
The short answer
Stripe's docs: to verify a webhook, your code passes three things: the raw request body string Stripe sent, the Stripe-Signature header value, and the secret associated with your endpoint. If at least one is incorrect, you see: Webhook signature verification failed. Err: No signatures found matching the expected signature for payload. The most common cause is using the wrong endpoint secret.
What to do
- Check the secret: the CLI-forwarded endpoint and the Dashboard endpoint have different secrets. Both start with whsec_. Print the one your code uses and compare.
- For a Dashboard endpoint, open it in Workbench and click Reveal secret. For the CLI, the secret is printed when you run stripe listen.
- Check the body: it must be the exact string Stripe sent. With stripe-node and Express, put app.use(express.json()) after your webhook route.
Good to know
- Some frameworks parse or mutate the request body before your code sees it, which makes verification fail.
- Stripe's docs link working examples for Next.js App Router and Pages Router.
Source
Checked on 8 Nov 2026. Prices, limits and settings change, so check the source before you rely on them.