Notes · 2026-10-17

Why your vibe-coded app's checkout breaks after launch

The preview is a real checkout. It is not the checkout your customers hit. Launch is the moment the keys, the URL, and the price id stop matching.

The preview is a different environment

Lovable, Bolt, v0, Replit, and a Cursor session on your laptop each have a place where the last click worked. That place has its own URL and, usually, its own copy of the Stripe key. Publishing copies the code more reliably than it copies the secrets.

So the first production click creates no Checkout Session, or it creates one for a test-mode price. The button looks the same as the one you tried an hour ago. The Stripe error is in a log you are not watching.

The price id is the bug you cannot see

A price id is not a label. It exists in one mode of one Stripe account. Generated code treats it as a string that worked once. Live mode then says the price does not exist, and the UI turns that into a spinner or a silent return to the same page.

Open the session in Stripe when one exists. Read the mode and the price. If no session exists, the request never reached Stripe, which is a route or an env var, not a Stripe outage.

The redirect can die after a successful session

A Checkout Session id in the Dashboard means Stripe did its part. The browser still has to follow the redirect to checkout.stripe.com. A Content-Security-Policy of form-action 'self' blocks that 303. The customer stays on your site. The unpaid session sits in Stripe until it expires.

The same shape happens when a client-side router intercepts the form. The network panel shows the session response. The address bar never leaves your domain.

The webhook is aimed at yesterday's host

Payment can succeed and the app can still do nothing, because the endpoint is the preview URL or the signing secret belongs to another endpoint. Test mode makes this worse: the test endpoint works, the live endpoint was never created, and you only tried a 4242 card.

Read the delivery on the live event. The URL and the response code tell you whether Stripe is calling you. The signature guide walks the usual fixes.

What to check on the day you launch

Use a private window on the domain in the ad, not the preview tab. Create one live session for the smallest real price, or a test session against the live host if you are not ready to charge. Confirm the price, pay or cancel, and confirm the webhook delivery is a 2xx.

Then leave a check running. A homepage ping will not do this job. A funnel replay that stops on the payment page will notice when the next publish deletes the route.

Written by LitTech LLC, the company that operates FunnelWatch.

Related