

WooCommerce checkout slow problems are not the same as a slow storefront. Most speed advice is for pages that can be cached, pushed through a CDN, and reduced to static files. Checkout cannot work that way. It needs a live session, a cart, current totals, and a payment provider responding over the network. Apply homepage tactics here and you may gain nothing, or interfere with the order flow.
Waterfall analysis of a woocommerce checkout slow page
Start with a measurement you can defend. Too much checkout advice begins with a score taken from the wrong page, then turns into a list of changes nobody can tie to the buying experience.
PageSpeed Insights and Lighthouse request the URL as a new anonymous visitor. There are no cookies, no session, and no cart. At /checkout/ WooCommerce therefore has little to render: usually an empty-cart notice or a redirect back to the cart. The tool scores that near-empty state and returns a number.
The number is valid. It just describes a different page from the checkout your customers complete.
What to check
The dependable method takes about five minutes and produces the waterfall that customers actually experience. Run it on the live site. Staging often has different caches, a smaller database, and gateways in test mode.
The final step is the commercial metric. It is also the one most audits omit.
These two metrics answer different questions:
Time to interactive
Time to order placed
AJAX round trips
Improve the first and the page feels responsive. Improve the second and you remove friction after the customer has decided to buy.
Every checkout view is a fresh PHP request. WordPress boots, WooCommerce restores the session, the cart is recalculated, and shipping and tax are evaluated. WooCommerce sets DONOTCACHEPAGE so the page is not served as static content. That makes a host’s page-cache hit rate irrelevant to checkout speed. Focus instead on the work inside the request: fewer plugins on the page, a persistent object cache for repeat queries, and sufficient PHP workers to avoid queues.
The classic checkout calls update_order_review whenever a field that could affect totals changes: country, state, postcode, shipping method, payment method, or coupon. Every call recalculates the cart, runs shipping and tax again, and rebuilds the order review. A few custom fields wired into that event can turn an address entry into six or eight recalculations. Audit the fields that trigger it and prevent custom fields from doing so without a reason. Custom checkout fields that hook into recalculation are a common hidden cause when shipping cost looks wrong at checkout or totals lag while the customer types an address.
Gateways add time in two places. On load, every active gateway can enqueue its own SDK, while express buttons often render inside an iframe that needs to resolve. On submit, authorization is an outbound request to the provider. Two or three enabled gateways can mean two or three SDKs on every checkout view. Keep only the gateways you offer and remove abandoned integrations. Do not defer or minify gateway scripts. The next section explains why.
Many plugins load assets across the whole site because it is simpler for the developer. That leaves sliders, review widgets, page-builder bundles, popups, and chat tools loading on a page that does not need them. Selective dequeuing on checkout can remove that overhead without changing the rest of the site. Start with these candidates:
Do not dequeue assets belonging to WooCommerce core, payment gateways, or shipping and tax integrations.
Order data keeps growing in the same tables checkout writes to. Under legacy storage, an order is a wp_posts row plus many wp_postmeta rows. A store with 50,000 orders can be searching metadata across millions of rows. Add abandoned sessions, expired transients, and oversized autoloaded options, and database work alone can slow checkout. The answer is housekeeping and an informed storage migration. See HPOS and order table performance for what dedicated order tables change and how to migrate safely.
Real-time carrier rates require an outbound HTTP request, and checkout waits for the carrier’s response. When the carrier slows down, checkout follows. A timeout can make the customer wait through its full duration, sometimes twice after a field change triggers another lookup. WooCommerce caches calculated rates per package, but the first lookup in a session is still live. Set an explicit low timeout in the carrier integration, retain a flat-rate fallback, and reduce the number of carriers queried together.
Address-based tax services have the same shape as carrier APIs: an outbound call, a wait, and totals that cannot be calculated until a response arrives. Tax lookups often run on every recalculation, so the effect compounds with cause 2. Check whether the provider plugin caches by address and cart hash, and whether it has a timeout with a sensible fallback. For a small number of jurisdictions with stable rates, WooCommerce's built-in tax tables avoid that network delay.
Checkout is usually the most PHP-intensive page in the store, so constrained hosting appears here first. Three limits matter: PHP worker count, which determines whether requests queue under load; a persistent object cache, which controls how often repeat queries reach the database; and WordPress cron running during page loads, which can attach scheduled jobs to an unlucky customer request. Move cron to a real system cron, enable object caching, and compare worker capacity with actual concurrency.
Many themes override form-checkout.php and the order-review template for styling. Some then add carousels, trust-badge sliders, upsells, or a full mega menu to a page whose main job is collecting payment. Each addition adds markup, CSS, and often JavaScript to the critical path. Keep the checkout template focused on the form, order review, and payment area. Trim decorative markup before you reach for broader woocommerce checkout optimization tactics that touch caching or asset bundling.
Nine causes of a slow WooCommerce checkout
| # | Cause | Typical symptom | Where to look |
|---|---|---|---|
| 1 | No caching possible | Slow first paint on every visit | TTFB in the devtools waterfall |
| 2 | AJAX recalculation | Spinner on the totals after every field | Repeated update_order_review calls |
| 3 | Gateway latency | Long wait after Place order | Gateway SDK requests and submit timing |
| 4 | Plugin bloat | Dozens of unrelated assets | Network tab filtered to JS and CSS |
| 5 | Database queries | Slow with a large order history | Query monitor, slow query log |
| 6 | Live shipping rates | Freeze when the address changes | Outbound carrier requests, timeouts |
| 7 | External tax service | Freeze on every recalculation | Provider plugin logs and cache settings |
| 8 | Server limits | Slow only at peak hours | PHP workers, object cache, cron |
| 9 | Theme templates | Heavy checkout, light product pages | Template overrides in the theme |
This is where well-intentioned performance work turns into lost orders. These four changes look routine, but they are unsafe on checkout.
Do Not Cache the Checkout
Do Not Minify or Defer Payment Gateway Scripts
Do Not Lazy Load the Place Order Button Area
Do Not Combine CSS Blindly on Checkout
Cache exclusion is layered
Checkout rarely becomes unusable overnight. It gets slower one plugin update, one additional gateway, and another block of orders at a time. Each change can seem too small to matter. Months later, the first useful signal is often a customer complaint.
WooCommerce checkout speed monitoring over time
One measurement is a snapshot, not a trend. Record the same four values on a fixed schedule and gradual drift becomes visible before customers report it:
The fourth point turns a slow month into a starting point for diagnosis. When duration jumps between two runs, the intervening plugin, theme, or gateway change is the first thing to inspect. Run the same checks you would use when shipping cost is wrong at checkout, because misconfigured zones and carrier timeouts often show up as checkout lag first.
A weekly manual run is usually the first maintenance task to disappear. ShopMonitor runs the checkout in a real browser on a schedule and records each run’s duration. That makes gradual slowdown visible in your own data rather than in a support ticket. It is a checkout monitor, not a performance optimizer. It will not repair a slow gateway, but it can show when the browser checkout has slowed down. It verifies the browser checkout and order-received path, not whether an email arrived in an inbox. Inbox delivery is a separate check. To run the same process manually first, see how to test your checkout.
ShopMonitor runs browser checkout and form tests every day and alerts you when something breaks. No code changes. No plugins. Setup in 5 minutes.
No credit card required.

About the author
Written by Winning Solutions, the team behind ShopMonitor. ShopMonitor uses scheduled browser tests to make checkout slowdowns visible over time, including problems an empty-cart PageSpeed test cannot reveal.