xSpeed Cache is officially live! Get 50% OFF during Launch Week — Lifetime starts at just $79Lifetime from $79 — 50% OFF, Launch Week! See Plans →

See Plans →
xSpeed Hub Pricing Docs Blog Scan
Appearance
Get Plugin
All articles
WooCommerceCheckoutConversionsCachingPerformanceWordPressfix:cache-exclusions

How to Optimize Your WooCommerce Checkout Page in 2026

Abdur Rahman Emon Updated Oct 9, 2026 16 min read
Speed up WooCommerce checkout, with the WooCommerce logo, xSpeed cover

Updated October 2026

Your WooCommerce checkout page is the last screen between a shopper and their money, and it is the screen most likely to lose them. 70.22% of carts are abandoned before payment, an average across 50 separate studies in Baymard Institute’s running tally, read 9 October 2026. That page carries its own date, “Last updated: September 22, 2025”, so treat it as a stable industry baseline rather than this quarter’s reading.

The number most people stop at is the least useful part of it. Baymard’s 2026 study of why people abandon puts “just browsing / not ready to buy” at 42%, the single largest answer, and nothing on this page will recover those shoppers. The rest is addressable, and that is what this guide is about.

What this guide fixes, and what it cannot

Share of abandonmentCauseThis guide
42%Just browsing, not ready to buyNothing will fix it
The restCosts, delivery, trust, forced accounts, speedSpeed and friction, below

Optimising a WooCommerce checkout page is really two jobs that pull in opposite directions. The checkout itself must stay dynamic. It can never be cached, while everything a shopper touches on the way there should be as close to instant as possible. Get that balance wrong in either direction and you either break the cart or crawl toward it.

Here’s how to do both.

Quick summary: what to cache and what to leave alone

If you want to…Do thisWhy it is the right call
Keep carts and totals correctLeave /cart/, /checkout/ and /my-account/ out of the page cacheEach one differs per shopper, and often per minute
Make the road to checkout fastCache the storefront hardMost of a session happens before checkout loads
Speed up the pages you cannot cacheTurn on object cachingCheckout still runs PHP on every single request
Find out whether any of it workedMeasure from outside your own serverA signed-in browser is served uncached pages
Catch a leak before a customer doesCheck what an anonymous request receivesThis failure is invisible while you are logged in

Why shoppers abandon checkout

Cart abandonment is rarely one problem, and the ranking matters more than the list. Setting aside the 42% who were only browsing, Baymard’s 2026 quantitative study distributes the remaining reasons like this:

Reason givenShare of addressable abandonmentCan a store fix it?
Extra costs too high: shipping, tax, fees40%Yes, by revealing them earlier
Delivery was too slow20%Partly, and not on this page
Did not trust the site with card details19%Yes, with placement and signals
The site wanted an account created18%Yes, guest checkout

Read from Baymard’s abandonment-rate list on 9 October 2026. Two things follow that the usual summary of this data hides.

Extra costs are the biggest addressable reason, not the biggest reason. Cited as “the number one cause of cart abandonment” it is wrong; cited as the largest share of the abandonment you can actually do something about, it is right and still the thing to fix first.

Only one of the four is a performance problem, and it is not the obvious one. Trust is partly a speed problem: a checkout that stalls, shifts under a thumb or shows a spinner that never resolves reads as broken, and a shopper who thinks a page is broken does not type a card number into it. Separately, Baymard puts the share abandoning over a “too long / complicated checkout process” at 17%, which is a form-design problem with a measurable target, below.

Start with speed, then the form

This guide covers speed first, because it silently affects every other item on that list. A shopper who is already impatient has less tolerance for a confusing form.

Why your checkout page must never be cached

This is the part that trips up most WooCommerce sites, and it’s worth being precise about.

Page caching works by saving a finished HTML page and serving that same copy to everyone who asks for it. That is exactly what you want for a product page. It is exactly what you do not want for checkout, because a checkout page is different for every visitor and often different for the same visitor minute to minute. It carries:

  • The contents and totals of that shopper’s cart
  • Their session and login state
  • Shipping and tax calculated for their address
  • Security nonces that WooCommerce generates per-user and expires quickly

Serve a cached copy of that and the failures are ugly: shoppers see someone else’s cart, totals go stale, coupons appear applied when they aren’t, and expired nonces cause payment submissions to fail outright. These bugs are also intermittent, which makes them miserable to diagnose, the site looks fine when you test it while logged in.

