Why mobile is a different discipline than desktop
Most Magento themes are built for desktop. Mobile gets a responsive layer on top, but the underlying JavaScript bundle, image approach and tap interactions stay desktop-first. That has concrete consequences you do not see with a mouse click, but do feel on a phone.
- ▸CPU budget: PSI lab simulates mobile with 4x CPU throttle. A mid-range Android phone has literally a quarter of the processing power a desktop browser has. JavaScript that parses in 200ms on desktop takes a second or more on mobile.
- ▸Network context: Slow 4G in PSI lab is 1.6 Mbps download, 750 kbps upload, 150ms RTT. That sounds fast, but a Magento page with 400 kB of JS plus images without mobile-specific variants makes every kilobyte noticeable.
- ▸Input mode: on mobile you tap, on desktop you click. A 32x20px button is clickable with a mouse. That same button is unusable on a phone. WCAG 2.5.5 defines 44x44px as the recommended minimum for touch targets.
- ▸Viewport behaviour: a missing or incorrect viewport meta tag causes mobile browsers to simulate a desktop width and zoom out. That gives a desktop layout on mobile, complete with horizontal scroll.
- ▸CrUX split: Google splits Core Web Vitals into mobile and desktop. The mobile CrUX data weighs more heavily in rankings for mobile searches. A good desktop score does not cover the mobile ranking.
These are not edge cases. On a store with more than 50% mobile traffic, the mobile experience determines the majority of conversion and ranking.
My approach to a mobile Magento audit
I do not start with DevTools on desktop. A mobile audit requires mobile measurement points.
- ▸Lighthouse mobile via PSI API: I run multiple measurements on the same day, on homepage, category page and product page. Lab variance on mobile is high. Two measurements on the same URL at the same time can differ by 10 to 20 points due to CPU scheduling on the Google server.
- ▸CrUX mobile dashboard: Google Search Console shows Core Web Vitals per page type, split by mobile and desktop. This is the source of truth. I check whether mobile and desktop show a structural difference, and on which metric (LCP, INP, CLS).
- ▸Visual flow on a real device: I test on a physical mid-range Android with Chrome. Not on a DevTools emulation. Emulation simulates the screen size but not the GPU performance or touch latency of real hardware.
- ▸Tap target audit with Lighthouse accessibility checks: I note all elements smaller than 24x24px (WCAG 2.5.8 minimum) or 44x44px (WCAG 2.5.5 recommended). On Magento stores, plus/minus buttons in the cart, filter chips and hamburger menu items are common offenders.
- ▸Viewport meta tag check: is the tag missing, set to content='width=1024' or incorrectly overridden by a third-party extension? I check per page type.
- ▸JS execution budget analysis: which scripts run on mobile that are only relevant for desktop? Hover-effect widgets, flyout menus and tooltip handlers consume JS budget on mobile without adding value.
The audit produces a ranked list of mobile-specific bottlenecks, sorted by impact on mobile CrUX, not by how easy they are to fix.
What I typically fix on Magento for mobile
After the audit I implement the fixes with the highest impact. On mobile, it almost always involves a combination of the following:
- ▸Mobile-specific image variants via picture + srcset: the desktop hero at 1400px wide serves no purpose on a 390px wide screen. I add picture source elements with smaller variants so mobile loads a 600px wide WebP instead of the full desktop version.
- ▸font-display: swap on all web fonts: if a web font loads on a slow connection, without font-display:swap it blocks text rendering. On mobile with Slow 4G this is noticeable in the user experience.
- ▸Defer non-essential JS via media query: scripts that are only relevant for desktop (flyout nav, hover-intent, complex tooltip libraries) can be deferred or loaded only on media: (min-width: 1024px). That gives the mobile main thread room to breathe.
- ▸Sticky cart button with safe-area-inset: on devices with a notch or home indicator (iPhone with Face ID, Android with navigation bar) a sticky call-to-action needs padding-bottom: env(safe-area-inset-bottom), otherwise it overlaps with the system interface.
- ▸Tap target enlargements: plus/minus buttons in the cart, filter tags, social share buttons. I increase the clickable zone via padding or min-height/min-width without breaking the visual design.
- ▸Clean up hide-on-mobile patterns: elements with display:none on mobile that are still loaded, parsed and styled. They are invisible but still cost main thread budget. I replace lazy-hidden patterns with conditional loading where the performance gain justifies it.
- ▸Viewport meta tag correction: check and restore incorrect width or initial-scale values overridden by extensions.
Which fixes apply depends on your theme, extension set and Magento version. I tailor the approach to your stack.
Tap target violations: the invisible conversion problem
On Magento stores I see tap target problems most often in these places: the plus/minus buttons for product quantity in the mini cart, filter checkboxes in layered navigation, the hamburger menu button that is too small or too close to the edge of the screen, and product swatches packed closely together.
WCAG 2.5.8 (new in WCAG 2.2) states that interactive elements must have a minimum touch target of 24x24 CSS pixels. WCAG 2.5.5 recommends 44x44px for better usability. Lighthouse reports violations as 'Tap targets are not sized appropriately'. This is not a style issue but a conversion problem: a user who taps three times and misses a magnifier button or a minus button will leave the page.
I fix tap target violations with minimal visual impact. That means adding padding rather than making buttons larger, and increasing whitespace between adjacent interactive elements to reach the recommended 8px spacing. For hamburger menus I evaluate whether a bottom navigation for returning visitors is a better choice than a flyout menu opening from the top left.
-- Client case
CarCare24: mobile Lighthouse 38 to 65, CrUX LCP 2.14 seconds
CarCare24 is a Magento 2 store with around 3,400 products on Hypernode with Cloudflare Free. Infortis Ultimo theme, custom extensions and multiple third-party scripts. The mobile Lighthouse performance score in PSI lab varied significantly: on the same day it could show 38 or 65, depending on CPU scheduling variance on the Google server.
The mobile bottlenecks sat on three layers. At performance level: the hero image loaded as a desktop variant on mobile, without picture srcset for smaller screens. At UX level: several tap targets in the cart and layered navigation were below the 24px boundary. At script level: hover effect handlers and a desktop flyout menu library were fully parsed and executed on mobile, without any conditional check.
The mobile fixes were part of waves 6 to 9 of the broader performance programme. Mobile-specific image variants were added via picture source srcset on the hero. Hover-only scripts were deferred with a media query check. Tap target padding was increased on cart buttons and filter tags. The lab score remains variable due to CPU throttle variance on the Google server. That is a property of the measurement tool, not of the store. What matters: CrUX over 28 days shows LCP 2.14 seconds, INP 111ms, CLS 0.05. All Core Web Vitals green on mobile.
What I do not do for mobile Magento
There are approaches that sound easy but do not address the core problem, or introduce new ones.
- ✕Building AMP pages: AMP is technically valid for specific use cases, but for a Magento store with complex product configuration, cart functionality and extensions, AMP is a parallel platform that doubles maintenance costs without guaranteeing better CrUX scores.
- ✕Forcing native PWA installs: adding a service worker and web app manifest produces an installable PWA, but does not fix LCP, INP or tap target problems. I do not install a PWA layer as the foundation for performance work.
- ✕Hybrid app development: building a React Native or Flutter shell over your Magento store is a new-build project, not an optimisation. It falls outside the scope of what I describe here.
- ✕Mobile-only code branches in Magento core: separate PHP blocks per device via user-agent detection are fragile and hard to maintain. CSS with media queries and conditional JS with matchMedia checks is the right approach.
- ✕Lab score as the only goal: achieving a mobile PSI score of 90 via tricks that do not help real visitors on mid-range hardware is not a goal. Mobile CrUX is the goal.
I always explain why a particular approach is inadvisable, with the trade-off of cost, impact and risk.
Pricing and scope
Mobile optimisation is part of a broader Magento performance programme or stands as a standalone mobile audit. The price depends on the size of the store, the number of page types audited and fixed, and whether the theme allows mobile adjustments via the admin panel or whether PHP/JS changes are needed.
I do not work with fixed packages for Magento work. Prices are always on request, after an introductory call where I determine the scope based on your PSI data and CrUX reports.