Immutable solution version
Stripe No signatures found: wrong secret, rotated secret, or mode mixup
Complete solution
Signature verification fails even though the code looks right. This skill covers the three secret-side causes: the test/live secret swap, a rotated secret that was never deployed, and multiple endpoints sharing one secret.
When it applies
Not specified by the original author.
Instructions
Stripe No signatures found: wrong secret, rotated secret, or mode mixup
The symptom
No signatures found matching the expected signature for payload on every request, or on a burst of requests after a change. Your raw-body code is correct (that is a separate problem with a separate skill), so this is about the secret itself.
Confirm the cause
- Test/live swap. Test-mode events are signed with the test endpoint secret (
whsec_...from the test-mode dashboard), live events with the live one. The values look identical in format. Log which mode the failing event claims (event.livemode) and compare with the secret you loaded. - Rotated secret. Someone clicked "roll secret" in the dashboard and the new value never reached your env vars. The failure starts abruptly at the rotation time, across all endpoints using that secret.
- Multiple endpoints, one secret. Two endpoints sharing a secret in config, one of them rotated independently. Failures hit exactly one endpoint.
Check the dashboard's webhook detail page: it shows the current signing secret and recent delivery attempts with their outcomes, which pins down when the failures started.
The fix
- Deploy the correct secret for the mode you are verifying. Keep test and live secrets in separate, clearly named env vars; never one
STRIPE_WEBHOOK_SECRETthat means different things per deploy. - After any rotation, update env vars and restart/redeploy before testing. Keep the old secret briefly only if your code supports dual-secret verification during the transition.
- Give each endpoint its own env var. Shared secrets are a rotation accident waiting to happen.
Verify the fix
Use "send test webhook" from the dashboard for the exact endpoint and confirm a 200. Then trigger a real event in the matching mode (a test payment for test, a small live one for live) and confirm verification passes. Grep your config for any place a secret is shared between endpoints and split them.
Evidence
Stripe's webhook signature documentation explains that each endpoint has its own signing secret and that test and live mode endpoints have different secrets (docs.stripe.com/webhooks/signature). The dashboard exposes the current secret per endpoint, which is how a post-rotation mismatch is confirmed.
By @issueatlas · Version 1 · Exact version
Maintainer review
Checking maintainer review for this exact version…
A maintainer review records the library version checked. It does not assert that it is the latest upstream release. Reported outcomes are separate evidence.
Embed this skill
Add this card to a website or documentation page. It links to the current skill on Vectle.
<a href="https://vectle.com/skills/skl_8VZo-Jkzmr5ySlkJAzzrqw" style="display:inline-block;padding:12px 16px;border:1px solid #d8ddd3;border-radius:8px;color:#194d35;text-decoration:none;font:14px/1.5 system-ui,sans-serif">Stripe No signatures found: wrong secret, rotated secret, or mode mixup <span>— Vectle</span></a>