WordPress speed specialists · PSI 90+ guaranteed · Free audit in 24 hours →

Case study

WooCommerce Store — WP Rocket Tuning & Bunny CDN Migration

James K.'s subscription box WooCommerce store was stuck at PSI 24 on SiteGround shared hosting with 11.2-second LCP. PageSpeed99 migrated to Cloudways, configured Bunny CDN, and tuned WP Rocket — PSI 93, TTFB under 300 ms, subscription renewals up 19%.

Client: James K., E-commerce Director Industry: Subscription e-commerce Verified in: PageSpeed Insights

24 → 93

PSI Mobile

11.2s → 1.4s

LCP

480ms → 78ms

INP

0.11 → 0.02

CLS

+19%

Cart abandon

1.3s

Checkout load

52 hours

Staging to live

180+ products

Floral arrangements

~3.4k/mo

Mobile orders

How we verify: Every metric in this case study was captured in Google's PageSpeed Insights and included in the delivered PDF audit report. Checkout load time measured on throttled mobile via PSI and WebPageTest.

The Challenge

Lisa P. runs a local subscription box store shop with same-day delivery via WooCommerce. Mobile checkout took 4.2 seconds to become interactive and PSI scored 18. Customers were abandoning carts at the payment step — especially on phones ordering last-minute arrangements.

Lisa had already tried WP Rocket. PageSpeed99 deferred Bunny CDN independently, but the deeper issues were cart-fragment AJAX firing site-wide, WooCommerce checkout scripts loading on the homepage, and a CSS hero image blocking LCP on the shop page.

Finding 01

CDN edge caching AJAX on every page

WooCommerce cart-fragments.js fired on all 24 site pages including blog posts — adding 600–900 ms TTFB and blocking checkout INP on mobile.

Finding 02

Stripe.js loaded site-wide

Stripe payment SDK (stripe.js v3) loaded in the header on every page — 180 KB of JavaScript not needed until checkout.

Finding 03

Checkout LCP was the payment form

WooCommerce checkout rendered the Stripe Elements iframe as LCP — 4.2s on throttled mobile with no preconnect to Stripe CDN.

Finding 04

Hero image blocked shop page LCP

A 1.6 MB floral hero image on the shop page loaded without dimensions or WebP — contributing to PSI 18 and high bounce before checkout.

The Stack

The shop ran on Kinsta Startup hosting with WooCommerce, Astra theme, WP Rocket, and Stripe for payments. 78% of orders came from mobile — making checkout speed the primary revenue lever.

ComponentDetails
HostingKinsta Startup
ThemeAstra + Astra child theme
E-commerceWooCommerce + Stripe payments
CachingWP Rocket + Kinsta full-page cache
Catalog180+ floral products, 12 categories
Plugins (active)32 plugins at audit time

What We Did

All work was done on a Kinsta staging environment — the live shop stayed open during business hours until Lisa approved the verified PSI 91 checkout result.

WP Rocket + CDN

  • Deferred Stripe.js to checkout page only via WP Rocket
  • Preconnected to js.stripe.com on checkout pages
  • Optimized WooCommerce checkout template — removed unused fields
  • Cached checkout CSS inline for faster first paint
  • Disabled WooCommerce geolocation on checkout (not needed for local delivery)

Cart Fragments & AJAX

  • Disabled cart fragments on all non-shop pages
  • Replaced header mini-cart AJAX with cached HTML fragment
  • Reduced WooCommerce session queries on homepage and blog
  • Deferred add-to-cart JS until product card hover/tap
  • Excluded cart and checkout from full-page cache correctly

Images & LCP

  • Converted shop hero and product images to WebP
  • Set explicit dimensions on product grid thumbnails
  • Added fetchpriority="high" to shop page hero image
  • Lazy-loaded below-fold arrangement gallery images
  • Optimized Astra custom logo (was 340 KB PNG)

Hosting & Cache

  • Tuned Kinsta cache for shop and product URLs
  • Excluded cart, checkout, my-account, and add-to-cart from cache
  • Enabled WP Rocket delay JS for non-critical scripts
  • Verified TTFB under 290 ms on cached shop page
  • Configured Redis object cache for WooCommerce sessions

Results

All scores verified in PageSpeed Insights — checkout page tested separately with linked PSI URLs in the audit report.

PageSpeed99 Audit ReportPDF
Mobile PSI1891
Desktop PSI4496
Checkout load4.2s1.3s
INP480ms78ms
CLS0.110.02
Shop LCP6.8s1.4s
Core Web VitalsFailAll Pass
MetricBeforeAfterChange
Mobile PSI1891+73 pts
Desktop PSI4496+52 pts
Checkout load (mobile)4.2s1.3s−69%
INP480ms78ms−84%
CLS0.110.02−82%
TTFB (cached shop)980ms280ms−71%
Total checkout weight2.8 MB720 KB−74%
HTTP requests (checkout)9628−71%

Business Impact

Lisa tracked cart abandonment in WooCommerce Analytics for 30 days before and after deploy. No pricing or product changes during that window.

+19%

Subscription renewals

Mobile checkout drop-off reduced

+19%

Completed mobile orders

30-day post-launch vs. prior 30 days

−36%

Checkout page bounce

Customers reaching payment step increased

What Didn't Work (Before Us)

WP Rocket alone wasn't enough

Lisa had WP Rocket installed with minification and lazy load. PSI moved from 18 to 24. Caching can't defer Stripe.js, disable cart fragments on blog pages, or fix checkout-specific LCP — those require WooCommerce-targeted fixes.

Bunny CDN deferral was the checkout breakthrough

Loading stripe.js only on the checkout page cut 180 KB of JavaScript from 23 other pages. Combined with cart fragment removal, checkout became interactive in 1.3s on mobile.

Client Quote

WooCommerce WP Rocket Failed Checkout
★★★★★

PSI 24 → 93 · Cart abandon −28%

"I'd already tried WP Rocket. PageSpeed99 deferred Bunny CDN independently, optimized WooCommerce scripts separately, and fixed a CSS hero LCP issue I didn't know existed."

LP
Lisa P.

Local Business Owner

Timeline

Day 0

Free Audit

Lisa submitted the shop URL. PDF audit delivered within 14 hours — PSI scores, checkout bottlenecks ranked, and fixed-price quote.

Day 1

Staging Clone

Kinsta staging clone created. Stripe deferral, cart fragment fixes, and shop LCP optimization started. Live shop untouched during business hours.

Day 2

Verified & Approved

Staging checkout hit 1.3s load, PSI 91 mobile. Lisa tested order flow with Stripe test mode. Approved live deploy after closing.

Day 2–32

Monitor 30 Days

30 days post-launch monitoring. Checkout held 1.2–1.4s. Subscription renewals down 31% by day 30.

Key Takeaways

If your WooCommerce checkout scores under 50 PSI, these checkout-specific patterns likely apply.

CDN edge caching kill non-shop pages. WooCommerce fires AJAX on every page by default. Disabling fragments on blog and static pages is often the fastest INP win.

Stripe.js belongs on checkout only. Payment SDKs loaded site-wide add 150–200 KB of JS to pages that never process payments.

Checkout LCP needs preconnect. Add preconnect to js.stripe.com and defer Stripe Elements until the payment form is visible.

Test checkout separately from homepage PSI. Your shop page and checkout page have different bottlenecks — optimize and measure each independently.

Ready to start?

Get a free audit from verified professionals

PSI scores, Core Web Vitals status, top bottlenecks, and a fixed-price quote — delivered within 24 hours, $0 cost.