/ โ† Core Web Vitals Fixes / Mobile-Only Failures
In this guide
  1. Why mobile fails when desktop passes
  2. Reading the mobile numbers
  3. Testing like a real phone
  4. The fix, step by step
  5. Images for phones: the markup that matters
  6. Edge cases
  7. Keeping mobile passing
  8. Questions and answers

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 phonesMetric it hurtsWhy
Slower processorINP, and LCP on script-heavy pagesThe 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 connectionLCPConnection set-up, redirects and large files all take longer on mobile data, especially with a weak signal.
Narrow, tall screenLCPA different element may be the largest thing in view, for example a heading instead of a wide banner image.
Single-column layoutCLSAnything that grows pushes all the content below it, and a shift covers a bigger share of the viewport.
Mobile-only featuresCLS and INPSticky "call now" bars, app install prompts, off-canvas menus and mobile ad formats exist only on small screens.
Images chosen for desktopLCPA 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.

๐Ÿ’ก Google uses mobile-first indexing for the web, so the mobile version of your page is the one it primarily crawls. Mobile page experience is therefore the version most worth getting right.

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:

โš ๏ธ An iPhone is a poor stand-in for your average mobile visitor's performance. Recent iPhones have fast processors, and the Chrome UX Report is built from Chrome users, most of whom on mobile use Android devices across a wide range of prices. Test on a mid-range Android phone where you can.

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.

โš ๏ธ Avoid hiding a desktop hero with CSS and showing a separate mobile hero. Both are usually downloaded, and the mobile one is often discovered later because it sits in a different part of the page.

Edge cases

Keeping mobile passing

For the individual metrics, see slow LCP, poor INP and layout shift. Sizing and format questions are covered in the image optimisation fixes.

Questions and answers

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.

Compare your mobile and desktop results

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 โ†’
๐Ÿ’ฌ Got a problem?
Related Guides: All Core Web Vitals Fixes  ·  CrUX vs Lab Mismatch  ·  CLS from Responsive Image Swap  ·  Oversized Images  ·  Learning Hub

About aiwebpageseo

aiwebpageseo.com is a data-driven SEO and AEO (Answer Engine Optimisation) platform providing a free suite of technical SEO tools. Rather than relying on AI-theorised assumptions, the platform analyses live URL performance, delivering objective diagnostics, page speed metrics, CLS debugging, and site crawl data alongside actionable technical tutorials.