David K.'s niche finance blog with 800+ posts was failing all three Core Web Vitals in Google Search Console. PageSpeed99 fixed LCP, INP, and CLS — all metrics green in Search Console within 28 days, confirmed by CrUX field data.
Client: David K., PublisherIndustry: Finance / Content PublishingVerified in: Google Search Console & CrUX
34 → 93
PSI Mobile
6.1s → 1.9s
LCP
290ms → 64ms
INP
0.19 → 0.05
CLS
28 days
GSC all green
800+
Published posts
72 hours
Staging to live
800+ posts
Content archive
~22k/mo
Organic sessions
How we verify: Lab scores verified in PageSpeed Insights. Field data verified in Google Search Console Core Web Vitals report and Chrome UX Report (CrUX) — we include GSC screenshots and CrUX percentile data in every CWV deliverable.
The Challenge
David K. publishes a niche finance blog with 800+ posts and ~22k monthly organic sessions. Google Search Console showed failing LCP, INP, and CLS across 78% of URLs — a "Needs improvement" status on the Core Web Vitals report that was suppressing rankings on competitive finance keywords.
David had Kadence theme with Kadence Blocks, WP Rocket, and Cloudways hosting. PSI scored 34 on mobile. The issues weren't one-page fixes — ad scripts, featured images across 800 posts, and Kadence Blocks CSS loading on every archive page needed systematic treatment.
Finding 01
Featured images lacked dimensions on 800+ posts
Kadence Blocks post grid and single post templates loaded featured images without width/height — CLS 0.19 across archive and single post URLs in GSC.
Finding 02
Mediavine ad scripts blocked LCP
Mediavine ad wrapper loaded in the header on every post — pushing LCP to 6.1s on mobile as the ad container became the largest contentful paint element.
Finding 03
Kadence Blocks CSS loaded globally
Kadence Blocks enqueued 8 stylesheets on every page including archives — 380 KB of CSS, much of it unused on single post views.
Finding 04
INP failures on mobile navigation
Kadence mobile menu and search overlay JS caused 290 ms INP on tap — flagged in Search Console field data for 62% of mobile URLs.
The Stack
The blog ran on Cloudways (DigitalOcean 4GB) with Kadence theme, Kadence Blocks Pro, WP Rocket, and Mediavine for ad monetization. Organic search was the primary traffic source — making CWV pass a direct ranking factor.
Component
Details
Hosting
Cloudways — DigitalOcean 4GB
Theme
Kadence + Kadence Blocks Pro
Caching
WP Rocket + Cloudways Breeze
Monetization
Mediavine ad network
Content
800+ published posts, 14 categories
Plugins (active)
27 plugins at audit time
What We Did
All work was done on a Cloudways staging clone. David reviewed GSC-ready staging URLs before approving live deploy — critical for a content site where ad revenue depends on traffic stability.
LCP & Ads
Moved Mediavine script to load after LCP element painted
Set explicit ad container dimensions to prevent CLS from ad insertion
Added fetchpriority="high" to single post featured images
Converted featured images to WebP via ShortPixel bulk optimization
Reserved min-height for in-content ad slots on post template
CLS & Images
Bulk-added width/height to featured images across 800+ posts via database query
Set aspect-ratio on Kadence post grid thumbnails
Fixed author avatar and social share icon dimensions in post header
Lazy-loaded below-fold in-content images with native loading="lazy"
Preloaded hero featured image on single post template
CSS & Kadence Blocks
Enabled Kadence Blocks "Load CSS per Block" setting
Deferred non-critical Kadence Blocks stylesheets via WP Rocket
Removed unused Kadence Blocks CSS on archive pages
Inlined critical single-post layout CSS (~5 KB)
Self-hosted Inter font via OMGF — removed Google Fonts enqueue
INP & Search Console
Deferred Kadence mobile menu JS until hamburger tap
Configured WP Rocket delay JS for Mediavine and analytics
Submitted updated URLs for re-crawl in Search Console
Monitored CrUX field data weekly for 28-day validation window
Results
Lab scores verified in PageSpeed Insights. Field data verified in Google Search Console — all three CWV metrics passed within 28 days of live deploy.
PageSpeed99 Audit ReportPDF
Mobile PSI34→93
Desktop PSI61→97
LCP (field)6.1s→1.9s
INP (field)290ms→64ms
CLS (field)0.19→0.05
GSC statusFail→All Green
CrUX validation—→28 days
Metric
Before
After
Change
Mobile PSI
34
93
+59 pts
Desktop PSI
61
97
+36 pts
LCP (CrUX field)
6.1s
1.9s
−69%
INP (CrUX field)
290ms
64ms
−78%
CLS (CrUX field)
0.19
0.05
−74%
GSC URLs passing
22%
100%
+78 pts
TTFB (cached)
720ms
290ms
−60%
Total page weight
3.1 MB
980 KB
−68%
Business Impact
David monitored Search Console impressions and Mediavine RPM for 60 days post-deploy. CWV green status correlated with impression recovery on previously suppressed finance keywords.
28 days
GSC all green
LCP, INP, and CLS passing in field data
+14%
Organic impressions
60-day post-deploy vs. prior 60 days
Stable
Mediavine RPM
Ad revenue held — no RPM drop from script deferral
What Didn't Work (Before Us)
WP Rocket alone couldn't fix field data
David had WP Rocket with full optimization enabled for 6 months. PSI lab score moved from 34 to 48, but Search Console field data stayed red. Lab scores and CrUX field data measure different things — ad script deferral and bulk image dimension fixes target field data specifically.
Mediavine deferral required careful testing
Moving Mediavine after LCP was the biggest single win, but ad viewability had to stay above Mediavine's threshold. We deferred the wrapper script, not the ad slots — RPM held stable at $28.40.
Client Quote
Core Web VitalsSearch ConsoleContent Site
★★★★★
GSC all green in 28 days · PSI 34 → 93
"800 posts and every URL was failing Core Web Vitals in Search Console. PageSpeed99 fixed LCP, INP, and CLS systematically — all green in 28 days. CrUX field data confirmed it, not just lab scores."
Timeline
Day 0
Free Audit
David submitted the blog URL. PDF audit within 20 hours — PSI scores, GSC CWV status, CrUX percentiles, and fixed-price quote.
Day 1
Staging Clone
Cloudways staging clone. Bulk image dimension fix, Mediavine deferral, and Kadence Blocks CSS optimization started across post templates.
Day 2
Verified & Approved
Staging hit PSI 93 mobile. David verified Mediavine RPM on staging. Approved live deploy — low-traffic window on Sunday morning.
Day 2–32
GSC Validation
28 days post-deploy: all three CWV metrics green in Search Console. CrUX field data confirmed. Organic impressions up 14% by day 60.
Key Takeaways
If Search Console shows failing Core Web Vitals on a content site, lab PSI scores alone won't tell the full story.
Field data beats lab scores for GSC. PSI lab scores and CrUX field data measure different things. Fixing field data requires ad deferral, bulk image dimensions, and INP-specific JS fixes.
Content sites need bulk fixes. 800+ posts with missing image dimensions can't be fixed one at a time. Database-level width/height injection plus WebP conversion is the scalable approach.
Ad scripts are the #1 LCP blocker on publisher sites. Mediavine, AdThrive, and Ezoic wrappers in the header push LCP past 4s. Defer after LCP without breaking viewability.
Allow 28 days for GSC validation. CrUX field data updates on a rolling 28-day window. Deploy fixes, then monitor Search Console weekly — don't expect overnight green status.
Related Case Studies
More verified WordPress speed results across builders, WooCommerce, and agency partnerships.