What a Rebuild Saves on an Elementor WooCommerce Store: A Lab Test
By FlexPlat. November 5, 2026.
A simple rewrite cut largest contentful paint (LCP) by 3.1–3.8 s on a saved Elementor WooCommerce demo, but advanced cache plugin techniques came within 0.25 s of it. So in this lab test, slow loading alone did not justify a rebuild.
Basic optimization, the kind common free plugins offer, gained much less: 0.5–1.6 s. All of this comes from one demo, on a simulated phone, with imitated plugins and no real shoppers.
We make Flx, which renders WordPress pages in Node.js, so we had a reason to want the rewrite to win. It did win on most measures, but not by enough to change the advice below. LCP is the time until the largest piece of content appears.
Why we ran it
Our first WooCommerce speed test could not have shown a gain. We ran the Storefront theme through Flx with its markup, CSS and scripts kept, so the visitor received nearly the same page by a longer route. Page weight came out equal, and time to first byte was 150–260 ms slower.
That result only says pass-through has no speed gain. It says nothing about stores built with heavy page builders, or about what happens if the page itself is rewritten. So we asked a narrower question: how much could a rewrite save on a typical Elementor WooCommerce store, and how much of that could a cache plugin get for far less work?
How we tested
We compared four versions of the same three pages on one local server, so server and network differences played no part. No WordPress, Elementor or plugin was installed.
- Save the pages. We saved the home, shop and one product page of a public starter-template demo built with Elementor, WooCommerce and a popular lightweight theme, plus the files they load. We removed only the demo service's own preview code. We don't name the demo, because the pattern matters more than one vendor's template. We deleted our copy after the test.
- Build the versions.
- Original: the saved pages as they were.
- Basic cache: CSS combined and minified, scripts combined and deferred, as common free optimization plugins can do.
- Delayed cache: only the CSS rules the HTML uses, placed in the page, every script held until the first interaction, and the main image preloaded, as advanced optimization plugins can do.
- Tailwind: plain pages with the same products and image files, WooCommerce's scripts, the same analytics, and a simpler design.
- Measure. Lighthouse 12.6.1 on a phone profile, over HTTP/2 with outside network blocked. Simulated throttling (median of 5) is the main result, and DevTools throttling (median of 3) is a check on it.
- Add the cost of Flx. The Tailwind pages would be served through Flx, so we added the 150–260 ms we measured on Storefront to their LCP. It is an estimate from another site.
We set two rules before seeing results:
- A rewrite is worth pursuing if the original has LCP above 2.5 s or Total Blocking Time above 200 ms, and Tailwind plus 260 ms is at least 0.5 s sooner.
- A cache version is close if its LCP is within 0.5 s of Tailwind plus 260 ms on at least two of the three pages.
Results
The delayed cache version came within 0.25 s of the rewrite on all three pages, so by the rule we set beforehand it counts as close. Both cut LCP by about half or more against the original. Basic optimization did far less.
Simulated phone, median of 5 runs. Lower is better in every column except Score.
| Page | Version | Score | First paint (s) | LCP (s) | Weight (KB) | JavaScript (KB) | Requests | DOM elements |
|---|---|---|---|---|---|---|---|---|
| Home | Original | 65 | 3.10 | 6.35 | 1,077 | 349 | 102 | 848 |
| Home | Basic cache | 67 | 2.25 | 4.76 | 1,012 | 330 | 34 | 809 |
| Home | Delayed cache | 90 | 2.13 | 3.33 | 621 | 13 | 25 | 838 |
| Home | Tailwind + Flx | 94 | 1.10 | 3.21 | 625 | 152 | 29 | 256 |
| Shop | Original | 68 | 2.17 | 5.53 | 1,062 | 320 | 102 | 842 |
| Shop | Basic cache | 72 | 1.80 | 4.80 | 1,008 | 301 | 37 | 794 |
| Shop | Delayed cache | 99 | 1.66 | 1.96 | 635 | 13 | 28 | 827 |
| Shop | Tailwind + Flx | 99 | 1.09 | 1.72 | 347 | 152 | 19 | 251 |
| Product | Original | 75 | 2.40 | 5.63 | 986 | 383 | 102 | 687 |
| Product | Basic cache | 78 | 1.80 | 5.08 | 928 | 363 | 32 | 643 |
| Product | Delayed cache | 96 | 1.65 | 2.70 | 500 | 13 | 16 | 670 |
| Product | Tailwind + Flx | 97 | 1.13 | 2.51 | 385 | 176 | 21 | 174 |
For Tailwind + Flx, first paint and LCP include the worst-case 260 ms. Its Score and other columns are from the page without Flx.
The DevTools check agreed on two of three pages. There the delayed version beat Tailwind + Flx on home (5.00 s against 5.48 s) and product (1.77 s against 3.41 s), and lost on shop (3.57 s against 2.00 s). The original's shop result was unstable in that check (2.79, 2.98 and 6.21 s), so we would not rely on its median.
What caused the difference
The biggest cost on this demo is the CSS and JavaScript that load ahead of the content, not the time scripts spend running. The original home page has 45 render-blocking files, and its Total Blocking Time was already modest (65–193 ms across the pages).
Three findings support that:
- Combining files barely helped. Basic optimization cut requests by about two-thirds, but LCP improved only 0.5–1.6 s. The same bytes still have to arrive, and under DevTools throttling its bundled scripts raised blocking time to 562–683 ms.
- Removing them from the critical path helped a lot. The delayed version keeps nearly the same page, with 670–838 DOM elements, and still cut LCP to 1.96–3.33 s. So a large DOM was not what held this page back.
- The rewrite's clearest remaining lead is first paint. Even with 260 ms added, Tailwind + Flx paints about 1.1 s in, against 1.65–2.13 s for the delayed version. It also has about a third of the DOM, and no held-back scripts.
The gain is not specific to Elementor, and it does not come from JavaScript or Tailwind. These pages also carry cart, coupon, swatch and payment plugins plus the theme, and we did not separate their shares. A plain PHP template would likely perform about the same as our Tailwind pages.
Mistakes we made, and fixed
Our first results were wrong, and checking the screenshots and details is what caught it. Each fix changed the numbers, and the two rules above did not change.
| Mistake | Effect | Fix |
|---|---|---|
| Local server used HTTP/1.1 | Punished the original's 102 requests; gain looked like 4.5–4.9 s | Served every version over HTTP/2 |
| Tailwind cards lost their add-to-cart buttons | Favoured Tailwind | Kept WooCommerce's buttons |
| Our cleanup removed the variation dropdown | Favoured Tailwind | Kept the real dropdown |
| The download missed some image sizes | Original showed blank images | Saved every size the HTML offers |
| Tailwind picked the largest image file | Punished Tailwind (shop: 1,712 KB of images against 502 KB) | Copied each image's own src, srcset and sizes |
| Delayed scripts hid the product photo and home headline until a touch | Favoured the delayed version; LCP measured a paragraph on the product page | Made that content visible without scripts |
The lesson for anyone running this kind of test: a good score can mean the main content never appeared. Look at the page.
What this test cannot tell you
This is one demo in a lab, tested for loading only. Treat the numbers as a direction, not a promise for any store.
- No real plugin was tested. The cache versions imitate what plugins do. A real plugin may do better or worse, and full-page caching is not included.
- The delayed score flatters it in one way. Its scripts never ran during measurement, so its blocking time of 0 ms is not a real saving. That work happens at the first touch, and we did not measure how responsive that first tap feels.
- Delaying scripts has a setup cost. Without exclusions, the product photo and home headline stayed hidden until a touch. Even after our fix, one product image showed twice after scripts ran, the price slider lost its styling, and some images and icons further down waited for the first touch.
- The rewrite removed features. The Tailwind pages lost search, the price filter, sorting, swatches, tabs, the mini-cart, coupons and custom fonts, and the design is much plainer. Part of its gain is simply having less page.
- The rewrite is also a lab version. Flx does not produce these pages today and does not support page-builder sites yet. Its 260 ms cost comes from another site.
- The server is left out. Real time to first byte adds to every version. If a store's slowness comes from its server, plugins or database, none of this fixes it, and a renderer adds time.
- Nothing was bought or clicked. The cart cannot work without WordPress, so add to cart was checked for presence only.
- Scores vary. The same page moved by up to about 0.9 s between runs, as with Tailwind's home page at 2.11–2.99 s before Flx's cost.
What it means
On this evidence, slow loading alone is not a good reason to rebuild an Elementor store. Try a good optimization plugin first, because it may recover most of the LCP gain while keeping the design and the visual editor. Test checkout, forms and sliders afterwards, because delaying scripts can break them.
A rebuild makes more sense when you already want something a plugin cannot give:
- a design or page logic the builder makes hard;
- developers who want to work in JavaScript and TypeScript;
- a plan to leave the builder anyway, with WordPress admin, orders and plugins staying in place.
For those projects, speed is a measured result to check on each site, not the reason to start. A firmer answer would need a real store, a real optimization plugin and a real rewrite, measuring the first tap as well as loading.