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 DirectorIndustry: Subscription e-commerceVerified 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.
Component
Details
Hosting
Kinsta Startup
Theme
Astra + Astra child theme
E-commerce
WooCommerce + Stripe payments
Caching
WP Rocket + Kinsta full-page cache
Catalog
180+ 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
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 PSI18→91
Desktop PSI44→96
Checkout load4.2s→1.3s
INP480ms→78ms
CLS0.11→0.02
Shop LCP6.8s→1.4s
Core Web VitalsFail→All Pass
Metric
Before
After
Change
Mobile PSI
18
91
+73 pts
Desktop PSI
44
96
+52 pts
Checkout load (mobile)
4.2s
1.3s
−69%
INP
480ms
78ms
−84%
CLS
0.11
0.02
−82%
TTFB (cached shop)
980ms
280ms
−71%
Total checkout weight
2.8 MB
720 KB
−74%
HTTP requests (checkout)
96
28
−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
WooCommerceWP Rocket FailedCheckout
★★★★★
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."
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.
Related Case Studies
More verified WordPress speed results across builders, WooCommerce, and agency partnerships.