← Guides

Diagnosis guide

Checkout Not Working: How to Trace the Failing Payment Step

When checkout breaks, the cause is almost always one of three points: the payment form fails to load or submit (front-end/JavaScript), the payment is declined or errors at the gateway (Stripe/PayPal config or keys), or the payment succeeds but no order is created (a broken or unreachable webhook). Start by making one small test payment yourself and watching where it stops. If money is taken but the order never appears, look at your payment provider's webhook delivery log first — that single view usually names the failing step.

The symptom

Customers report they can't complete a purchase, or you notice orders drying up while traffic stays normal. It shows up in a few shapes: the pay button spins forever or does nothing, card details are rejected with a vague message, the page errors out after "Place order", or — the most costly variant — the customer is charged but no order lands in your admin and no confirmation email goes out. Each shape points at a different layer, so the first job is to reproduce it and note exactly where the flow dies.

What it usually means

A silent, non-submitting button is usually a front-end break — a JavaScript error, a failed asset, or a plugin/theme conflict stopping the checkout script. A clear decline or gateway error ("Your card was declined", "Invalid API Key") points at the payment provider: wrong or test-vs-live keys, an expired credential, or a currency/country the account can't process. Payment taken but no order created almost always means the webhook from the gateway back to your site is failing — unreachable URL, wrong signing secret, or a 500 error while the order is being written. These three buckets cover the large majority of checkout failures.

What we check first

We reproduce a real transaction and follow it layer by layer. First the browser console and Network tab during checkout (F12) — a red 500 on the AJAX/submit request, or a blocked script, names a front-end or server break immediately. Next the gateway's own logs: in Stripe, Developers > Events shows whether a PaymentIntent was even created and its status (succeeded, requires_payment_method, canceled); Developers > Webhooks shows delivery attempts with the exact HTTP response your site returned — a wall of 500 or 404 with "signature verification failed" is the smoking gun. On the store side we open the platform log: WooCommerce > Status > Logs (files under wp-content/uploads/wc-logs/), plus the server's PHP error log for fatal errors during order creation. We confirm keys are live-mode and match the webhook signing secret (whsec_...), and that the webhook endpoint URL returns 200 to a test event, not a redirect or a login wall.

What you can safely check yourself

Place one small real test order and watch what happens — this alone tells you which of the three buckets you're in. Open the browser console (F12 > Console) during checkout and note any red errors. Log into your payment provider dashboard and check whether the charge/PaymentIntent actually appears and its status; if the money was taken, look for the matching order in your admin. In Stripe, open Developers > Webhooks and see whether recent deliveries show green (200) or red — a red endpoint with retries is a strong, self-evident signal you can hand straight to whoever fixes it.

What NOT to touch

Don't rotate, regenerate or delete API keys or the webhook signing secret while diagnosing — you can turn a recoverable issue into a fully dead integration, and any in-flight payments lose their link to orders. Don't switch the store or gateway between test and live mode on production to "see if it helps". Don't bulk-update, deactivate or reinstall payment plugins on the live site, and don't edit checkout template or functions files directly. If customers have been charged without orders, do not issue blind refunds before the payments are reconciled — capture the list of affected charges first.

What a 30-minute diagnosis can determine

In a focused 30-minute session we can normally pin the failing layer and name the concrete cause: a specific JavaScript/plugin conflict, a mismatched or test-mode key, a gateway rejecting a currency or country, or a webhook failing with a signature or 500 error. We can tell you whether payments are being taken (and how many orders are affected and recoverable), whether it's a configuration fix or a code-level bug, and what the safe next step is. Often the fix itself — correcting a webhook URL, aligning the signing secret, or resolving a plugin conflict — fits inside that window or the one just after.

When it becomes a bigger job

It grows beyond a quick fix when the checkout has been customised at code level (bespoke payment flow, custom order-creation logic) that now throws fatal errors, when a recent platform or plugin update changed the gateway integration, or when many customers were charged without orders and the payments must be reconciled and orders rebuilt or refunded cleanly. Multi-gateway setups (Stripe plus PayPal plus an ecommerce plugin) and subscription or split-payment logic also take longer, because each path has to be traced and tested independently before any change ships.

Quick checklist

  • Place one small real test order and note exactly where it stops
  • Open the browser console (F12) during checkout and record any red errors
  • Confirm in your gateway dashboard whether the payment/PaymentIntent was actually created and its status
  • Check the webhook delivery log (e.g. Stripe > Developers > Webhooks) for red/failed deliveries and their HTTP response
  • Verify keys are live-mode, not test-mode, and match the environment
  • Read the store logs (WooCommerce > Status > Logs) and the server PHP error log for fatal errors
  • Check whether a recent plugin, theme or platform update coincided with the breakage
  • List any customers charged without an order before touching refunds

Frequently asked questions

Customers are charged but no order is created — why?

Almost always a failing webhook: the payment succeeds at the gateway but the confirmation callback to your site is unreachable, has the wrong signing secret, or errors (500) while writing the order. Check the gateway's webhook delivery log first.

Why is my checkout button not working or not responding?

Usually a front-end break — a JavaScript error or a plugin/theme conflict stopping the checkout script from submitting. Open the browser console (F12) during checkout; a red error there names the culprit.

Why does Stripe say 'Invalid API Key' or nothing happens at payment?

Typically test-mode keys used on a live site (or vice versa), an expired/rotated key, or a mismatched webhook signing secret. Confirm the keys' mode and that they match the current environment.

How do I know if it's the payment provider or my website?

Check the gateway dashboard: if the charge appears and succeeds there but no order exists on your site, it's your site (usually the webhook). If the charge never appears or is declined, it's the gateway configuration.

Should I regenerate my API keys to fix checkout?

No — not while diagnosing. Rotating keys or the webhook secret can break a recoverable integration entirely. Identify the failing step first; change credentials only when you know that's the fix.

How long does it take to diagnose a broken checkout?

A focused 30-minute diagnosis is usually enough to identify the failing layer and the concrete cause, and to say whether it's a configuration fix or a code-level bug.

If your checkout is down or customers are being charged without orders, the priority is to trace the failing step safely before touching keys or refunds. HelpApp Pro can run that ordered diagnosis remotely, tell you exactly where the flow breaks, and confirm how many orders are affected — billed in 30-minute increments, no subscription, with a reply within 2 business hours. See our Ecommerce & checkout repair service to get started.

Besoin d'une intervention ciblée ?

Décrivez le blocage — devis sans engagement, ou rappel sous 2 h ouvrées. Supplément urgence possible (+29.98€).