/stripe-local-dev
Ensure Stripe webhooks work in local development by auto-syncing ephemeral secrets.
The Problem
Stripe CLI generates a new webhook secret every time stripe listen starts. If your dev script auto-starts the listener but doesn't sync the secret, you get:
Webhook error: signature verification failed
No signatures found matching the expected signature for payload
The Solution Pattern
Auto-start requires auto-sync. Use dev-stripe.sh:
- Extract secret via
stripe listen --print-secret - Sync to environment (Convex env OR .env.local)
- THEN start forwarding
Also: if checkout succeeds but access stays locked and you see:
stripe_webhook_missing_convex_tokenWebhook token is not configuredthenCONVEX_WEBHOOK_TOKENis missing/mismatched between Next runtime and Convex.
Architecture Decision
| Webhook Location | Secret Sync Target | Restart? | Recommendation |
|-----------------|-------------------|----------|----------------|
| Convex HTTP (convex/http.ts) | bunx convex env set (or npx) | No | Best |
| Next.js API Route | .env.local | Yes | Requires orchestration |
Prefer Convex HTTP webhooks - secret sync is instant, no restart needed.
Implementation
Option A: Convex HTTP Webhooks (Recommended)
Copy script:
cp ~/.claude/skills/stripe-local-dev/scripts/dev-stripe-convex.sh scripts/dev-stripe.sh
chmod +x scripts/dev-stripe.sh
Update package.json:
"stripe:listen": "./scripts/dev-stripe.sh"
Option B: Next.js API Webhooks
Copy script:
cp ~/.claude/skills/stripe-local-dev/scripts/dev-stripe-nextjs.sh scripts/dev-stripe.sh
chmod +x scripts/dev-stripe.sh
Update package.json:
"stripe:listen": "./scripts/dev-stripe.sh"
Note: Next.js needs restart to pick up env changes. The script warns about this.
Verification
After setup, run:
bun run dev # or: pnpm dev
# Then in another terminal:
stripe trigger checkout.session.completed
# Check logs for 200 response, not 400
Quick Diagnostics
| Symptom | Cause | Fix |
|---------|-------|-----|
| All webhooks return 400 | Stale secret | Restart dev server or re-sync secret |
| "signature verification failed" | Secret mismatch | Check CLI output matches env |
| Works once, fails after restart | No auto-sync | Add dev-stripe.sh script |
| CLI shows delivered, app shows error | Wrong env target | Check sync target (Convex vs .env.local) |
| Checkout succeeds, still locked, confirm/webhook 5xx | Missing/mismatched CONVEX_WEBHOOK_TOKEN | Ensure token parity, restart Next.js |
Related Skills
/check-stripe- Audit Stripe integration/stripe-health- Webhook health diagnostics/stripe-audit- Comprehensive Stripe audit