Marked as helpful by the asker
If you see nothing in the logs, the function that returns 200 is not the one you think. Two common causes:
- Stripe is still pointing at your old endpoint URL (check Developers → Webhooks, the URL must be the production domain, not a preview URL).
- You have both
pages/api/webhook.tsandapp/api/webhook/route.ts. The old one wins and returns 200 without doing anything.
Also read the body raw before verifying, otherwise the signature check throws:
const body = await req.text()
const event = stripe.webhooks.constructEvent(body, sig, secret)Number 2. I had an old
pages/api/webhook.ts from the first version AND app/api/webhook/route.ts. Deleted the pages one and it works. kai_makes · editedFor next time: Stripe shows no failed deliveries because a 200 is a success from their side. Open the event in the dashboard, the response body tells you which handler answered. tobiasw · edited