How to Improve Core Web Vitals for Ad Network Approval
Why Core Web Vitals Matter for Publishers
Core Web Vitals are a set of specific metrics that Google uses to measure real-world user experience on websites. Introduced in 2020 and refined since, these metrics have become critical for both search engine rankings and ad network approval. Every major ad network now evaluates your Core Web Vitals scores during the application review process, and poor scores can lead to rejection even if your content and traffic meet all other requirements.
For publishers, Core Web Vitals represent a direct connection between site performance and revenue. Faster, more stable pages keep users engaged longer, reduce bounce rates, and create more ad impression opportunities. Google research shows that sites meeting Core Web Vitals thresholds see 24 percent fewer page abandonments. For ad-supported sites, every visitor who stays is additional revenue, making performance optimization one of the highest-ROI activities a publisher can undertake.
The three Core Web Vitals metrics are Largest Contentful Paint (LCP), Interaction to Next Paint (INP), and Cumulative Layout Shift (CLS). Each measures a different dimension of user experience, and all three need to pass their respective thresholds for your site to achieve a "good" Core Web Vitals assessment. Understanding what each metric measures and how to improve it is essential for any publisher serious about ad monetization.
Largest Contentful Paint (LCP)
What LCP Measures
Largest Contentful Paint measures how long it takes for the largest visible content element to render on screen. This is typically a hero image, a featured video thumbnail, or a large block of text. LCP captures the user's perception of when the page has "loaded" because the biggest visual element is usually what they are waiting to see.
Google considers LCP good if it occurs within 2.5 seconds, needs improvement between 2.5 and 4 seconds, and poor if it exceeds 4 seconds. For ad network approval, aim for an LCP under 2.5 seconds on both mobile and desktop. Many premium networks like Mediavine and Raptive specifically check mobile LCP scores because the majority of web traffic comes from mobile devices.
Common LCP Problems
The most frequent cause of poor LCP is slow server response time. If your web server takes more than 600 milliseconds to respond to a page request, achieving good LCP becomes extremely difficult regardless of other optimizations. This is measured by Time to First Byte (TTFB) and is primarily determined by your hosting quality, server configuration, and whether you use a content delivery network.
Large, unoptimized images are the second most common LCP killer. A hero image that is 3 megabytes and served in JPEG format will take significantly longer to load than the same image compressed to 200 kilobytes in WebP format. Since the LCP element is often an image, image optimization directly impacts this metric.
Render-blocking resources also delay LCP. CSS and JavaScript files that must be downloaded and parsed before the browser can render the page push back the moment when visible content appears. Large CSS frameworks loaded in the document head and synchronous JavaScript files are common offenders.
How to Fix LCP
Start with your hosting. Upgrade to a quality hosting provider with server response times under 200 milliseconds. Managed WordPress hosts like Cloudways, Kinsta, or WP Engine deliver significantly better TTFB than shared hosting on providers like Bluehost or GoDaddy. If switching hosts is not feasible, implement server-level caching to reduce response times for repeat visitors.
Optimize your LCP image aggressively. Convert it to WebP or AVIF format, compress it appropriately for its display dimensions, and add explicit width and height attributes to the image tag. Use a preload link tag in your document head to tell the browser to start fetching the LCP image before it discovers it in the HTML. This single optimization can shave hundreds of milliseconds off your LCP time.
Minimize render-blocking resources by inlining critical CSS directly in the document head and deferring non-critical CSS. For JavaScript, add the defer or async attribute to script tags to prevent them from blocking HTML parsing. Consider using a critical CSS extraction tool to automatically generate the minimal CSS needed for above-the-fold rendering.
Implement a content delivery network to serve your static assets from edge locations geographically close to your users. CDNs like Cloudflare, Fastly, or AWS CloudFront can reduce asset load times by 50 to 80 percent for users far from your origin server.
Interaction to Next Paint (INP)
What INP Measures
Interaction to Next Paint replaced First Input Delay as a Core Web Vital in March 2024. While FID only measured the delay before the first interaction was processed, INP measures the responsiveness of all interactions throughout the entire page lifecycle. It reports the worst interaction latency observed during a page visit, giving a more comprehensive picture of how responsive your site feels.
An interaction includes clicks, taps, and keyboard inputs. INP measures the time from when the user initiates the interaction to when the browser paints the visual response. Google considers INP good if it is under 200 milliseconds, needs improvement between 200 and 500 milliseconds, and poor above 500 milliseconds.
Common INP Problems
Heavy JavaScript execution is the primary cause of poor INP. When the browser's main thread is busy executing JavaScript, it cannot process user interactions promptly. This creates a noticeable delay between when a user clicks or taps and when they see a visual response. Ad scripts, analytics tags, and third-party widgets are frequent contributors to main thread congestion.
Long tasks, defined as JavaScript executions exceeding 50 milliseconds, block the main thread and prevent the browser from responding to user input. A page with many long tasks will feel sluggish even if it loads quickly. Ad network scripts are notorious for creating long tasks because they run real-time bidding auctions, load creative assets, and track viewability metrics, all on the main thread.
How to Fix INP
Audit your third-party scripts using Chrome DevTools Performance panel. Identify which scripts create the longest tasks and evaluate whether each is essential. Remove any scripts that provide marginal value, and defer non-critical scripts to load after the page becomes interactive.
Break up long JavaScript tasks using techniques like requestIdleCallback or setTimeout to split heavy computations into smaller chunks. This yields the main thread back to the browser between chunks, allowing it to process pending user interactions. Modern frameworks like React 18 use automatic batching and concurrent rendering to help with this, but custom JavaScript often needs manual optimization.
Lazy load ad scripts so they do not execute until they are needed. Ad units below the fold should not run their auction scripts until the user scrolls near them. This reduces main thread congestion during the critical initial interaction period and improves INP scores significantly.
Use a web worker for heavy computations that do not need DOM access. Web workers run on a separate thread, freeing the main thread to handle user interactions. Analytics processing, data transformations, and tracking calculations are good candidates for web worker offloading.
Cumulative Layout Shift (CLS)
What CLS Measures
Cumulative Layout Shift measures visual stability by quantifying how much page content shifts unexpectedly during the loading process. When elements on the page move without user interaction, it creates a jarring experience. Users might click the wrong button, lose their reading position, or become frustrated by content jumping around.
Google considers CLS good if it is below 0.1, needs improvement between 0.1 and 0.25, and poor above 0.25. CLS is calculated by multiplying the fraction of the viewport that shifted by the distance it shifted. Multiple small shifts can accumulate to a poor CLS score even if no single shift seems dramatic.
Ad-Specific CLS Issues
Advertisements are one of the most common causes of layout shift on publisher websites. When an ad loads after the surrounding content has already rendered, it pushes content down or to the side, creating a shift. This is especially problematic with ads above the fold that load asynchronously and inject themselves into the page flow.
Dynamic ad sizes make CLS even worse. If your ad server returns a 300x250 ad when your container expected a 300x600 ad, the resulting size change causes a layout shift. Similarly, when a sticky or expanding ad activates, it can push content around if not implemented carefully.
Header bidding auctions contribute to CLS because different bidders respond at different times. The winning bid might change the ad creative size, or the auction delay might cause content to render before the ad space is claimed, leading to a shift when the ad finally appears.
How to Fix CLS
Reserve space for every ad slot using CSS. Set explicit width and height on all ad containers so the browser allocates space before the ad loads. Use min-height on ad wrappers to prevent content from collapsing when ads load slowly. This single technique eliminates the majority of ad-related CLS issues.
For responsive ad units that change size based on viewport width, use CSS aspect-ratio or padding-based aspect ratio hacks to maintain consistent proportions. Create responsive ad containers that scale proportionally rather than collapsing to zero height before the ad loads.
Set explicit dimensions on all images and videos using width and height HTML attributes. Modern browsers use these attributes to calculate aspect ratios and reserve space before the media loads. Without these attributes, images cause layout shifts as they pop into view at their natural dimensions.
Preload web fonts to prevent font-swap-related layout shifts. When a web font loads and replaces a fallback font, the different character widths and line heights cause text to reflow, creating CLS. Use font-display: optional or preload your fonts to eliminate this shift. Consider using system font stacks for body text to avoid font-related CLS entirely.
Avoid inserting dynamic content above existing content. Notification bars, cookie consent banners, and promotional elements should either be positioned as fixed or sticky overlays rather than pushing content down, or they should be reserved in the initial layout so their appearance does not cause a shift.
Measuring Core Web Vitals
Lab Tools
Google PageSpeed Insights is the most accessible measurement tool. Enter your URL and it provides both lab data from Lighthouse and field data from the Chrome User Experience Report. Lab data shows performance under controlled conditions, while field data reflects real user experiences collected from Chrome browsers.
Chrome DevTools Performance panel provides detailed waterfall views of page loading, letting you identify exactly which resources and scripts are causing LCP delays, long tasks affecting INP, and elements causing layout shifts. The Performance Insights panel offers a more beginner-friendly view of the same data.
WebPageTest at webpagetest.org provides the most detailed performance analysis available. It tests from multiple global locations, shows filmstrip views of the loading sequence, and provides waterfall charts that make it easy to identify bottlenecks. Advanced users can configure custom test parameters including device emulation, network throttling, and script execution.
Field Data Sources
Google Search Console reports Core Web Vitals field data for your entire site in the Page Experience section. It groups your URLs into good, needs improvement, and poor buckets for each metric. This is the data Google uses for ranking decisions, making it the most authoritative source for understanding how Google views your site performance.
The Chrome User Experience Report (CrUX) provides real-user performance data collected from Chrome users who have opted in to sharing usage statistics. CrUX data is available through BigQuery for detailed analysis, the CrUX API for programmatic access, and PageSpeed Insights for quick lookups. Field data is reported at the 75th percentile, meaning 75 percent of your users experience performance at or better than the reported value.
Real User Monitoring (RUM) tools like Google's web-vitals JavaScript library let you collect Core Web Vitals data directly from your own users. Adding a few lines of JavaScript to your site enables you to log LCP, INP, and CLS values to your analytics platform, giving you granular performance data segmented by page, device, geography, and other dimensions.
Quick Wins for Publishers
If you need to improve Core Web Vitals quickly for an ad network application, focus on these high-impact optimizations that can be implemented in a day or two.
- Add dimensions to all ad containers: Set explicit min-height CSS on every ad wrapper to eliminate ad-related CLS. This alone can drop your CLS from poor to good.
- Preload your LCP image: Add a preload link tag for your hero image or largest above-the-fold element to shave 200-500 milliseconds off LCP.
- Defer non-critical JavaScript: Add defer attribute to all script tags that are not needed for above-the-fold rendering. This improves both LCP and INP.
- Enable a CDN: Cloudflare's free plan provides global CDN, automatic compression, and DNS-level caching that can improve TTFB by 50 percent or more.
- Compress images: Convert your largest images to WebP format and resize them to match their display dimensions. Tools like Squoosh make this fast and easy.
- Set font-display: swap: Add this CSS property to your font-face declarations to prevent font loading from delaying text rendering.
Use AdGateScore to check your Core Web Vitals alongside other ad network requirements. The tool identifies specific performance issues that could affect your applications and provides targeted recommendations for improvement.