00 / guide
Stripe Checkout success URL not working
A customer pays on Stripe Checkout, then lands on a blank page, an error, or the wrong place. Or they never land at all. The fix has two parts: get the success_url right, and stop counting on the redirect to give people what they paid for. Stripe: fulfill orders
01 / check the success URL
1
Use the exact placeholder
Add {CHECKOUT_SESSION_ID} to your success_url when you create the session, for example https://yoursite.com/success?session_id={CHECKOUT_SESSION_ID}. Type it exactly like that, braces included. Stripe swaps in the real ID when it sends the customer back. Don't put an ID there yourself. Stripe: modify the success URL
2
Use your live address
Make sure the URL points at your live site, not localhost or an old preview. Open it in a private window to see that the page loads without a login.
3
Look up the session on the server
On the success page, read session_id from the URL and fetch that Checkout Session on your server to show the order. Your secret key stays on the server. Stripe: create the success page
02 / don't rely on the redirect
1
Some customers never reach the page
Stripe says you can't rely on the success page alone, because customers aren't sure to visit it. Someone can pay and lose their connection before it loads. Stripe: webhooks are required for fulfillment
2
Give access from the webhook
Listen for checkout.session.completed and, for slower payment methods, checkout.session.async_payment_succeeded. For subscriptions, Stripe says webhook fulfillment is required. Stripe: create a payment event handler
3
Make it safe to run twice
Run the same fulfill function from the webhook and from the success page. It may run more than once for one session, even at the same time, so record what you've done and skip repeats. Check payment_status before you give access. Stripe: create a fulfillment function
4
Answer the webhook fast
With a webhook endpoint and a success_url, Checkout waits up to 10 seconds for your server to answer checkout.session.completed before it redirects. A slow handler means a slow success page. Stripe: configure a landing page URL
03 / where CheckoutAlarm fits
CheckoutAlarm's page check won't see a broken success page, because it doesn't sign up or pay in phase 1. With a read-only Stripe key, its Stripe check emails you when webhook events are not delivered, which is the part that gives customers access.
CheckoutAlarm is new. It only checks sites you prove you own. How to verify
Watch my app free04 / sources
Docs checked on Oct 19, 2026.