Fixing Mobile-Only Core Web Vitals Failures
It is common for a page to pass Core Web Vitals on desktop and fail on mobile, even though it is the same URL with the same code.
Phones have slower processors, less reliable connections and narrower screens, and each of those changes which element counts as the main content, how long scripts take and how far a late banner pushes the page. Google assesses mobile and desktop separately, and most sites now get more visits from phones. This guide shows how to test the way a real phone behaves, find what differs on mobile, and fix it.
Why mobile fails when desktop passes
The thresholds are the same on both: LCP at 2.5 seconds or less, INP at 200 milliseconds or less and CLS at 0.1 or less, each at the 75th percentile of real visits. What changes is the visitor's hardware and screen, and those change every metric in a different way.
| Difference on phones | Metric it hurts | Why |
|---|---|---|
| Slower processor | INP, and LCP on script-heavy pages | The same JavaScript takes several times longer to parse and run on a mid-range phone than on a laptop, so tasks that were short on desktop become long tasks. |
| Slower, less stable connection | LCP | Connection set-up, redirects and large files all take longer on mobile data, especially with a weak signal. |
| Narrow, tall screen | LCP | A different element may be the largest thing in view, for example a heading instead of a wide banner image. |
| Single-column layout | CLS | Anything that grows pushes all the content below it, and a shift covers a bigger share of the viewport. |
| Mobile-only features | CLS and INP | Sticky "call now" bars, app install prompts, off-canvas menus and mobile ad formats exist only on small screens. |
| Images chosen for desktop | LCP | A theme that sends the same 2,000 pixel image to every device makes phones download far more than they can show. |
Because the causes differ, a single "mobile speed" fix rarely works. Find out which metric fails on mobile first, then look at the rows in this table that apply to it.
Reading the mobile numbers
Check which metric fails, and how widely
The Core Web Vitals checker shows field data for mobile and desktop side by side. Look at each metric separately: a mobile failure driven only by INP needs different work from one driven by LCP. In Search Console, the Core Web Vitals report has a separate Mobile section; open it and look at which issue each URL group has, such as "LCP issue: longer than 2.5s (mobile)".
Why a lab test on your desktop misleads you
Loading the page on a fast laptop with the window made narrow tests the layout, not the performance. Your laptop's processor, memory and connection are still much faster than a typical phone. The mobile test in PageSpeed Insights and Lighthouse applies simulated throttling to approximate a mid-range phone on a slow mobile connection, which is closer, but it is still one simulated load with no scrolling or tapping.
Look for mobile-only elements
Open the page in DevTools device mode at a phone width, such as 390 or 412 pixels wide, and list anything that appears only there: a sticky footer bar, a hamburger menu, a different hero, a cookie banner that takes half the screen, an app install banner or an anchored mobile advert. These are the usual suspects for mobile-only CLS and INP.
Collect real-device data
If you already collect Core Web Vitals with the web-vitals library, add the viewport
width or a device category to each report. Splitting results by width often shows that one breakpoint,
such as small phones under 400 pixels, accounts for most failures.
import { onLCP, onINP, onCLS } from 'web-vitals/attribution';
function report(metric) {
sendToAnalytics({
name: metric.name,
value: metric.value,
rating: metric.rating,
width: window.innerWidth,
cores: navigator.hardwareConcurrency || null,
connection: navigator.connection ? navigator.connection.effectiveType : null
});
}
onLCP(report); onINP(report); onCLS(report);
The connection details are not available in every browser, so treat them as a hint rather than a complete picture.
Testing like a real phone
The most reliable test is a real mid-range Android phone connected to your computer. In Chrome on
the computer, open chrome://inspect, enable USB debugging on the phone, and you can run
the full DevTools Performance panel against the page running on the phone itself. Recordings from real
hardware show the actual script timings and the actual LCP element.
If you do not have a suitable phone, use DevTools on your computer with these settings together:
- Device mode at a common phone width, with touch input.
- CPU throttling at a 4x or 6x slowdown in the Performance panel settings. Recent Chrome versions can suggest a calibrated setting for a mid-tier or low-tier mobile device.
- Network throttling on a slow 4G or "Fast 3G" profile.
- Disable cache ticked, and a fresh profile or guest window so no cookies or consent choices are stored.
The fix, step by step
Step 1
Compare mobile and desktop field results
Run your key pages through the Core Web Vitals checker and write down the mobile and desktop field result for LCP, INP and CLS side by side. Mark which metrics fail only on mobile. Then open the Mobile section of the Search Console Core Web Vitals report and see which URL groups carry each issue. The combination of failing metric and affected template tells you where to work, and stops you optimising a metric that already passes on phones.
Step 2
Test under realistic phone conditions
Connect
a mid-range Android phone and use chrome://inspect to record the page with the DevTools
Performance panel running on the device. Without a phone, use device mode at a width of about 390 pixels
with a 4x or 6x CPU slowdown, a slow 4G network profile and the cache disabled. Load the page as a first-time
visitor, then scroll and tap the main controls, since mobile CLS and INP often happen after load.
Step 3
Identify the mobile LCP element
In
the phone recording, select the LCP marker in the Timings track to see which element it is, and compare
it with the desktop LCP element. They often differ: a desktop banner image may be replaced by a large
heading, or by a separate mobile hero image that is only discovered late through CSS. Whatever the mobile
LCP element is, make sure it is in the HTML, not lazy-loaded, and requested early with fetchpriority="high"
if it is an image.
Step 4
Send phones smaller images and less code
Give content images a srcset with several widths and an accurate sizes
attribute, so a phone downloads a file close to its screen width rather than the desktop original. Check
that images hidden on mobile with display: none are not still downloaded; use a picture
element with media conditions instead. Load scripts for desktop-only features, such as a large mega-menu
or hover previews, only when the screen is wide enough to need them.
Step 5
Fix layout that only shifts on narrow screens
Turn on Layout Shift Regions in the DevTools Rendering tab at a phone width, reload on a slow connection and scroll. Common mobile-only shifts come from sticky bars that appear after a delay, banners inserted above the header, anchored adverts, headings that wrap to an extra line when the web font arrives, and reserved heights that are right on desktop but wrong at narrow widths. Reserve space per breakpoint or overlay the element instead.
Step 6
Lighten the main thread for slower processors
Expand the long tasks in the phone recording and note which scripts own them. Remove third-party tags nobody uses, load chat and review widgets only when needed, split large bundles so each page loads only its own code, and break long start-up work into smaller pieces. Test the hamburger menu, filters and add-to-basket buttons specifically, because a handler that takes 60 milliseconds on a laptop can take several hundred on a budget phone.
Step 7
Verify on a real phone and in field data
Record the same journey again on the phone or with the same throttling settings and compare the LCP time, the longest interactions and the shift regions with your first recording. Deploy the change to the whole template, then watch mobile results in your own real-user data, split by viewport width. The Chrome UX Report and Search Console reflect the change over a rolling 28 days, so check the mobile report again after about four weeks.
Images for phones: the markup that matters
Oversized images are the most common reason mobile LCP is slower than it should be. The browser can only choose a sensible file if you offer several and tell it how wide the image will be displayed.
<img
src="/img/walled-garden-800.jpg"
srcset="/img/walled-garden-480.jpg 480w,
/img/walled-garden-800.jpg 800w,
/img/walled-garden-1200.jpg 1200w,
/img/walled-garden-1800.jpg 1800w"
sizes="(min-width: 1024px) 50vw, 100vw"
width="1800" height="1200"
alt="Walled garden in early summer"
fetchpriority="high">
Here a phone showing the image full width picks a file close to its screen width multiplied by its
pixel density, instead of the 1,800 pixel version. The width and height attributes give the browser the
shape so it can reserve space, and fetchpriority="high" is used only because this is the
hero.
Different images per screen size
When the mobile hero is a different crop or a different picture, use picture so only the right one is downloaded:
<picture>
<source media="(max-width: 600px)" srcset="/img/hero-portrait-600.webp" width="600" height="750">
<img src="/img/hero-wide-1600.webp" width="1600" height="700" alt="Workshop bench with tools" fetchpriority="high">
</picture>
Giving each source its own width and height lets the browser reserve the right shape
on each screen, which avoids a shift when the portrait crop is taller than the desktop one.
Edge cases
- Tablets. The Chrome UX Report records tablets separately, but Search Console's report is split into mobile and desktop only. Do not be surprised if a tablet layout issue is hard to see in Search Console.
- Interstitials and pop-ups. A pop-up that covers the page on mobile is a poor experience and can be a layout shift if it pushes content rather than overlaying it. It can also be the element measured as LCP if it is large and appears early.
- Separate mobile sites. Sites that still serve a separate m-dot version have their own URLs and their own field data. Fix each version, or move to a single responsive site.
- AMP pages. Where AMP versions still exist, visitors from some sources may land on them. Their performance is measured under the AMP URL, not your main page.
- Low traffic on mobile. If mobile has no URL-level field data, Search Console may use grouped or origin-level figures. Use your own real-user data for individual pages.
Keeping mobile passing
- Test on a phone before every release of a new template, section or third-party tool, with CPU throttling if you cannot use real hardware.
- Design mobile first. Decide what the mobile visitor sees in the first screen and make that light, then add desktop extras.
- Keep a per-breakpoint image policy so editors cannot upload a single enormous image that every device downloads.
- Track mobile results separately in your own reporting, split by viewport width.
For the individual metrics, see slow LCP, poor INP and layout shift. Sizing and format questions are covered in the image optimisation fixes.
1. Why do my Core Web Vitals pass on desktop but fail on mobile?
Phones have slower processors, slower and less stable connections and narrower screens. The same JavaScript takes longer to run, which hurts INP; large images and redirects take longer to download, which hurts LCP; and in a single-column layout anything that grows pushes the whole page down, which hurts CLS. Mobile-only features such as sticky bars and mobile adverts add their own problems. Check which metric fails on mobile before deciding on a fix.
2. Does Google use mobile or desktop Core Web Vitals for ranking?
Google assesses mobile and desktop page experience separately, and Search Console reports them separately. Since Google uses mobile-first indexing, the mobile version of your page is the one it primarily crawls and indexes, so mobile results deserve the most attention. Core Web Vitals are one signal among many and do not outweigh relevant, helpful content, but a page that fails on phones gives up a possible advantage with most of your visitors.
3. Is testing in Chrome's device mode enough?
Device mode on its own only changes the screen size and simulates touch. Your laptop's processor, memory and network are still much faster than a typical phone, so timings will look far better than reality. Turn on CPU throttling and network throttling as well, and disable the cache. For the most accurate picture, connect a real mid-range Android phone and record with remote debugging through chrome://inspect, which shows true timings from the device itself.
4. Why is my mobile LCP element different from desktop?
LCP is the largest image or text block visible in the first screen, and what is largest depends on the layout. On a phone a wide banner image may be shown small or hidden, so a large heading or paragraph becomes the LCP element. Some themes also show a separate mobile hero loaded through CSS, which the browser discovers late. Check the LCP element on a phone recording and optimise that element, not the desktop one.
5. Should I test on an iPhone?
An iPhone is fine for checking layout, but it is not a good guide to how most mobile Chrome users experience your page. Recent iPhones have very fast processors, and the Chrome UX Report that feeds Search Console is collected from Chrome users, many of whom are on mid-range or budget Android phones. Test on a mid-range Android phone, or use CPU throttling in Chrome DevTools, to see the conditions most likely to fail.
6. Do responsive images really make a difference to mobile LCP?
Often, yes. If a theme sends the same large image to every device, a phone downloads a file several times bigger than it can display, and on a slow connection that directly delays LCP when the image is the main element. A srcset with several widths and an accurate sizes attribute lets the browser choose a suitable file. Serving modern formats such as WebP or AVIF reduces the size further without a visible loss of quality.
7. How long before mobile results improve in Search Console?
Search Console uses the Chrome UX Report, which covers a rolling 28-day window of real visits. After you deploy a fix, the mobile figures improve gradually as older visits drop out, and can take close to four weeks to fully reflect the change. Your own real-user reporting, split by viewport width, will show the effect within days. Start validation in the mobile report once the fix is live on every page in the affected group.
The Core Web Vitals checker shows real-user field data and a Lighthouse lab test side by side for your URL, breaks down each metric and points to the assets and code behind every failure, so you can see which metric fails for phone visitors.
Open Core Web Vitals Fixes โ