TL;DR
Mobile is roughly 64% of global web traffic, but it converts at about half the rate of desktop, near 2.2% versus 4.3% in many datasets. That gap is not a law of nature; a big slice of it is performance. Only 48% of mobile sites pass all three Core Web Vitals versus 56% on desktop, and mobile bounce rates run about 10 points higher. When load time climbs from 1s to 3s, bounce rises ~32%; at 6s it more than doubles. So your majority traffic channel is also your slowest and leakiest, and most teams still set their performance budgets on a fast desktop in the office. Test on a throttled mid-range phone, because that is where the revenue actually is.
The traffic is mobile; the budget is desktop
There is a structural blind spot in how most teams ship performance. Engineers build and test on fast laptops over office wifi. QA runs on the same. Lighthouse gets run in desktop mode because that is the default a developer reaches for. Meanwhile, per MobiLoud's mobile traffic data, mobile devices account for roughly 64% of global website traffic, and those users are on mid-range Android phones with slower CPUs and flaky cellular connections that look nothing like the dev environment.
So the budget is set for the minority of traffic that has the fastest experience, while the majority of traffic gets whatever falls out. That is exactly backwards. The mobile user is both more numerous and more performance-sensitive, and the gap between how you test and how they experience the site is where conversions quietly disappear. The worst part is that the gap is self-concealing: the people deciding what is "fast enough" never feel the slow experience, because their hardware papers over it.
The conversion gap is partly a performance gap
The mobile conversion shortfall is well documented. Per Fan & Fuel's 2025 mobile-versus-desktop analysis, mobile drives the majority of traffic but converts at roughly half the desktop rate, about 2.2% on mobile against 4.3% on desktop. Some of that is intent (people browse on phones, buy on desktops), but a substantial and recoverable portion is friction: slow loads, layout shifts that cause misclicks, and laggy taps that make checkout feel broken.
The bounce data shows the mechanism. Mobile bounce rates run around 58-60% versus 48-50% on desktop, about a 10-point penalty. And load time is a direct lever on that number: per Bidnamic's page-speed and bounce-rate research, moving from a 1-second to a 3-second load raises bounce by about 32%, and a 6-second load more than doubles it. Every one of those bounces is a mobile user who never reached the part of the funnel where they convert. You cannot win a customer who left before the page finished painting.
The "it's just intent" excuse is worth interrogating, because it is how teams talk themselves out of fixing this. Yes, some mobile browsing is low-intent. But the high-intent mobile sessions, the user who searched for your product, clicked your ad, and is ready to buy, are exactly the ones that abandon when checkout stutters. The portion of the gap that is performance is the portion you can actually recover, and it concentrates in your most valuable sessions.
Mobile fails Core Web Vitals more often, and it's mostly LCP
The field data is unambiguous about which platform struggles. According to the HTTP Archive Web Almanac's 2025 CrUX analysis, about 48% of mobile sites pass all three Core Web Vitals compared with 56% on desktop. The breakdown matters: INP and CLS pass at high rates even on mobile, but LCP is the weak link, only about 62% of mobile sites hit the LCP threshold, dragging the overall pass rate down.
That makes sense once you think about why. LCP is dominated by network and CPU: time to first byte over a cellular connection, then downloading and decoding a hero image, then rendering it. A mid-range phone on LTE is slow at every one of those steps relative to a laptop on fiber. The same page, the same code, the same server, but the mobile user waits twice as long for the main content to appear, and a meaningful fraction of them leave before it does. This is why mobile-specific testing is not optional: the platform that fails most often is the one your tooling is least likely to be measuring.
Test the way your customers experience it
The fix starts with measuring honestly. A lab test that does not emulate a real mobile device is worse than no test, because it gives false confidence. The correct configuration throttles both the CPU and the network to mid-range mobile conditions, so your score reflects the experience of the user who actually matters.
// Lighthouse configured for a REAL mid-range mobile user,
// not a developer's laptop
const config = {
extends: 'lighthouse:default',
settings: {
formFactor: 'mobile',
screenEmulation: { // mid-range phone viewport + DPR
mobile: true, width: 412, height: 823, deviceScaleFactor: 1.75,
},
throttling: {
rttMs: 150, // ~regular 4G latency
throughputKbps: 1638, // ~1.6 Mbps down
cpuSlowdownMultiplier: 4, // mid-range CPU, not your M-series
},
onlyCategories: ['performance'],
},
};
const {lhr} = await lighthouse(url, {port}, config);
console.log('Mobile LCP:', Math.round(lhr.audits['largest-contentful-paint'].numericValue), 'ms');
console.log('Mobile TBT:', Math.round(lhr.audits['total-blocking-time'].numericValue), 'ms');
That cpuSlowdownMultiplier: 4 is the line most teams omit, and it is the most important one. A modern dev laptop is so much faster than a real phone that JavaScript-heavy pages look fine in unthrottled tests and fall apart on actual devices. Throttle the CPU and the truth comes out. If you can, supplement lab emulation with a real-device test on an actual mid-tier Android, emulation is close but the real thing surfaces thermal throttling and memory pressure that emulators miss.
Where the mobile wins are
Because mobile LCP is the dominant failure, the highest-leverage fixes target it directly.
The hero image is usually the LCP element
On most pages the largest contentful paint is the hero image. Serve it in a next-gen format (AVIF or WebP), size it for the mobile viewport instead of shipping a 2,000px desktop image to a 412px screen, set explicit dimensions to avoid CLS, and preload it so the download starts immediately. Use responsive srcset so the phone downloads a phone-sized image, not the desktop one scaled down. This one element often moves mobile LCP more than everything else combined.
<!-- Ship a phone-sized hero, preloaded, in a modern format -->
<link rel="preload" as="image"
href="/hero-412.avif" imagesrcset="/hero-412.avif 412w, /hero-828.avif 828w">
<img src="/hero-412.avif"
srcset="/hero-412.avif 412w, /hero-828.avif 828w, /hero-1600.avif 1600w"
sizes="100vw" width="412" height="232" alt="..." fetchpriority="high">
TTFB caps everything
Over a cellular connection, a slow server response is amplified. If your TTFB is 800ms on a fast desktop test, it is worse in the field, and it eats most of the 2.5-second LCP budget before any rendering happens. Mobile performance and server performance are the same problem viewed from two angles, you cannot fix mobile LCP without first fixing the first byte.
JavaScript is heavier on a slow CPU
The 4x CPU slowdown is real: parsing, compiling, and executing your bundle takes four times as long on a mid-range phone. That is why mobile INP is more fragile than desktop INP. Code-split, defer non-critical scripts, and trim third-party tags, the cost of every kilobyte of JavaScript is multiplied on the device most of your users hold. A bundle that compiles in 100ms on your laptop is 400ms of blocked main thread on their phone.
Make the mobile budget the real budget
The organizational fix is to stop treating mobile as a secondary check and make the throttled-mobile score the number that governs releases. That means a CI gate that runs Lighthouse in mobile-throttled mode and fails the build when mobile LCP or INP regresses past budget, not a desktop run that passes while real users suffer. When the metric that blocks deploys is the mobile metric, engineering naturally optimizes for the platform where the traffic and the revenue live.
# CI gate keyed to the MOBILE experience, where the revenue is
const MOBILE_LCP_BUDGET = 2500; // ms, the "good" threshold
const MOBILE_INP_BUDGET = 200;
const m = lhr.audits;
const lcp = m['largest-contentful-paint'].numericValue;
const tbt = m['total-blocking-time'].numericValue; // INP proxy in lab
if (lcp > MOBILE_LCP_BUDGET) fail(`Mobile LCP ${Math.round(lcp)}ms over budget`);
if (tbt > 200) fail(`High TBT ${Math.round(tbt)}ms risks INP > ${MOBILE_INP_BUDGET}ms`);
Pair the lab gate with field monitoring segmented by device class, so you can see your 75th-percentile mobile experience separately from desktop. An aggregate CWV number that mixes a fast desktop majority with a slow mobile reality hides exactly the problem you are trying to find. Segment the data, and the mobile gap becomes a number leadership can act on.
The bottom line
Mobile is where the majority of your traffic is, where Core Web Vitals fail most often, where bounce rates are highest, and where conversions trail desktop by roughly half, and yet it is where most teams test least realistically. The recoverable part of that conversion gap is performance, and it is dominated by mobile LCP: slow TTFB over cellular, oversized hero images, and JavaScript that is four times heavier on a real CPU. Test on a throttled mid-range phone, fix the LCP element and the server first, segment your field data by device, and make the mobile-throttled score the gate that governs releases. A mobile-emulated scan of your top templates is the fastest way to see the revenue your desktop tooling has been hiding.
Find the Gaps Before They Cost You
Scan audits your site for the accessibility, performance, AEO, and security gaps that quietly drain revenue and invite lawsuits, in one pass.
Try Scan Free →