If you have ever seen a name or a cart appear on a page that anyone can load, that is this failure in its most alarming form, and our guide to a logged-out visitor seeing someone else’s name walks through the two commands that confirm it and the seven documented routes that cause it.

The same reasoning applies to three pages, and the reason differs slightly in each case.

PageWhy a shared copy breaks it
/checkout/Per-user nonces expire, and a stale one fails the payment submission
/cart/Totals, coupons and shipping are calculated for one shopper only
/my-account/Orders, addresses and downloads belong to one signed-in person

xSpeed Cache handles this automatically, and it is ours: we build it at WPDeveloper alongside the storefront tooling. When WooCommerce is active, it detects it and excludes cart, checkout and my-account from page caching out of the box: no rules to write, nothing to remember. You get aggressive caching across the storefront without putting the transactional pages at risk. The WooCommerce use-case page lists the exclusions that ship on a fresh install.

If you run additional dynamic pages that xSpeed can’t infer: a custom order-tracking page, a members-only area, a booking form. Add them yourself under Exclude URLs, or exclude by cookie under Exclude Cookies for anything driven by login state. Our notes on excluding pages, URLs and cookies cover the syntax.

Speed up everything around the checkout

Since the checkout page itself stays uncached, the performance work happens everywhere else. That is not a consolation prize: by the time a shopper reaches checkout they have usually loaded a homepage, a category page, two or three product pages and a cart. Those pages decide whether they arrive at all, and in what mood.

Cache the storefront aggressively

Page, mobile and browser caching serve your product and category pages as static files before PHP and WordPress load. xSpeed Cache delivers cache hits in the 5–15 ms range, compared with the hundreds of milliseconds a full WordPress render typically takes. That difference compounds across a browsing session.

Set expectations correctly before you measure, though. Caching moves server response time and leaves a great deal of the page alone: across 958 sites we scanned, caching cut median TTFB by 73% and did not move LCP at all. If your storefront is slow because of image weight or third-party scripts, the cache will not rescue it, and why caching did not fix your slow site explains where the rest of the time goes.

Turn on object caching. This matters more for WooCommerce than most sites

WooCommerce is database-heavy. Product attributes, variations, stock levels, cart contents and session data all mean repeated queries, and many of them repeat identically within a single page load. Object caching keeps those results in memory instead of asking the database again.

This is the single most underrated setting for a WooCommerce store, precisely because it also speeds up the pages you can’t page-cache. Your checkout page still runs PHP on every request, object caching makes that PHP work less. If you are setting Redis up for the first time, our Redis object caching guide covers the two shipped defaults that take a store down when Redis restarts, and the Redis and Memcached documentation covers the rest.

Cut the weight of what loads

  • Minify and combine CSS/JS/HTML: fewer, smaller requests.
  • Lazy load images so a long category page doesn’t fetch forty product shots before the first one is visible.
  • GZIP compression to shrink what crosses the network.
  • Cloudflare integration so your static assets are served from a location near the shopper. The zone connection, authentication and auto-purge are in the free plugin; Cloudflare APO, cache level and browser cache TTL are the Pro parts, per Free vs Pro read 9 October 2026.

On Pro, Critical CSS and Remove Unused CSS are especially effective on WooCommerce stores, which tend to accumulate stylesheets from the theme, the payment gateways and every extension. Image conversion to WebP and AVIF cuts product-image weight further, which is usually the single largest payload on a storefront. Free vs Pro, linked above, records which tier every feature ships in.

Audit what’s actually loading on checkout

Many WooCommerce plugins enqueue their scripts on every page, including checkout, whether or not they’re needed there. A slider plugin, a review widget and a marketing pixel can each add weight to the one page that has no cache to hide behind. Deactivate anything you’re not using, and check what remains.

Reduce friction in the checkout flow itself

