CheckoutAlarmWatch my app free

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

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

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.

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

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

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

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

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

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 free

Docs checked on Oct 19, 2026.