Bolt checkout succeeds but the user stays free
Bolt will happily build a success page that says the payment went through. Stripe does not update your users table. Something on the server has to, and it has to use the event Stripe actually sends.
Why this happens
- The success page updates the plan from the browser. Anyone can open that URL.
- The webhook ignores test-mode events, so your monitor and your own test purchases never upgrade the user.
- The handler looks up the user by email, and the Checkout Session has no email in the place you read.
What ShipWatch looks for
- ShipWatch finishes the test checkout, then reloads the workspace.
- Locked copy after a completed checkout is reported as a webhook failure, in plain English.
Prompt to paste
The test checkout finishes and the account stays on the free plan. Move the upgrade into the checkout.session.completed webhook. Do not mark the user paid from the success page. Return 200 only after the database write.