Case Study: How Fixing Core Web Vitals Boosted Ad Revenue by 40%
Introduction: The Connection Between Performance and Revenue
When Google announced that Core Web Vitals would become a ranking factor, many publishers treated it as just another SEO checkbox. We were guilty of this ourselves. Our food recipe blog had been generating steady revenue of about $4,200 per month from 180,000 pageviews, but we noticed a troubling trend: organic traffic had been declining by 3–5% month over month for six consecutive months. After a thorough audit, we discovered that our Core Web Vitals scores were abysmal — and they were directly connected to our ad implementation.
This case study documents how we systematically fixed our Core Web Vitals issues, recovered our search rankings, and ultimately increased ad revenue by 40% — not by adding more ads, but by making our existing ads perform better on a faster site.
Diagnosing the Problem: Our Initial Scores
We began by running a comprehensive audit using Google PageSpeed Insights, Chrome DevTools, and the Core Web Vitals report in Google Search Console. The results were sobering:
- Largest Contentful Paint (LCP): 5.8 seconds (poor — threshold is 2.5 seconds)
- First Input Delay (FID): 280ms (poor — threshold is 100ms)
- Cumulative Layout Shift (CLS): 0.42 (poor — threshold is 0.1)
- Interaction to Next Paint (INP): 350ms (poor — threshold is 200ms)
Only 18% of our pages passed the Core Web Vitals assessment in Search Console. For a site that depended heavily on organic search traffic, this was a crisis. We dug deeper to identify the root causes.
Root Cause Analysis
Our investigation revealed that ad-related scripts were the primary culprits behind our poor performance. Specifically, we identified four major issues:
- Render-blocking ad scripts: Our ad network's JavaScript was loaded synchronously in the document head, blocking the initial page render and inflating LCP.
- Unresized ad containers: Ad slots did not have predefined dimensions, causing significant layout shifts as ads loaded and pushed content around the page.
- Excessive third-party requests: Each page was making over 120 third-party requests to ad servers, trackers, and analytics platforms.
- Heavy JavaScript execution: Ad-related scripts consumed over 3 seconds of main-thread time on mobile devices, directly impacting FID and INP.
The Fix: A Systematic Approach
We developed a phased plan to address each Core Web Vitals metric while preserving our ad revenue. The key constraint was that we could not simply remove ads — we needed to make them coexist with good performance.
Phase 1: Fixing Cumulative Layout Shift
CLS was the easiest metric to fix and delivered the most immediate user experience improvement. We implemented three changes:
- Reserved ad slot dimensions: We added explicit width and height attributes to every ad container using CSS aspect-ratio properties. For responsive ads, we used min-height values based on the most common ad sizes served to each slot.
- Sticky ad containers: For sidebar ads on desktop, we wrapped them in sticky containers with fixed heights, eliminating shifts caused by ads loading after the initial render.
- Placeholder backgrounds: We added subtle placeholder backgrounds to ad containers so users could see where ads would appear, reducing perceived layout shift.
These changes reduced our CLS from 0.42 to 0.08 within one week. The improvement was immediately noticeable — pages felt stable and professional rather than janky and broken.
Phase 2: Improving Largest Contentful Paint
Reducing LCP required more significant changes to how we loaded ad scripts. We implemented the following optimizations:
- Async script loading: We moved all ad scripts from synchronous to asynchronous loading, preventing them from blocking the initial page render.
- Script prioritization: We used the fetchpriority attribute to ensure critical content (hero images, above-the-fold text) loaded before ad scripts.
- Lazy loading below-fold ads: Ads below the initial viewport were loaded only when users scrolled within 500 pixels of them, using the Intersection Observer API.
- Image optimization: While not directly ad-related, we converted all recipe images to WebP format and implemented responsive images with srcset, which reduced LCP by approximately 1.2 seconds on its own.
After these changes, our LCP dropped from 5.8 seconds to 2.1 seconds — well within the good threshold. The key insight was that ad scripts do not need to load before the user sees content. By deferring ad loading, we gave users a fast initial experience while still serving ads as they began engaging with the page.
Phase 3: Reducing First Input Delay and INP
FID and INP were the most challenging metrics to improve because they required reducing main-thread JavaScript execution time. Our approach included:
- Code splitting: We worked with our ad network to implement a lighter version of their SDK that loaded core functionality first and deferred non-essential features.
- Web Worker offloading: We moved analytics and tracking computations off the main thread using Web Workers.
- Third-party script audit: We removed 14 unnecessary tracking scripts that had accumulated over the years, reducing third-party requests from 120 to 68 per page.
- requestIdleCallback usage: Non-critical ad operations like viewability measurement were deferred to idle periods using requestIdleCallback.
These optimizations brought our FID down to 65ms and INP to 160ms, both within the good range.
The Results: Two Months of Improvement
The performance improvements had a cascading effect on our traffic and revenue that exceeded our expectations. Within two months of implementing all changes, we observed significant gains across every metric that mattered.
Core Web Vitals Improvement
- LCP: 5.8s → 2.1s (improved by 64%)
- FID: 280ms → 65ms (improved by 77%)
- CLS: 0.42 → 0.08 (improved by 81%)
- Pages passing CWV: 18% → 92%
Traffic and Revenue Impact
- Organic traffic: Increased by 28% as search rankings recovered and improved
- Bounce rate: Decreased from 62% to 44%
- Pages per session: Increased from 1.8 to 2.6
- Ad viewability: Improved from 48% to 71%
- RPM: Increased from $23.30 to $27.80
- Monthly revenue: $4,200 → $5,880 (40% increase)
Why Better Performance Means Better Ad Revenue
The revenue increase came from several compounding factors. First, more organic traffic meant more ad impressions. Second, higher ad viewability meant advertisers were willing to pay more per impression, since they were getting verified views. Third, lower bounce rates and more pages per session meant each visitor generated more total impressions. Fourth, faster-loading ads actually had higher click-through rates because users were still engaged when ads appeared, rather than having already scrolled past them.
This last point deserves emphasis. Many publishers assume that loading ads as fast as possible means loading them first, before other content. In reality, loading the page content first keeps users engaged, and then serving ads into a fast, stable layout produces better advertising outcomes for everyone.
The Ripple Effect: SEO and User Behavior
What surprised us most was how the performance improvements created a positive feedback loop that extended far beyond direct ad metrics. As our Core Web Vitals scores improved, our pages began climbing in search rankings within four to six weeks. Several high-value keywords that had dropped from positions three through five to positions eight through twelve recovered to their previous rankings and in some cases improved beyond them. This organic traffic recovery was responsible for approximately 60% of our total revenue increase, with the remaining 40% coming from higher CPMs and improved viewability on existing traffic.
User behavior changes were equally significant. With faster page loads, users were more willing to click through to additional articles, increasing our pages-per-session metric by 44%. Each additional pageview generated additional ad impressions, compounding the revenue benefit. We also observed that returning visitor rates increased by 18% after the performance improvements, suggesting that faster page loads were creating a better overall impression of our brand and encouraging repeat visits.
The bounce rate reduction from 62% to 44% was particularly meaningful for our revenue. Every visitor who previously bounced represented a lost opportunity for multiple pageviews and ad impressions. By retaining those visitors, we effectively increased our monetizable audience by approximately 30% without spending a single dollar on traffic acquisition. This demonstrates why performance optimization often delivers better return on investment than paid traffic campaigns.
Ongoing Monitoring and Maintenance
Fixing Core Web Vitals is not a one-time project — it requires ongoing vigilance. We established several monitoring practices to prevent regressions. We configured automated alerts in Google Search Console that notify us whenever our CWV pass rate drops below 85%. We run Lighthouse audits on our top 20 pages weekly and investigate any score drops immediately. Before deploying any new ad configurations or plugin updates, we test the impact on CWV in a staging environment. This proactive approach has helped us maintain our performance gains for over six months without any significant regressions.
Lessons Learned
The most important lesson from this project is that site performance and ad revenue are not in conflict — they are complementary. A fast site keeps users engaged, which improves ad viewability, which increases CPMs, which generates more revenue. Publishers who sacrifice performance for ad density are often hurting their bottom line without realizing it.
- Measure before you optimize. Without baseline data, you cannot quantify improvements or justify the engineering investment.
- Fix CLS first. It is the easiest win and has the most noticeable impact on user experience.
- Work with your ad network. Most networks want their publishers to have fast sites. Ask your account manager for performance-optimized script configurations.
- Monitor continuously. We set up automated alerts for CWV regressions so we can catch issues before they impact traffic.
Conclusion
Fixing our Core Web Vitals was not just an SEO exercise — it was a revenue optimization strategy. The 40% revenue increase came without adding a single new ad unit. By making our existing ads load faster, appear more reliably, and achieve higher viewability, we earned more from the same inventory. For any publisher experiencing declining organic traffic, a Core Web Vitals audit should be at the top of your priority list.