No amount of caching will rescue a checkout that asks too much. The design decisions matter just as much:

  • Offer guest checkout. Let people buy without registering, and offer account creation after the purchase, when they’ve already committed.
  • Show total costs early. Extra costs revealed at the final step are the largest addressable cause of abandonment at 40%, as above. Put shipping and tax on the cart page, or earlier.
  • Ask only for what you need, and know the benchmark. Baymard’s checkout benchmark puts the average US checkout at 23.48 form elements displayed by default, or 14.88 counting only the fields, against an ideal flow of 12-14 elements (7-8 fields). Its own conclusion is that most checkouts can be cut by 20-60% without losing anything the business uses. Count the elements on your own checkout before you argue about which to remove; if you do not act on a field’s data, do not collect it.
  • Choose one page or multiple deliberately. A single-page checkout means fewer clicks and less waiting. A multi-step flow can feel lighter for long forms if you show clear progress. Neither is automatically right, but a multi-step flow that exists only to capture more data will cost you sales.
  • Show trust signals where the doubt is. Security badges, return policy and support contact belong next to the payment field, not in the footer.

Count your form elements, then cut

This is the one checkout number a store can measure in five minutes and compare against an external benchmark, so it is worth doing before any redesign argument starts.

What to countYour storeUS averageBaymard’s ideal
Form elements shown by defaultcount them23.4812-14
Form fields onlycount them14.887-8
Steps before the payment fieldcount them—as few as hold the data you use

Open your checkout in a private window and count every element a shopper sees before they can pay: inputs, selects, checkboxes, radio groups. Billing and shipping address blocks are usually where the count runs away, because a theme or an extension adds a field nobody asked for and nobody ever removes. Baymard’s benchmark of 60 leading ecommerce sites found the average site still has 39 distinct areas it could improve at checkout, and those are sites that have already run optimisation projects.

Two cautions on using this number. It counts elements, not difficulty: four well-grouped fields beat two badly labelled ones, and the benchmark cannot see labelling. And it is a US average, so a store selling into markets with longer address formats will sit above it for reasons that are not a defect.

Measure, then change one thing at a time

Optimisation without measurement is guesswork. Establish a baseline before you touch anything, then change one variable at a time so you know what caused the result.

Check the storefront from outside

Start from outside your own server. The free xSpeed Scan needs no account, reads what a visitor’s browser actually receives, and reports the cache evidence in the live response alongside the measured time to first byte. That outside view matters more on a store than anywhere else, because a signed-in browser is served uncached pages and will tell you the storefront is slow when it is not.

If you would rather check by hand, how to check whether WordPress caching is actually working covers the response headers that prove a cache hit and the six that prove nothing.

Track it over time, then test the flow

For longer-term tracking, xSpeed Pro records PageSpeed Insights history per site and real-user Core Web Vitals. LCP, INP, CLS, FCP and TTFB, from actual visitors rather than lab tests. Real-user data matters here: your checkout page’s true performance depends on the devices and connections your customers actually have.

For the flow itself, A/B test. Run your current checkout against one modified version, send live traffic to both, and let completed orders decide. Test one change at a time: guest checkout on or off, three fields versus six, or you won’t know which change moved the number.

Common mistakes stores make

MistakeWhat it costsThe fix
Testing only while signed inEvery request bypasses the cache, so the storefront looks slower than it isTest in a private window, or from outside the server
Caching the cart to make it fastShared totals, stale coupons, failed paymentsExclude it, and speed up everything around it
Excluding pages in the plugin onlyA warm page is served before PHP runs, so the rule never firesConfirm the exclusion reaches the web server itself
Leaving a removed plugin’s drop-in behindTwo caches answer, and stale copies appear at randomCheck which plugin the live response names
Chasing a Lighthouse score with caching aloneServer time drops, LCP does not followFix image weight and third-party scripts too

Quick checklist

  • cart, checkout and my-account excluded from page caching
  • Any other dynamic pages added to Exclude URLs
  • Object caching enabled
  • Page, mobile and browser caching on across the storefront
  • CSS/JS minified; images lazy-loaded and served as WebP/AVIF
  • Unused plugins deactivated; leftover scripts off the checkout page
  • Guest checkout available
  • Shipping and taxes visible before the final step
  • Every checkout field justified
  • Baseline recorded before changes; one variable tested at a time

Running this across more than one store

One store is a settings screen. Fifteen client stores is a policy question, because the exclusion list that is right for a membership site is not the one a WooCommerce store needs, and a wrong list goes unnoticed until a customer reports someone else’s cart.

xSpeed Hub is ours as well, and it applies one cache policy across every connected site rather than asking you to repeat yourself. If you are moving a store off another plugin, the migration documentation covers what a switch carries and what it leaves behind.

