Everything worked in test. You switched to live keys, real customers pay, and nothing unlocks. Check the webhook secret.
Stripe signs each endpoint with its own secret, and "if you use the same endpoint for both test and live API keys, the secret is different for each one" (Stripe docs). Swapping sk_test_ for sk_live_ isn't enough: you also need the live endpoint's whsec_. Test and live keys are separate sets of credentials (Stripe docs: API keys).
A second variant: the local stripe listen secret (Stripe CLI docs) left in production config.
livemode: true events.livemode doesn't match the environment.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 checkYes. Stripe says the secret is different for test and live, even for the same URL, and each endpoint has its own secret.
The most common reason is that production still uses the test (or Stripe CLI) signing secret, so every live event fails signature verification.
No. The secret printed by stripe listen only verifies events forwarded by the CLI.
Stripe webhook not working? Check these 7 things in order · A customer paid but didn't get access. What went wrong? · Stripe webhook signature verification failed · Stripe webhook getting a 307 or 308 redirect
Last reviewed 2026-10-18. WebhookProof is an independent tool, not affiliated with Stripe, Inc. Quotes are from the linked documentation.