Ad tech·8 min read

Chrome's heavy ad intervention: why ads get removed, and how to stay under the limits

Chrome unloads ads that use too much data or processor time before anyone touches them. Here are the exact limits, how to spot it and how to build ads that stay well clear.

Xpeng: Highlights, double midscrollXpeng - HighlightsDouble midscroll · live demo ↗

Chrome's heavy ad intervention unloads an ad that the reader has not interacted with once it uses more than 4 megabytes of network bandwidth, or uses the main thread for more than 60 seconds in total or more than 15 seconds in any 30-second window. The ad's frame is replaced with an "Ad removed" message. The impression is gone, and the reader sees a broken box where your campaign should be.

Chrome shipped the intervention in Chrome 85 and rolled it out gradually through September 2020. This guide covers what Chrome measures, how to tell if it is happening to your ads, and how to build ads that never come close.

Why Chrome removes heavy ads

Ads that use a disproportionate amount of resources hurt the people reading the page: they degrade performance, drain the battery and eat into data allowances. So Chrome sets limits and unloads ads that go over them.

We agree with the principle. An ad that slows down the article it sits in does not _attract_, it _distracts_.

What Chrome counts

An ad is "heavy" only if the reader has not interacted with it and it reaches any one of these limits:

LimitWhat it measures
NetworkMore than 4 megabytes of network bandwidth
CPU, totalThe main thread for more than 60 seconds in total
CPU, peakThe main thread for more than 15 seconds in any 30-second window (50% utilisation over 30 seconds)

A few details matter more than the numbers:

  • Interaction switches it off. Chrome does not apply the intervention to content that has received any user interaction.
  • Everything inside the ad counts. Chrome tags a frame as an ad by matching its resource requests against a filter list. Descendant iframes count towards the same limits.
  • CPU means processing time, not time on screen. The main-thread limits measure how long the ad's code actually runs, not how long the ad has been on the page.
  • The thresholds are fuzzy on purpose. Chrome adds noise to the limits to protect user privacy, so an ad near the line can be removed on one view and survive the next.
  • Slow devices hit the CPU limits first. Chrome's own guidance is that the intervention is far more likely to trigger on lower-powered devices.

Source: Chrome's Handling Heavy Ad Interventions and the Chrome Platform Status entry.

What the reader sees

When Chrome unloads an ad, the content of the ad's iframe is replaced with an "Ad removed" message. A Details link opens the explanation:

This ad uses too many resources for your device, so Chrome removed it. (Chrome, Handling Heavy Ad Interventions)

For the advertiser it is a paid impression that ended as a notice with no brand on it. For the publisher it is a broken slot on their page.

Which ads get hit

Any ad can be removed, but some kinds start much closer to the limits.

  • Video that autoplays. Muted autoplay is the norm in display, and the reader has not interacted, so every byte of video counts towards the 4 MB. A long or looping film can cross the line without anyone touching the ad.
  • High-impact formats. A topscroll, midscroll or double midscroll fills the screen, so it tends to carry bigger images, video and more motion.
  • Heavy JavaScript animation. Chrome calls out poorly optimised animations that cause continuous layout and paint, and costly operations hidden inside an included library.
  • Unoptimised images. Chrome names images and videos that have not been optimised as a common cause of large downloads.
  • Repeated requests. Small requests add up. Chrome advises checking for requests that repeat until they push the ad over the limit.

How to find out if your ads are being removed

A normal ad server report will not show it, because the ad did load. You need the intervention itself.

Intervention reports

Chrome sends an intervention report when it removes a heavy ad. Reports have the type intervention, and the body carries the id HeavyAdIntervention and a message that says which limit was hit, for example "Ad was removed because its CPU usage exceeded the limit" or "Ad was removed because its network usage exceeded the limit".

There are two ways to collect them:

  • HTTP reports. A Report-To response header names an endpoint URL, and Chrome posts the reports there as JSON.
  • ReportingObserver in the ad. Code inside the ad creates a ReportingObserver, and sends any intervention reports home with navigator.sendBeacon(). Chrome also recommends collecting pending reports in a pagehide listener, because a normal fetch() will be cancelled as the ad is unloaded.

If you run campaigns at scale, ask your ad tech partner whether they collect these reports.

Chrome DevTools

To test a single creative, use Chrome DevTools.

  1. In the Rendering panel, turn on Highlight Ad Frames to confirm Chrome treats your frame as an ad.
  2. Set chrome://flags/#heavy-ad-privacy-mitigations to Disabled, so the limits apply exactly, without the privacy noise.
  3. In the Network panel, tick Disable cache, filter to the ad's requests and sort by size to find the heavy and repeated files.
  4. In the Performance panel, turn on CPU throttling to simulate a slower device, record, and sort by Self Time in the Bottom-Up tab to find the code that eats the main thread.

