How to Speed Up WooCommerce: Performance Guide
Before You Start: Measure Your Baseline
You cannot optimize what you do not measure. Before changing anything, test your store on three tools: Google PageSpeed Insights (scores your Core Web Vitals), GTmetrix (shows waterfall diagrams of every resource loaded), and WebPageTest (tests from different locations and connection speeds). Test your homepage, your highest-traffic product page, your shop/category page, and your cart page. Record the Largest Contentful Paint (LCP), Total Blocking Time (TBT), Cumulative Layout Shift (CLS), and Time to First Byte (TTFB) for each.
Google considers these scores "good": LCP under 2.5 seconds, TBT under 200 milliseconds, CLS under 0.1, and TTFB under 800 milliseconds. If your TTFB exceeds 800ms, start with hosting. If your LCP is slow but TTFB is fine, the problem is images or render-blocking resources. The waterfall diagram in GTmetrix shows exactly where the time goes.
Step-by-Step Optimization
Hosting determines your TTFB floor, and no other optimization can compensate for a slow server. If you are on shared hosting and your TTFB is 1 to 3 seconds, migrating to managed WordPress hosting (SiteGround, Cloudways, Kinsta) will drop it to 200 to 600ms, which is the single biggest speed gain you can make. Most managed hosts offer free migration for new customers. See our WooCommerce hosting guide for specific recommendations.
Page caching stores a pre-built HTML version of each page so the server does not have to execute PHP and query the database on every visit. This reduces page generation time from 500 to 2,000ms down to 10 to 50ms for cached pages. If your managed host includes server-level caching (Kinsta, WP Engine, Cloudways with Varnish), it is already active and you should not install a caching plugin on top of it. If your host does not provide caching, install LiteSpeed Cache (if your server runs LiteSpeed) or WP Super Cache (for Apache/Nginx servers). Critical configuration: exclude your cart page, checkout page, and my-account page from caching, because these pages show user-specific content that must not be served from cache.
WooCommerce makes dozens of database queries per page load to fetch product data, cart contents, session data, and widget content. Object caching stores the results of these queries in server memory (RAM) so repeated queries return instantly instead of hitting the database again. Redis is the standard choice. Most managed hosts offer Redis as an add-on ($0 to $10/month). Install the free Redis Object Cache plugin by Till Kruss, connect it to your Redis instance, and verify it is working in the plugin's dashboard. On a store with 500+ products, Redis object caching typically reduces page generation time by 40% to 60%.
Images are usually the largest files on any product page, accounting for 60% to 80% of total page weight. Install ShortPixel ($4.99/month for 5,000 images) or Imagify (free for 20MB/month, $5.99/month for 500MB) to automatically compress every image on upload. Use lossy compression at quality 80 to 85, which reduces file size by 60% to 80% with no visible quality difference on screens. Enable WebP format conversion so browsers that support WebP (all modern browsers) receive smaller files. Enable lazy loading so images below the visible area of the page do not load until the visitor scrolls to them. For product images, resize originals to a maximum of 1200px on the longest edge before uploading; larger files are unnecessary and waste bandwidth.
Over time, your WordPress database accumulates post revisions (every save creates a revision), expired transient cache entries, spam and trashed comments, orphaned postmeta rows from deleted products, and WooCommerce session data from abandoned carts. Install WP-Optimize (free) and run a one-time cleanup. Then schedule automated weekly cleanups. On a store that has been running for a year with 1,000+ products and 5,000+ orders, database cleanup can reduce database query time by 20% to 40%. Also limit post revisions by adding define('WP_POST_REVISIONS', 5) to your wp-config.php file, which keeps only the 5 most recent revisions per post instead of unlimited.
Each plugin loads its own CSS and JavaScript files, even on pages where they are not needed. A store with 15 plugins might load 20+ CSS files and 15+ JavaScript files on every page. Minify CSS and JavaScript (removes whitespace and comments) using your caching plugin's built-in minification feature or a dedicated plugin like Autoptimize (free). Defer non-critical JavaScript so it does not block page rendering. The biggest gains come from preventing plugins from loading assets on pages where they are not used. For example, a contact form plugin's CSS and JS should only load on your contact page, not on every product page. Plugins like Asset CleanUp and Perfmatters ($24.95/year) let you disable specific plugin assets on a per-page basis.
A Content Delivery Network serves your static files (images, CSS, JavaScript, fonts) from edge servers distributed globally, so a customer in London does not have to request files from a server in New York. Cloudflare's free tier provides a CDN, DDoS protection, and basic performance optimization. Enable it by changing your domain's nameservers to Cloudflare's. For stores with significant international traffic, the CDN alone can reduce load times by 30% to 50% for visitors far from your server. Kinsta includes Cloudflare Enterprise CDN on all plans, and Cloudways includes a Cloudflare CDN add-on.
Enable WooCommerce's High-Performance Order Storage (HPOS) under WooCommerce, then Settings, then Advanced, then Features. HPOS moves order data from the WordPress posts table to dedicated custom tables, which dramatically improves query performance for stores with thousands of orders. Disable WooCommerce features you do not use (marketing hub, geolocation, usage tracking) under WooCommerce, then Settings, then Advanced. Set the cart fragments to load on demand rather than on every page by using the Disable Cart Fragments plugin or your performance plugin's equivalent setting. Cart fragments are an AJAX request that WooCommerce fires on every page load to update the mini-cart, and disabling it on non-shop pages saves 200 to 400ms per page.
Expected Results
Following all eight steps, a typical WooCommerce store improves from 4 to 6 second load times and a PageSpeed score of 40 to 60, to 1 to 2 second load times and a score of 85 to 95+. The hosting and caching steps produce the biggest individual gains (often 2+ seconds each), while image optimization and asset cleanup each contribute 0.5 to 1 second. The cumulative effect is substantial.
Retest your store after each change, not just after all changes are complete. This lets you identify which optimizations had the most impact and catch any that introduced issues (aggressive minification sometimes breaks JavaScript functionality, and you want to catch that immediately).
