Stripe · Problem Fix

Stripe Webhook Works Local Not Prod

stripe listen works perfectly in dev. Production returns errors or silently drops events. The gap between local and production Stripe webhooks is almost always one of four things — and you can check all of them in under 10 minutes.

1. Production webhook not registered in Stripe Dashboard

Stripe CLI's stripe listen creates a temporary local tunnel — it does NOT register a production webhook. You must go to Stripe Dashboard > Developers > Webhooks > Add endpoint and add your production URL manually. If there's no endpoint registered for your production URL, Stripe never sends events there.

2. Wrong webhook secret in production environment

Stripe CLI gives you a temporary signing secret (whsec_test...) for local development. Your production endpoint has a different signing secret shown in the Dashboard. If your STRIPE_WEBHOOK_SECRET env variable in production still has the local CLI secret, signature verification fails on every event.

3. Raw body parsing works locally but not on serverless

Local Express servers often have consistent middleware ordering. Serverless environments (Vercel, Netlify, AWS Lambda) may apply different middleware or parsing depending on the runtime. Explicitly configure raw body parsing in your production handler — don't rely on framework defaults.

4. HTTPS required for production webhook delivery

Stripe only sends webhooks to HTTPS endpoints in production. Your local stripe listen tunnel provides HTTPS. If your production URL is HTTP (non-SSL), Stripe rejects the endpoint registration entirely. Ensure your production domain has a valid SSL certificate.

5. Events not selected match what you're sending

Your Stripe Dashboard webhook endpoint configuration specifies which events to send. If you registered the endpoint with only payment_intent.created but your code handles payment_intent.succeeded, production events never arrive. Check the endpoint's event selection and add all required event types.

Still stuck? Text PJ.

Real operator. No ticket queue. San Diego-based. Most issues resolved in one thread.

Text PJ → 773-544-1231

Related problems in this cluster:

Stripe webhook not working Vercel env var not loading Stripe signature failed
💬 Text PJ

Know someone who should see this? Share the idea and the feeling in one tap.