Guide Ecommerce & WooCommerce

How to fix a WooCommerce checkout that fails

A broken checkout loses money every hour it stays broken, so work through the common causes in order rather than guessing.

Updated 9 min read Intermediate

Every hour a checkout is broken is an hour of lost orders that will never be recovered, so treat this as urgent troubleshooting rather than something to fit in around other work. The good news is that a small number of causes account for most checkout failures, and they are worth checking in a specific order rather than at random.

Check these first, before anything more complicated

CheckWhy it is first
SSL certificate valid and not expiredPayment providers refuse to load embedded fields on a broken certificate, and browsers block payment forms on plain HTTP.
Payment gateway in live mode, with live keysThe single most common "checkout takes payment but no money arrives" cause is a gateway quietly still in test mode.
A caching plugin serving stale cart or checkout pagesCached checkout pages show the wrong basket, missing totals, or a session that belongs to someone else.
A recently updated plugin or themeCheckout depends on JavaScript and hooks that a badly-behaved update can silently break.

Cart and checkout pages must never be cached

This is the most common cause of checkout problems on WooCommerce stores and deserves its own explanation. Cart, checkout and my-account pages are session-specific — the content is different for every visitor and changes every time they add something to their basket. A full-page cache does not know that, and if it is not explicitly told to exclude these pages, it will serve one visitor's cached cart to the next visitor who loads the page.

WooCommerce sets a cart cookie that tells well-behaved caching plugins to leave a page alone, but "well-behaved" is doing real work in that sentence — many caching plugins and CDN-level caching only respect that cookie when it has been specifically configured to. The full explanation and the exact pages to exclude are in how to stop caching breaking your cart. If checkout symptoms include customers seeing someone else's basket, a total that never updates, or being logged into somebody else's account, start there before anything else.

Payment gateway symptoms

  • Checkout hangs on "processing" and never completes. Usually a JavaScript error stopping the gateway's script from running — check your browser console for errors, and check whether a recently added plugin (particularly anything touching page speed, minification or "combine JS files") is stripping something the gateway needs.
  • Card is declined every time, including cards that should work. Check the gateway is genuinely in live mode with live keys, not test keys against a live checkout or vice versa. See setting up Stripe for the test-to-live sequence.
  • Order completes in WooCommerce but no payment reaches the provider's dashboard. This points at test mode being left on somewhere, producing orders that look successful without moving any money.
  • Checkout works for you but not for customers. Test from a private browser window, a different device, or mobile data — your own browser may be logged in, cached, or otherwise unrepresentative of a first-time visitor.

Plugin and theme conflicts

If checkout broke immediately after updating something, that update is the first suspect. Deactivate recently changed plugins one at a time — starting with anything related to caching, minification, security or page builders, since those are the categories most likely to interfere with checkout scripts — and retest after each one. Switching to a default WordPress theme temporarily narrows down whether the theme itself is the cause.

Test changes on a copy of the store, not the live checkout

Disabling plugins to troubleshoot means the live store is partially broken while you work, which is its own cost. A staging copy lets you find the cause without taking the real checkout further out of service while you investigate.

Server-level causes

  • PHP memory or execution time limits. A checkout that times out partway through, particularly on stores with many plugins or a heavy theme, can be hitting a resource limit rather than failing outright. Check your account's PHP settings in your control panel.
  • A database error at the point of order creation. Look at your site's error log for anything logged at the exact time a customer reports a failure — this is often the fastest way to find the real cause rather than guessing from symptoms alone.
  • An expired or misconfigured SSL certificate. Confirm the padlock shows correctly on the checkout page specifically, not just the homepage — mixed content on one page can break a form without affecting the rest of the site.

If checkout works but customers still leave

Not every lost sale is a technical failure. If the checkout functions correctly but people are abandoning it partway through, that is a different problem with different causes — see why people leave your checkout for the non-technical side of this.

Keep a record of what you find

When you do track down a checkout fault, note what caused it and how you fixed it somewhere you will actually find again. Checkout problems have a habit of recurring in slightly different forms — a different plugin causing the same JavaScript conflict, a different setting left in test mode — and a short note saves real time the second time it happens.

Related reading