NO_LCP Error in Lighthouse and PageSpeed Insights: How to Fix It
When Lighthouse or PageSpeed Insights shows the NO_LCP error, the test ran but never recorded a Largest Contentful Paint, so it cannot give you a performance score at all. This is not a slow result; it is a failed measurement. Either your page painted nothing the browser counts as contentful, it painted too late for the test, or the test was shown a different page, such as a firewall challenge or an error, instead of your real content. Because LCP is one of the Core Web Vitals, a page that keeps failing this way leaves you blind to how it performs. This guide explains what the error means, how to work out which of those three situations you are in, and the specific changes that give Lighthouse something it can measure again.
What the NO_LCP error means
Lighthouse is the testing engine behind PageSpeed Insights and the Lighthouse panel in Chrome DevTools. It loads your page in a controlled browser and listens for the browser's own performance events. One of those is the largest-contentful-paint event, which the browser fires each time a larger image or block of text appears in the viewport. If the load finishes and that event never fired, Lighthouse reports an error instead of a score. The message reads along these lines:
The page did not display content that qualifies as a Largest Contentful Paint (LCP).
Ensure the page has a valid LCP element and then try again. (NO_LCP)
Because LCP carries a large share of the performance score, Lighthouse cannot produce that score without it. The other categories, such as accessibility and SEO, usually still run, which is why you can see those numbers next to an empty performance gauge.
A close relative is NO_FCP, which means the page did not paint any content at all, not even a first contentful paint. NO_FCP usually points to a blank page, a page that never finished loading or a browser tab that was in the background during a local test. NO_LCP means something may have painted, but nothing that qualified as the largest contentful element. The causes overlap, so the checks below cover both.
Remember that a lab error is not the same as a field failure. The Core Web Vitals assessment in PageSpeed Insights comes from real Chrome users. If real visitors have LCP data and only the lab test fails, the page is working for people and the problem is the test conditions. The LCP guide explains how the metric is measured in full.
Why Lighthouse finds no LCP element
Almost every NO_LCP case falls into one of three groups: the test saw the wrong page, your content was not counted as painted, or the content arrived too late. This table lists the common causes and how to spot each one.
| Cause | What you see | Where to look |
|---|---|---|
| Firewall or bot challenge | Final screenshot shows a check or challenge screen | CDN or WAF event log, server logs |
| Full-screen consent wall or popup | Screenshot shows only an overlay | Consent platform settings |
Content starts at opacity: 0 or hidden | Blank frames, then content late or never | Theme CSS, animation library settings |
| Full-page loader or splash screen | Spinner in every filmstrip frame | Theme options, page builder settings |
| Page built entirely by JavaScript | Empty frames until a large bundle runs | View source: an almost empty body |
| Extremely slow load or timeout | Many seconds of white screen, then an error | TTFB, page weight, third-party scripts |
| Error page served to the test | A 403, 503 or maintenance page in the screenshot | Server status codes, security plugins |
Note what does not count as an LCP candidate. Elements with zero opacity, elements outside the viewport, and images that cover the whole viewport and look like a background can be ignored by Chrome, and very low-detail placeholder images are also excluded. A page whose first screen is only a solid block, a gradient or a decorative full-screen image can therefore end up with no candidate at all.
How to see what Lighthouse actually saw
The fastest clue is in the report itself. In PageSpeed Insights, scroll to the filmstrip of screenshots under the lab section and look at the final screenshot. In the DevTools Lighthouse panel the same filmstrip appears near the top of the performance results. Ask one question: is that your real page?
- A challenge, captcha or access denied screen means bot protection stopped the test. See fixing 403 Forbidden errors if the server itself is refusing the request.
- A white or empty frame throughout means nothing painted. Look at hidden content, loaders and JavaScript rendering.
- Only a cookie banner or popup means the overlay covered the content. Consent tools that dim and block the whole screen are a common cause.
- Your real page means the content painted but was not counted. Hidden-on-load styles are the usual reason.
Check the server logs for the test request
PageSpeed Insights sends requests with a user agent containing Chrome-Lighthouse. Search your access log for it at the time of the run and read the status code. On a Plesk server the logs sit under the domain's system folder:
sudo grep "Chrome-Lighthouse" /var/www/vhosts/system/example.com/logs/access_ssl_log | tail -n 20
A 200 for the page means the server answered normally. A 403, 429 or 503, or no line at all, means something in front of or on the server is blocking the test. No line at all usually means a CDN or firewall answered before the request reached you.
Watch the paint events yourself
Open the page in Chrome, open DevTools, go to the Console and paste this before reloading:
new PerformanceObserver((list) => {
for (const e of list.getEntries()) {
console.log('LCP candidate', Math.round(e.startTime), 'ms', e.element);
}
}).observe({ type: 'largest-contentful-paint', buffered: true });
If nothing is logged after the page has fully loaded, your browser also found no candidate, and the cause is in the page rather than the test. If candidates are logged locally but PageSpeed Insights still fails, the cause is the test conditions or something that treats Google's servers differently.
Bot protection, consent walls and slow loads
Security services are built to stop automated traffic, and Lighthouse is automated traffic. Cloudflare Bot Fight Mode, managed challenges, country blocks, rate limits and security plugins such as Wordfence can all show the test a challenge instead of your page. PageSpeed Insights runs from Google's servers in a few regions, so a rule that blocks traffic from certain countries can catch it even when your local test passes.
Your options, from simplest to most targeted:
- Look in the firewall's event log for blocked or challenged requests at the exact time of your test and note which rule fired.
- Relax that rule, or add a skip rule for the test. In Cloudflare, a custom rule matching
http.user_agent contains "Chrome-Lighthouse"with the Skip action can bypass specific security features. - Keep the skip rule narrow, for example to the paths you test, because user agents are easy to fake.
Consent banners
A cookie banner that fills the whole viewport, or dims the page and blocks it behind a modal, can become the only visible content or hide everything else. Use a banner that sits at the bottom of the screen and leaves the page content visible. This also reduces layout problems covered in the banner layout shift guide.
When the page is simply too slow
Lighthouse waits a limited time for the page to load before giving up. If your page takes more than ten seconds to show anything under mobile throttling, NO_LCP can be the symptom of a page that is far too slow. Measure the server response first with the high TTFB guide, then work through render-blocking resources.
A worked example
A small agency launches a landing page for a client. Every PageSpeed Insights run on mobile fails with NO_LCP, while desktop sometimes scores in the 70s. The final screenshot on mobile shows the real page, so the test was not blocked.
Running the console observer locally with 4x CPU slowdown and Slow 4G throttling in DevTools logs no LCP candidate until several seconds in, and sometimes none. The theme CSS contains .hero { opacity: 0 }, and an animation library adds a class to fade the hero in once its script has loaded. That library loads from a third-party host after two other scripts.
The fix is two lines of CSS: remove the starting opacity from the hero and turn off the fade on the heading and hero image. The library still animates sections lower down. The next five mobile runs all return a score, with a measured LCP of 2.9 seconds, which gives the team a real number to improve rather than an error.
The fix, step by step
Step 1
Read the final screenshot
Run PageSpeed Insights on the failing URL with the mobile test selected and scroll to the filmstrip of screenshots. Look closely at the final frame. If it shows a challenge screen, an error page or only a cookie banner, the test never reached your real content and the fix lies outside the page code. If it shows your real page, the content painted but was not counted. Write down what you see, because it decides which of the following steps matter most for this page.
Step 2
Check the logs for the test
Search your server access log for Chrome-Lighthouse at the time of the test and read the status code on the request for the page. On Plesk, use grep on the domain's access_ssl_log. A 200 response means the server answered normally. A 403, 429 or 503, or no matching line at all, means something blocked the request. No line usually means a CDN or firewall answered before your server saw anything. Confirm by repeating the test and watching for a fresh line.
Step 3
Allow the test past bot protection
Open the event log in your CDN, firewall or security plugin and find blocked or challenged requests at the time of the run. Note the rule that fired. Relax it, or add a narrow skip rule for requests whose user agent contains Chrome-Lighthouse, limited to the paths you test. Avoid turning off protection for the whole site. Run PageSpeed Insights again and confirm the final screenshot now shows your real page and the log shows a 200 response.
Step 4
Remove hidden-on-load styles
Inspect the hero section in Chrome DevTools and look at the computed styles on first load. Remove any opacity: 0, visibility: hidden or display: none that applies to the main heading, hero image or their wrapper before a script reveals them. Turn off fade-in or entrance animations for above-the-fold content in your theme or page builder. Reload with throttling on and confirm with the console observer that an LCP candidate is logged within the first few seconds.
Step 5
Turn off full-screen loaders
Check your theme or page builder settings for a preloader, splash screen or page transition option and switch it off. These cover the whole viewport with a spinner until the load event, which under mobile throttling can take many seconds. Also check that your consent banner sits at the bottom of the screen rather than blocking the page behind a full-screen modal. Run the test again and confirm the filmstrip shows real content in the early frames instead of a spinner or overlay.
Step 6
Send the main content in the HTML
View the page source with view-source: in Chrome and check that the main heading and first image appear in the HTML itself. If the body is only an empty root element and script tags, the page depends on JavaScript to show anything. Switch on server-side rendering or static generation in your framework, or at least output the heading and hero image on the server. Confirm by viewing source again and by checking that DevTools logs an early LCP candidate.
Step 7
Fix extreme slowness
If the page now loads the right content but still takes many seconds to show it, the speed is the problem. Measure server response time with curl using time_starttransfer, and look at the Performance panel for long scripts and large files before the first paint. Fix the slowest part first, usually the server response or render-blocking files in the head. Rerun Lighthouse and confirm it now reports a numeric LCP value instead of an error.
Step 8
Compare local and remote tests
Run Lighthouse from the DevTools panel in a guest window with extensions off, then run PageSpeed Insights on the same URL. Keep the tab in the foreground during the local run. If both return a score, the issue is fixed. If only the local test works, something still treats Google's servers differently, so go back to the firewall logs. Finally, run PageSpeed Insights five times and confirm every run returns a performance score.
Edge cases worth knowing
- Intermittent errors. One NO_LCP among several normal runs usually means an occasional block, a rate limit or a slow third party, not the page design. Run the test five times and look at the pattern.
- Background tabs. When you run Lighthouse in DevTools, keep the tab in the foreground. Chrome slows down painting in hidden tabs, which can produce NO_FCP or NO_LCP on a page that is fine.
- Browser extensions. Ad blockers and other extensions can change the page in a local test. Use a guest profile or an incognito window with extensions turned off.
- Text in images or canvas. Content drawn in a
canvaselement is not an LCP candidate. A hero made entirely of canvas or WebGL can leave nothing to measure; put the main heading in HTML text. - Videos without a poster. Add a
posterimage to a hero video so there is an image the browser can count while the video loads. - Interstitial redirects. If the test URL redirects to a login, region selector or age gate, Lighthouse measures that page instead.
Keeping it fixed
Make a short rule for anyone who edits the site: the main heading and hero image must be visible from the first paint, with no fade-in, preloader or full-screen overlay. Most NO_LCP errors come back when a new theme, page builder template or animation setting quietly brings one of those back.
After any change to your firewall, CDN or security plugin, run PageSpeed Insights on your key templates and check the filmstrip. Keep the skip rule for the test documented so it is not removed by accident. Check the Core Web Vitals report in Google Search Console every month as well; field data there tells you whether real visitors are affected, which the lab test alone cannot. For wider monitoring of your templates, see fixing a failed Core Web Vitals assessment.
1. What does NO_LCP mean in PageSpeed Insights?
NO_LCP means Lighthouse loaded your page but never recorded a Largest Contentful Paint, so it could not calculate a performance score. It is a failed measurement rather than a bad score. The usual reasons are that the test was shown a challenge or error page, that your main content was hidden when it first painted, or that the page took so long to show anything that the test gave up. The final screenshot in the report usually tells you which of these happened.
2. Is NO_LCP bad for SEO?
NO_LCP in a lab test does not directly affect rankings, because Google uses field data from real Chrome users for Core Web Vitals, not your Lighthouse runs. However, the causes often matter. If a firewall blocks Google's test servers, it might also challenge other legitimate automated visitors, and content hidden on load is slow for real people too. Treat the error as a sign to check both the test conditions and the experience of real visitors on slow phones.
3. Why does PageSpeed Insights fail when Lighthouse in Chrome works?
This usually happens because something treats Google's test servers differently from your own browser. Bot protection, country blocks and rate limits are the common culprits, since PageSpeed Insights runs from Google's data centres and identifies itself as Lighthouse. Your local DevTools test runs from your own connection, often with cookies that already passed a challenge. Check your firewall or CDN event log at the time of the PageSpeed Insights run to find the rule that blocked it.
4. Can a fade-in animation cause NO_LCP?
Yes, a fade-in on the hero is one of the most common causes. If the main heading or image starts with zero opacity and a script fades it in later, the browser does not count it as painted while it is invisible. Under slow test conditions the script can run late, so the content is counted very late or not at all. Keep above-the-fold content fully visible from the first paint and save entrance animations for sections further down the page.
5. What is the difference between NO_FCP and NO_LCP?
NO_FCP means the page did not paint any content at all, while NO_LCP means no content qualified as the largest contentful element. NO_FCP points to a completely blank page, a page that never loaded, an error before rendering or a local test run in a background tab. NO_LCP can happen even when something painted, for example when the only visible items are invisible elements, a canvas or a full-screen background. The causes overlap, so the same checks help with both errors.
6. Should I allow Lighthouse through my firewall?
Allowing the test through is reasonable if you keep the exception narrow. Add a rule that skips the specific security feature blocking it, matched on the Chrome-Lighthouse user agent and limited to the pages you test, rather than turning protection off. User agents can be faked, so do not give this traffic wider access than needed. An alternative is to test from DevTools on your own machine, but you then lose the convenience of PageSpeed Insights for checking from Google's servers.
7. Why do I only get NO_LCP on some runs?
An error that appears on some runs but not others usually means an intermittent cause rather than a fault in the page design. Rate limiting after several quick tests, a slow third-party script that sometimes stalls, a server that is overloaded at busy times or a firewall that challenges only some requests can all do this. Run the test several times, note when it fails, and compare those times with your server and firewall logs to find the pattern.
The Core Web Vitals checker on aiwebpageseo.com shows the LCP element, field results and lab timings for any URL, so you can see straight away whether a page is measurable and what is slowing it down.
Open Core Web Vitals Fixes โ