LCP Largest Contentful Paint
Core Web VitalWhen the biggest thing on screen (usually the hero or product photo) has painted.
A performance trial · measured October 16, 2026
Third Shot Supply Co. is one pickleball shop built three times: as a classic Magento 2 store, as a headless Next.js storefront on that same Magento, and on Shopify. Same products, photos and design. We put all three on the clock: 57 Lighthouse runs, real-browser filmstrips and a scripted shopper.
On a mid-range phone, Headless is fastest, averaging 90 and winning 4 of 6 pages, though Magento 2 paints the main content first (2.91 s on average). Magento 2 follows at 88; Shopify trails at 80.
Mage-OS 3.5 · Luma theme · PHP
Next.js 16 · React 19 · Magento GraphQL
Online Store 2.0 · Liquid · custom theme
thirdshot Averages over six equivalent pages (home, category, product, content, search, cart), median of 5 runs each. Mobile: moto g class phone, 4× slower CPU, throttled 4G. Switch to desktop at the top.
01 The scoreboard
Google Lighthouse performance score (0–100) for each page type. Each mark is the median of five runs; the faint line behind it spans the slowest to the fastest run, so you can see how steady each stack is.
| Page | Magento 2 | Headless | Shopify |
|---|---|---|---|
| Home | 93 | 95 | 81 |
| Category | 96 | 91 | 82 |
| Product | 90 | 90 | 84 |
| Content | 77 | 89 | 79 |
| Search | 82 | 85 | 84 |
| Cart | 94 | 92 | 70 |
| Average | 88 | 90 | 80 |
02 Core Web Vitals & friends
The metrics behind the score, page by page. Shaded zones are Google’s thresholds: good, needs work, poor. Ticks on each bar are the five individual runs.
Landing page, hero + 9 sections
When the biggest thing on screen (usually the hero or product photo) has painted.
The first moment anything (text, logo, image) appears.
How long JavaScript froze the page while it loaded. The lab stand-in for INP.
How much the layout jumped around while loading. Lower is steadier.
How quickly the visible page fills in, on average.
Time the server took to send back the first byte of HTML.
Lighthouse lab data with simulated throttling (the method PageSpeed Insights uses). A second opinion from a real, throttled browser is in the race below. There is no real-user (CrUX) data: demo stores get too little traffic and are not indexed.
| Metric | Magento 2 | Headless | Shopify |
|---|---|---|---|
| LCP · Largest Contentful Paint | 2.77 s | 2.75 s | 3.68 s |
| FCP · First Contentful Paint | 1.50 s | 1.21 s | 2.00 s |
| TBT · Total Blocking Time | 198 ms | 83 ms | 321 ms |
| CLS · Cumulative Layout Shift | 0 | 0.001 | 0 |
| SI · Speed Index | 2.15 s | 1.42 s | 2.00 s |
| TTFB · Server response | 122 ms | 45 ms | 21 ms |
03 The race
Filmstrips recorded in a real Chrome on a throttled connection (slow 4G, 4× slower CPU, phone screen), every frame time-stamped. Press play to replay all three side by side, or drag the scrubber.
Race data has not been measured yet.
Applied throttling (what DevTools does) rather than Lighthouse’s simulation: 562 ms request latency, 1.47 Mbps down, CPU slowed 4×, 412×823 screen, cache disabled. Three runs per page; the film is the median run by LCP. “Complete” is the moment the screen stops changing visibly.
04 The shopper journey
Page scores describe single visits. Shoppers click around. A script plays the same five steps on each store, timing each one from the tap until the next screen is usable. This is where a headless storefront’s in-app navigation should shine.
Journey data has not been measured yet.
Mobile profile: 4G (150 ms latency, 9 Mbps), CPU slowed 4×, phone screen. Desktop profile: no throttling, 1440×900. Fresh browser per run (first page cold, the rest warm, like a real visit); median of three runs.
05 Page weight
Compressed bytes over the wire, split by type. Heavier pages hurt most on slow or metered phone connections, and every script also has to be parsed and run.
Landing page, hero + 9 sections
everything the browser downloaded
scripts, compressed
photos, icons
stylesheets
web fonts
documents
JSON, prefetch, beacons
number of files
| Type | Magento 2 | Headless | Shopify |
|---|---|---|---|
| Total transfer | 1.12 MB | 586 KB | 1.66 MB |
| JavaScript | 424 KB | 157 KB | 217 KB |
| Images | 452 KB | 241 KB | 494 KB |
| CSS | 89 KB | 19 KB | 22 KB |
| Fonts | 118 KB | 114 KB | 114 KB |
| HTML | 48 KB | 17 KB | 55 KB |
| Other | 19 KB | 37 KB | 793 KB |
| Requests | 227 | 50 | 174 |
06 Beyond speed
Averaged over the six pages. Underneath each score: every check that failed on at least one page.
Can everyone use it: contrast, labels, keyboard, screen readers.
Touch targets do not have sufficient size or spacing. · Elements with an ARIA `[role]` that require children to contain a specific `[role]` are missing some or all of those required children.
Links rely on color to be distinguishable.
Links rely on color to be distinguishable.
Security headers, console errors, third-party cookies, modern APIs.
No failed checks
No failed checks
Uses third-party cookies · Browser errors were logged to the console · Issues were logged in the `Issues` panel in Chrome Devtools
Crawlable, titled, described. All three demo stores are deliberately set to noindex, which costs each the same points.
Page is blocked from indexing
Page is blocked from indexing
Page is blocked from indexing · Document does not have a meta description
07 The three stacks
Speed is one trade-off among several. Here is what sits behind each storefront, and what it costs to own.
The server builds every page as finished HTML; the browser then loads a large JavaScript toolkit (RequireJS, jQuery, Knockout) that wires up menus, swatches and the mini cart.
The same Magento becomes a pure data API. A separate Next.js app renders pages with React Server Components, then the browser takes over and swaps pages in place without reloading.
Shopify hosts everything. Its servers render the Liquid theme on a global edge network; the page also carries Shopify’s own analytics, wallet and checkout-preload scripts.
| Magento 2 | Headless | Shopify | |
|---|---|---|---|
| Who runs it | You: server, PHP, MySQL, search, updates | You, twice: Magento plus a Node.js app | Shopify |
| Running cost | Hosting (this demo shares a small VPS); upkeep is the real cost | Magento’s costs plus Node hosting and a second codebase | Monthly plan (about $30–40 entry), apps, payment fees |
| Build effort | Medium: themes and extensions | High: storefront built from scratch | Low: theme and apps |
| Flexibility | Anything, it is your code | Anything, front and back | Within platform limits |
| Speed ceiling | Good with tuning | Highest: every byte is yours | Good, minus platform overhead |
| Best for | Complex catalogues, B2B, in-house PHP team | Brands wanting an app-like store, with developers | Most small and mid-size shops |
08 Method & data
Fair means identical treatment: same machine, same browser, same settings, same pages, many runs, medians. Everything is downloadable.
_shopify_essential cookie with each Lighthouse request. Every run checks it landed on the real page (final URL, no redirect to /password), otherwise it is retried.Every run, every metric. Measured pages listed below.
The whole trial is one command on the measuring server. It re-measures everything (about 90 minutes, strictly one page load at a time so no store is hammered), regenerates this page and its downloads.
npm run measure # Lighthouse matrix, filmstrips, shopper journey, then rebuild