Avoid Chrome's three testing traps: reloading the same ad on the same page, backgrounding the page (which pauses the ad's tasks) and clicking the ad (which exempts it).

How to build ads that stay under the limits

Do not aim for just under 4 MB. Aim for a fraction of it, so the ad survives a slow phone and the privacy noise.

  • Compress every image. Export at the size the format actually shows. As Niclas Rämje notes below, a skilled designer can take images for high-impact creatives down to 50-200 KB with minimal visual loss.
  • Stream video, keep it short and stop it. Do not ship a whole MP4 inside the ad. Fetch video as it plays, use finite loops, and pause when the ad leaves the screen.
  • Save the heavy part for after a tap. Interaction ends the intervention. A short teaser, then the longer film after a tap, is good craft anyway.
  • Use CSS for motion. Transforms and opacity animate cheaply. Stop animations once they have done their job.
  • Drop libraries you do not need. A whole framework for one fade is weight and CPU for nothing.
  • Count every frame. Trackers, players and companion frames inside the ad all count. Audit them like any other asset.
  • Test on a throttled CPU. Follow Chrome's guidance: a slow CPU profile, the cache off, no clicking.

How Madington builds and serves lighter ads

We have built and served high-impact ads for more than 15 years, and weight is always part of the brief. No tool can promise that Chrome will never remove an ad, because the limits depend on the device and on what else the creative loads. What they do is keep the two things Chrome measures, bytes and processor time, low from the start.

Madington Station: smaller files by default

Madington Station optimises and compresses images and videos into streaming, lightweight creatives that adhere to leading publishers' size limits. Our CEO Niclas Rämje tested it on a real case in Let's be mindful in a wasteful industry: a fullscreen desktop ad he found on a premium Swedish publisher weighed 2.7 MB. He dropped the image into Madington Station and had an ad weighing 144 kb, 95% lighter. In another campaign, two images were compressed from 1.3 MB to 0.175 MB.

Every one of those bytes would otherwise count towards the 4 MB before anyone touched the ad. Station also reports CO2 and attention metrics for every ad, so weight stays visible after launch rather than being a one-time check.

Streamed video with Streamedby™

Streaming does not make an ad exempt. Video bytes are network bytes like any other. What streaming changes is _when_ the bytes arrive. Streamed video in Station runs on our own streaming technology, Streamedby™, with one of the smallest video players in the world. Streaming ads only use the data that is actually played, instead of loading the whole file up front. A reader who scrolls past after a few seconds has only loaded those seconds.

A fallback solution is built in, which also works as an energy-saving mode. The rest is up to the creative: short films and finite loops, as our guide to video in display ads explains.

Xpeng - Highlights · Double midscrollXpeng – Highlights: a double midscroll with a full-bleed video background, in a portrait or landscape file picked by screen shape. Madington's player fetches the video in chunks as it plays rather than as one download.Open in the player →
Ad formatDouble midscrollTwo midscrolls stacked on top of each other. As the user scrolls down more content is revealed.

High-impact.js: format code on the publisher's side

High-impact.js is an open-source framework for high-impact formats. It merged Advantage, Madington's open-source initiative, with SeenThis's High Impact JS. Publishers host the code on their own sites, which eliminates reliance on external third-party scripts. The format then runs on code the publisher controls, not on a vendor script that arrives with the ad. More in our field guide to high-impact ads.

MAiKE: HTML ads from your page

MAiKE, our AI banner maker, reads the page you advertise and builds HTML ads in every format you sell, ready to edit.

Frequently asked questions

What is the heavy ad limit in Chrome?

Chrome removes an ad the reader has not interacted with if it uses more than 4 megabytes of network bandwidth, or the main thread for more than 60 seconds in total or more than 15 seconds in any 30-second window.

Why does Chrome say "This ad uses too many resources for your device"?

That is the message shown when Chrome's heavy ad intervention unloads an ad. The ad went over Chrome's network or CPU limits before anyone interacted with it, so Chrome replaced it with an "Ad removed" message.

Does the heavy ad intervention apply to video ads?

Yes. Video downloaded by an ad counts towards the 4 MB network limit, and playing it uses processor time. Streaming video in as it plays, keeping it short and stopping it off-screen keeps the bytes down, but it does not make the ad exempt.

Does interacting with an ad stop the intervention?

Yes. Chrome does not apply the intervention to an ad that has received any user interaction, so a richer experience after a tap is not limited in the same way.

How do I know if Chrome is removing my ads?

Collect Chrome's intervention reports, which carry the id HeavyAdIntervention, through a Report-To endpoint or a ReportingObserver in the ad. To test one creative, use DevTools with the heavy-ad privacy mitigations flag disabled and the CPU throttled.

When did Chrome start removing heavy ads?

The intervention shipped in Chrome 85 and was rolled out gradually through September 2020.