Fixes · Updated 2026-10-21
Stripe or Paddle checkout button not working
Why the pay button does nothing, and the separate checks for Stripe Checkout and Paddle Billing.
First, see whether the click does anything
Open devtools before you click. A button that never fires a request and never opens an overlay has a JavaScript error above it, or the handler is not attached. A button that requests your server and then stops has a failed API call. Read that response. “Checkout not working” covers both, and the fix is different.
Stripe Checkout
The browser must only see the publishable key (pk_test_ or pk_live_). The secret key (sk_) creates the Checkout Session on the server. If the session route returns 500, the button has nothing to redirect to. Log the Stripe error message. It usually names the missing price, the wrong mode, or a key from the other environment.
success_url and cancel_url have to be absolute URLs. After the session is created, redirect with the session URL Stripe returns. Don't rebuild that URL yourself.
Test mode and live mode are different accounts for keys and prices. A price_ id from test mode will not open with a live key.
Paddle Billing
Paddle.js has to load from https://cdn.paddle.com/paddle/v2/paddle.js. A Content-Security-Policy that doesn't allow that script, or a blocker, leaves Paddle undefined and the click throws.
Call Paddle.Environment.set("sandbox") before Paddle.Initialize when you are using a sandbox client-side token. A sandbox token initialized as production, or the reverse, fails. Initialize once with the client-side token (it is public). Then Paddle.Checkout.open with a price id from that same environment.
The price must be a Paddle Billing price id (pri_…). A product id will not open checkout. If the seller's domain is not approved, production checkout will not complete even when the overlay opens. Sandbox is the place to prove the button before that review.
Pass your user id in customData if the webhook has to know who paid. The webhook, not the success URL, is what should change the plan. Verify the Paddle-Signature header before you trust the body.
Check the live page before you send people there
The free launch check opens the URL and reports status, console errors, broken images, missing headers, and obvious secrets.
Run a free launch check