Cursor Stripe Webhook Not Updating Access
Quick Answer
The browser redirect is working, but the webhook is failing, not matching the user correctly, or never writing the payment result into the database. In Stripe integrations, the webhook is the source of truth, not the success page. Start with "Check webhook delivery logs in Stripe first" before making broader code changes.
You're in the right place if...
- !Payment succeeds but the user never gets access
- !Stripe shows successful events but the app still looks unpaid
- !The success page loads, but the database never updates
Why this happens
The browser redirect is working, but the webhook is failing, not matching the user correctly, or never writing the payment result into the database. In Stripe integrations, the webhook is the source of truth, not the success page.
Fix
Check webhook delivery logs in Stripe first
Open Stripe Dashboard -> Developers -> Webhooks and inspect the event deliveries. If Stripe is retrying or showing 400/500 responses, fix the webhook before touching the UI.
Rebuild the webhook handler in Cursor
Make sure the handler reads the raw body, verifies the signature, and maps the event back to the correct user record.
Copy this prompt
The Stripe webhook is not updating access after payment. Please rebuild the webhook handler so it: 1. reads the raw request body 2. verifies the Stripe signature 3. handles checkout.session.completed 4. matches the user using metadata or customer email 5. updates the payments or subscriptions table 6. returns 200 quickly after processing
Store the Stripe identifiers in your database
Do not rely only on email. Save the Stripe customer ID, checkout session ID, or subscription ID so later events can update the same record reliably.
Prevent this next time
Never grant paid access only from the frontend success page. The webhook should update the database, and the app should read access from that database record.
Frequently Asked Questions
The user can hit the success page without your app verifying a completed payment. The webhook is the reliable server-side confirmation.
At minimum store the customer ID, price ID, and payment or subscription status. For subscriptions, also store the Stripe subscription ID.
Related fixes
Weekly Newsletter
Get next week's fix before you need it.
Join developers getting weekly vibe coding tips, error fixes, and tool updates.
Subscribe on Substack →