Starting constraint
The store had a familiar WooCommerce shape: a working catalogue, a checkout that could not be broken, several marketing scripts, a theme with years of accumulated overrides, and mobile Core Web Vitals in the red on key templates.
The commercial risk was not theoretical. Any optimisation that touched cart, payment, stock, taxes, or session handling had to be staged behind measurement and rollback.
Diagnosis
The first pass separated template families: homepage, category, product, cart, checkout, and content pages. Each family had different performance constraints, so treating the site as one score would have hidden the real bottlenecks.
The biggest issues were usually not one large file. They were cumulative: third-party scripts loading too early, unused CSS from legacy components, image sizing drift, cache misses on pages that could be safely cached, and script work during the first interaction window.
Architecture decision
The project did not start with a rewrite. The first decision was to protect checkout correctness, then move only safe surfaces toward stronger caching and lighter rendering.
Cloudflare handled edge rules, cache boundaries, redirects, bot filtering, and observability. WordPress and WooCommerce stayed the commercial source of truth. Front-end changes were scoped by template family, not by a generic theme cleanup promise.
Delivery model
Work was delivered in short batches: baseline, script audit, image and layout fixes, cache policy, checkout isolation, staging validation, production rollout, then post-launch measurement.
Every batch had a rollback path. That matters more than a dramatic launch when revenue flows through the same checkout being optimised.
Outcome bands
Exact numbers are confidential. The publishable result is that the main commercial template family moved from failing Core Web Vitals toward green-field thresholds, while checkout behaviour stayed stable.
The reusable lesson: performance recovery in WooCommerce is less about chasing a perfect score and more about choosing the right boundary between cacheable commercial pages and live transactional flows.