The takeaway

A fast WooCommerce store isn’t one where every page is cached, it’s one where the right pages are cached and the transactional pages are deliberately left alone. Cache the storefront hard, keep cart and checkout dynamic, cut the weight that loads everywhere, and remove every field and step that isn’t earning its place.

xSpeed Cache does the risky part for you: WooCommerce is detected automatically, and cart, checkout and my-account stay out of the cache without any configuration. That leaves you free to optimise everything else.

What to do this week:

  1. Load your own checkout in a private window and confirm it is not being served from cache.
  2. Run the two-request check on a product page, so you know the storefront is.
  3. Turn object caching on, and measure the checkout page before and after.
  4. Count the form elements on your checkout. If the number is above 14, you are above Baymard’s ideal band and the first cut is usually free.
  5. Cut one field from the checkout form, and one script that does not need to be there.
  6. Scan your storefront with xSpeed Scan, then read Free vs Pro to see which of the remaining fixes you already have.

Frequently Asked Questions

I excluded /checkout/ in the plugin and a shopper still saw someone else’s cart. How?

Because a warm cached page is served before PHP runs, so a rule held only inside WordPress never fires. Confirm the exclusion reaches the layer that answers first, then re-test with two anonymous requests rather than in your own signed-in browser. Our guide to a logged-out visitor seeing someone else’s name has the two commands that prove it.

My checkout is slow and I have caching turned on. Why is nothing happening?

Because checkout is the one page that is deliberately never cached, so page caching cannot touch it. What does help is object caching, which cuts the database work the PHP still has to do on every request.

I turned on object caching and the checkout got slower. Is that possible?

Yes, if the object cache is remote and the round trip is slow, or if it is full and evicting constantly. Measure before and after rather than assuming, and check the two shipped defaults named in our Redis object caching guide.

My storefront looks fast to me but customers say it is slow. Who is right?

They are, usually. A signed-in browser bypasses the cache on every request, so the one person who looks at the store most often is served the slowest version of it. Measure from outside your own server, not in the browser you administer the store in.

Should I cache the cart page if I use a side-cart drawer?

No. The drawer reads the same per-shopper session as the cart page, so a shared copy breaks both. Exclude /cart/ and let the drawer fetch its contents dynamically.

How many fields should a WooCommerce checkout have?

Baymard’s ideal band is 12-14 form elements, or 7-8 counting only fields, against a US average of 23.48 elements. WooCommerce’s default billing block alone is close to the ideal band before you add anything, which is why most of the excess arrives from themes and extensions.

Does guest checkout really change anything?

On Baymard’s distribution, 18% of addressable abandonment is people who did not want to create an account. It is one of the cheapest changes on the list: offer the account after the purchase, when they have already committed.

Where should I put trust signals?

Next to the payment field, where the doubt is. 19% of addressable abandonment is shoppers who did not trust the site with their card details, and a badge in the footer is not where they are looking when they decide.

Can I cache my WooCommerce product and category pages aggressively?

Yes, and you should. They are the same for every visitor, they are most of a browsing session, and they decide whether a shopper reaches checkout at all. Only the transactional pages need to stay dynamic.

I added a custom order-tracking page and it started showing the wrong order. What happened?

It was cached, because xSpeed cannot infer that a custom page is per-shopper. Add it under Exclude URLs, or exclude by cookie if it is driven by login state.

Will fixing speed fix my abandonment rate?

Partly, and it is worth being honest about the ceiling. 42% of abandonment is people who were only browsing, and no page change recovers them. Speed works on the trust and the “too long” shares, and the pricing and delivery shares are business decisions rather than engineering ones.

How often should the exclusion list be reviewed?

Every time a plugin that touches the cart, checkout or account area is added or updated. That is the event that introduces a new dynamic URL, and nobody notices until a customer reports someone else’s cart.

Where to go next

New to the plugin? Setting up xSpeed Cache on WordPress walks through installation and the settings that matter first. Pricing starts at $29 a year with a 14-day money-back guarantee, and the free tier covers page, mobile, browser and object caching, minification, lazy load and GZIP.

Written by

Abdur Rahman Emon

Try xSpeed Cache

Make your site load in milliseconds.

One switch. Zero bloat. Always free to start.