Why your WooCommerce store fails Core Web Vitals (and what actually fixes it)
Four causes account for most WooCommerce performance failures. Three of them are fixable in an afternoon, and the fourth is the one everybody avoids.
Engineering·2 May 2026·6 min read
We audit a lot of WooCommerce stores. The score is usually somewhere in the fifties on mobile, the owner has already installed two caching plugins, and nothing has moved.
The diagnosis is nearly always one of four things.
1. The hero image is unsized and unoptimised
It is the largest contentful paint by definition, it is frequently a 1.2MB JPEG scaled down in CSS, and it has no width and height attributes so it shifts the layout when it lands.
Converting to WebP or AVIF, serving per-breakpoint sizes and declaring intrinsic dimensions typically takes a second off LCP and removes most of the CLS in one change.
2. Every plugin loads on every page
A contact form plugin has no reason to load its CSS and JavaScript on a product listing. Neither does a slider used only on the homepage.
Conditional dequeuing per template is unglamorous work with a disproportionate payoff, often a third of total page weight.
3. The database is carrying a decade of revisions
Post revisions, expired transients and orphaned meta rows do not slow a page directly. They slow every query that scans them, which is most of them.
Cleanup is safe, scriptable and repeatable. It should run on a schedule rather than as an emergency.
4. Third-party scripts nobody will remove
This is the one that stalls audits. A chat widget, two analytics tags, a heatmap tool and a remarketing pixel between them can add hundreds of milliseconds to interaction latency.
No plugin should remove these automatically, because the decision is commercial rather than technical. What a tool can do is measure the cost of each one precisely, so the conversation happens with a number attached.
Performance work is not mysterious. It is a short list of well-understood causes, ranked by measured impact, applied in order, and then measured again.