WhoopsBot

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