Lazy loading is the practice of postponing the download of a page element until the reader is likely to see it. Images, embedded frames and advertising slots further down a page are left unrequested when it opens; a script, or the browser itself, tracks the scroll position and fetches each item as it approaches the visible area of the screen, known as the viewport. The technique exists because most pages carry more material than a visitor ever reaches, and every unused download costs bandwidth, processor time and battery. For a publisher it also costs an ad request that nobody was in a position to see.
In advertising the term has a narrower sense. It means deferring the ad request, and often the rendering of the creative, for slots below the fold, the part of a page visible only after scrolling. Google's documentation for Google Publisher Tag (GPT), the JavaScript library that places ads served by Google Ad Manager, describes the aim as faster pages, less contention for device resources and higher viewability rates.
How lazy loading works in an ad stack
A conventional page defines every slot and asks the ad server to fill all of them the moment it loads. Lazy loading breaks that request into instalments. In GPT, a publisher enables it through a lazyLoad configuration carrying three numbers. fetchMarginPercent sets how close a slot must come to the viewport, measured in screen heights, before its ad request is sent. renderMarginPercent sets a second, usually shorter distance at which the returned creative is painted and its assets downloaded. mobileScaling multiplies both on phones.
Google's own sample code uses 500, 200 and 2.0: request an ad when the slot is five screens away, render it at two, and double both distances on mobile. On a phone with an 800-pixel-tall screen, that sends the request roughly 8,000 pixels before the slot scrolls into view. Fetching early gives the auction time to finish; rendering late spares the device a creative that may never be reached. Request mode changes the picture. Under single request architecture (SRA), in which GPT bundles several slots into one call, Google states that the first slot to cross the fetch margin triggers the request for every slot, which blunts the deferral considerably.
Header bidding adds a second clock. Exchanges bid in the browser before the ad server decides, and each auction runs against a timeout that drops late bidders. GPT's setting governs only the Ad Manager call, so a publisher running Prebid, the open-source header bidding wrapper, has to trigger bids separately as each slot approaches. Developers were asking the Prebid project how to combine the two as early as April 2016, according to its public issue tracker, and every extra bid round is a network round trip held open while the slot sits empty.
Browsers offer a simpler route. The HTML loading attribute, set to "lazy" on an image or iframe element, hands the decision to the browser. Chromium picks its own distances: according to Google's web.dev documentation, Chrome cut the threshold in July 2020 from 3,000 to 1,250 pixels on 4G connections and from 4,000 to 2,500 pixels on 3G or slower. Those values are hard-coded and cannot be tuned by a site. Ads delivered as images or frames lazy load like any other element, the same documentation notes.
Configuration sits with the sell side: publisher ad operations teams, wrapper vendors and content management system (CMS) developers. A demand-side platform (DSP) never sets it; it simply bids on an impression the reader is closer to reaching.
From viewability primer to browser standard
The idea is older than programmatic trading; JavaScript libraries long deferred images using scroll events and, later, the Intersection Observer API. Advertising adopted the technique once viewability became a trading currency, after the Media Rating Council (MRC) set its threshold of 50% of pixels on screen for one continuous second in 2014.
In March 2016 the Interactive Advertising Bureau (IAB) published a primer for publishers on improving viewability, naming latency as one of four levers. Google added the enableLazyLoad method to GPT in the week of August 6, 2018, according to the library's release notes. Revisions followed steadily. From June 2020 the feature worked with collapsing empty slots. In March 2021 it began delaying rendering of below-the-fold slots in background tabs, and from March 2023 it required native Intersection Observer support. On July 28, 2025 Google deprecated enableLazyLoad in favour of the lazyLoad property of a unified configuration API, although the old method still functions.
Browsers standardised the idea in parallel. Google's web.dev blog states the loading attribute for images landed in Chrome 76 in 2019, while web.dev's current support table lists Chrome 77; Firefox 75 and Safari 15.4 followed. Iframe support arrived in Chrome 77, Firefox 121 and Safari 16.4. WordPress switched image lazy loading on by default in version 5.5 and extended it to iframes in 5.7, according to Felix Arntz, a WordPress core contributor.
Why publishers and buyers care
The first reason is arithmetic. A below-the-fold slot requested at page load is served and counted even when the reader leaves first. Deferred, it is never requested. Viewable rates are calculated on measured impressions, so removing unreachable ones lifts the ratio, and some of the gain reflects a smaller denominator rather than more attentive readers. Google's Publisher Ads Audits, a plugin for the Lighthouse testing tool aimed at GPT and AdSense pages, includes a check that fails pages loading more than three ads below the fold, according to its documentation.
Speed is the second. Core Web Vitals, Google's field metrics for page experience, treat Largest Contentful Paint (LCP) of 2.5 seconds or less as good. Ad code shows up in the data: mobile Interaction to Next Paint (INP) pass rates on sites running GPT rose from 55.58% to 66.12% after a 2024 change that yields the processor before inserting out-of-viewport ads. An AdSense email on March 24, 2026 cited a 27% page view gain at German publisher Netzwelt after performance work, a figure supplied by Google.
Energy is a third. IAB Italia's September 2025 sustainability white paper recommends lazy loading to cut processor use and emissions. According to web.dev, Chrome's research into lazy-loading off-screen iframes for Data Saver users pointed to median data savings of 2% to 3%.
Where it fails
Misplaced deferral is the commonest failure. Browsers scan the HTML early and start fetching visible images at once; marking the main image "lazy" removes it from that queue. In a case shared in November 2025, an agency lifted a PageSpeed score from 65 to 92 while LCP worsened from 1.8 to 4.2 seconds and traffic fell 20%, all figures reported by the agency itself. In HTTP Archive data analysed by web.dev, the median page without lazy loading recorded a 75th percentile LCP of 2,922 milliseconds against 3,546 milliseconds with it, a gap the authors describe as correlational. WordPress refined its defaults for version 5.9 after a mid-2021 analysis found its implementation had caused a slight LCP regression.
How much that matters for search is disputed. Google's Martin Splitt described the ranking effect as "a tiny, minute factor in most cases", while warning that custom libraries storing image addresses in non-standard attributes can prevent indexing. Google's December 2025 JavaScript documentation repeats that lazy-loaded images must remain discoverable.
The revenue trade-off is harder to settle. Margins too tight leave slots blank when the auction or creative misses the scroll; margins too wide recreate eager loading. Fewer requests also mean fewer impressions, and header bidding timeouts that protect page speed also discard demand. Measurement adds a further complication. Under the IAB and MRC impression guidelines of October 2017, an ad counts only once it begins to render, and pre-fetched or pre-rendered content qualifies only when it loads in response to a genuine user request.
Not the same as
Asynchronous loading. Some references treat the terms as synonyms. In ad operations they differ: an asynchronous tag stops ad code from blocking the page, but can still request every slot at load.
Infinite scroll. Splitt distinguishes the two. Infinite scroll appends new content as the reader descends; lazy loading defers resources already on the page.
Ad refresh. Refresh requests a new creative for a slot that has already rendered, usually on a timer or an event. Lazy loading governs only the first request.
Prerendering. Chrome can load a page before the reader navigates to it. Since November 2023 GPT has delayed ad requests on prerendered pages until they become visible, according to its release notes.
Recent developments
Measurement is where the technique now carries money. Google told publishers on September 1, 2026 that AdSense and Ad Manager will count banner display impressions only once rendering begins, from February 17, 2027. Its help documentation names renderMarginPercent and fetchMarginPercent as the settings that move rendering earlier, at the cost of more load on network and device.
GPT keeps changing around the feature. Since March 2026, slots emptied by Chrome's Heavy Ad Intervention refresh automatically. In the week of August 31, 2026, GPT began requesting its core script with high fetch priority. From September 8, 2026, it refreshes actively viewed slots when a reader returns through the back/forward cache.
Chrome also began publishing four experimental ad metrics on September 15, 2026, covering ad count, screen density, processing time and data consumed, the kind of figures deferred requests are designed to lower. Field measurement no longer depends on one browser: Safari, Firefox and Chrome reached parity on the underlying metrics in December 2025, and publishers increasingly track the cost of ad tags through real user monitoring.
Timeline
- June 2014: The MRC issues its viewable ad impression guidelines, setting 50% of pixels for one continuous second for display
- March 22, 2016: The IAB publishes its first primer for publishers on improving ad viewability
- April 2016: Prebid.js developers raise combining lazy-loaded slots with header bidding on the project's issue tracker
- October 2017: IAB Tech Lab and the MRC publish impression guidelines requiring an ad to begin rendering before it counts
- Week of August 6, 2018: Google adds enableLazyLoad to Google Publisher Tag
- Week of February 4, 2019: GPT allows lazy loading configuration to change after services are enabled
- 2019: Chrome 76 introduces the loading attribute for images, according to Google's web.dev blog
- Week of June 15, 2020: GPT lazy loading becomes compatible with collapsing empty slots
- July 2020: Chrome reduces image lazy loading thresholds to 1,250 pixels on 4G and 2,500 pixels on 3G
- Week of March 22, 2021: GPT extends lazy loading to delay rendering of below-the-fold slots in background tabs
- Mid-2021: Analysis finds WordPress lazy loading caused a slight LCP regression
- December 29, 2021: WordPress announces lazy loading refinements for version 5.9
- Week of March 27, 2023: GPT requires native Intersection Observer support for lazy loading
- Week of November 13, 2023: GPT delays ad requests on prerendered pages until they become visible
- Week of July 29, 2024: GPT begins yielding the processor before rendering out-of-viewport creatives
- Week of July 28, 2025: Google deprecates enableLazyLoad in favour of the lazyLoad configuration property
- August 21, 2025: Google publishes Search Off the Record episode 98 on lazy loading
- September 9, 2025: IAB Italia publishes a digital sustainability white paper recommending lazy loading
- November 7, 2025: An agency case links lazy loading of a hero image to a 20% traffic decline
- December 2025: Safari 26.2, Firefox 146 and Chrome 143 reach parity on Core Web Vitals measurement
- Week of March 9, 2026: GPT automatically refreshes slots emptied by Chrome's Heavy Ad Intervention
- March 24, 2026: AdSense emails publishers recommending bfcache and speculation rules
- Week of August 31, 2026: GPT requests its core script with high fetch priority
- September 1, 2026: AdSense announces begin-to-render impression counting for banner display
- September 8, 2026: GPT starts refreshing viewed slots on back/forward cache navigation
- September 15, 2026: Chrome adds four experimental ad metrics to CrUX
- February 17, 2027: Begin-to-render counting takes effect in AdSense and Ad Manager
Related PPC Land coverage
- Lazy loading implementation causes 20% traffic drop despite PageSpeed gains - An agency case in which a lab score improved while field LCP worsened and traffic fell.
- Google clarifies lazy loading SEO impact in Search Off the Record episode - Martin Splitt and John Mueller on selective deferral, indexing risks and ranking weight.
- AdSense drops unrendered ads from impression counts on February 17, 2027 - The begin-to-render switch and the GPT margins Google ties to it.
- Explaining begin-to-render - The impression counting rule that decides when a lazy-rendered ad exists in the ledger.
- Explaining viewability - The MRC thresholds that made deferring below-the-fold ads commercially attractive.
- Explaining header bidding - Parallel browser auctions and the timeouts that constrain late requests.
- Explaining latency - Delay across bidding, ad delivery and page metrics, and what timeouts cost.
- Explaining wrapper - How header bidding wrappers order requests and why each bidder adds waiting time.
- Explaining Core Web Vitals - LCP, INP and CLS thresholds and the role of ads in layout shift.
- Explaining CrUX - Chrome's field dataset and the INP gains recorded after GPT's out-of-viewport yield change.
- Explaining real user monitoring - How publishers measure the cost of ad tags and wrappers in real sessions.
- Google releases Publisher Ads Audits - The Lighthouse plugin that measures ad speed and ad-driven layout shift.
- Google AdSense pushes bfcache, speculation rules, and AI debugging to publishers - Google's March 2026 revenue case for page performance work.
- Chrome puts publishers' ad loads on public record with 4 new metrics - Ad count, density, processing time and data weight published through CrUX.
- Major browsers achieve cross-platform parity on web performance metrics - Safari, Firefox and Chrome closing the LCP and INP measurement gap.
- Google clarifies JavaScript rendering for error pages in December documentation update - Documentation covering how lazy-loaded images stay discoverable to Googlebot.
- IAB Italia releases digital sustainability white paper addressing carbon emissions - A trade body recommending lazy loading to reduce processor use and emissions.
Summary
Who. Publishers, their ad operations and engineering teams, wrapper vendors and CMS developers configure lazy loading; Google sets its behaviour in GPT and Chrome, and other browser makers in their own engines. Buyers and measurement vendors inherit its effects on impression counts and viewability.
What. A technique that defers requesting and rendering images, iframes and ad slots until they approach the viewport, implemented in ad stacks through GPT's fetch, render and mobile scaling margins, through wrapper logic for header bidding, and in browsers through the loading attribute.
When. Ad industry interest grew with viewability standards from 2014 and the IAB's 2016 primer. GPT added the feature in August 2018, Chrome shipped the loading attribute in 2019, and Google moved GPT's setting to a new configuration API in July 2025. Begin-to-render counting from February 17, 2027 ties it to impression measurement.
Where. On web and mobile web pages, in the browser, between page load and the moment an ad request leaves the device. GPT margins and the loading attribute are web mechanisms; apps and streaming players rely on their own software development kits.
Why. Deferring unreachable content saves bandwidth, processing and energy, improves page speed metrics and lifts viewable rates. Applied to visible content it delays LCP, and set with the wrong margins it costs impressions, auction time and, after the measurement change, counted inventory.
Discussion