Stripe webhook says 'No signatures found matching the expected signature'? Two causes

Ship ItChecked against the official source

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

  1. 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.
  2. For a Dashboard endpoint, open it in Workbench and click Reveal secret. For the CLI, the secret is printed when you run stripe listen.
  3. 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.

Related