Core Web Vitals in 2026: The Engineering Playbook for Sub-Second Sites
Speed is a feature, a ranking factor, and a revenue line. Here is exactly how we engineer marketing sites that load before your visitor can blink.

Every hundred milliseconds you make a visitor wait, you lose a measurable slice of them. That is not a motivational poster — it is the most reliably reproduced finding in web performance research, and it shows up in every funnel we have ever instrumented. A marketing site is a conversion machine, and latency is friction applied directly to the part of the machine that makes money.
Google formalized this intuition with Core Web Vitals: a small set of user-centric metrics that quantify how fast a page feels, not just how fast it technically loads. They are a ranking signal, they are visible in Search Console, and — more importantly — they correlate with the things you actually care about: bounce rate, scroll depth, and revenue per session. This is the playbook we use to pass them on every build.
The three metrics that actually matter
There are only three vitals you have to internalize. Each maps to a distinct moment in the experience of loading a page, and each fails for different, fixable reasons.
Largest Contentful Paint (LCP) — when the biggest thing in the viewport finishes rendering. This is the visitor's gut sense of “is it here yet?” Target under 2.5 seconds. Usually it is your hero image, headline, or a background.
Interaction to Next Paint (INP) — how quickly the page responds when someone taps or clicks. It replaced First Input Delay in 2024 and is far less forgiving because it measures every interaction, not just the first. Target under 200 milliseconds.
Cumulative Layout Shift (CLS) — how much the page visually jumps around as it loads. A button that moves just as a visitor reaches for it is the canonical CLS sin. Target under 0.1.
Pass all three at the 75th percentile of real visitors and Google considers the page “good.” The 75th percentile detail matters: your fast laptop on office fiber is not the test. A mid-range Android phone on a congested network is.
If you only measure performance on the machine you built the site on, you have not measured performance. You have measured your hardware budget.
Start with how the page is rendered
The single biggest performance decision you make is also the earliest: how the HTML reaches the browser. A site that ships a blank shell and then assembles itself with client-side JavaScript starts every Core Web Vitals measurement from behind, because the browser has to download, parse, and execute a bundle before the visitor sees anything real.
For marketing sites we render on the server and stream the HTML. Modern frameworks make this the default rather than the exception, and the payoff is direct: the largest contentful element can be in the markup that arrives in the first response, so LCP is bounded by network and image decisions instead of by how long your JavaScript takes to boot.
Server-render the critical content. The headline, hero, and above-the-fold copy should exist in the initial HTML. No spinner should ever stand between the visitor and your value proposition.
Ship less JavaScript. Every kilobyte of script is parsed and executed on the main thread — the same thread that has to respond to taps. Interactivity that is not above the fold can be deferred, code-split, or removed entirely.
Hydrate selectively. Most of a marketing page is static. Only the genuinely interactive islands — a menu, a form, a carousel — need client JavaScript. Treat hydration as an opt-in cost, not a blanket tax.

Once rendering is right, the remaining work is a disciplined sweep through the three assets that dominate load: images, fonts, and third-party scripts.
Images: usually the whole ballgame for LCP
On a well-built marketing site the largest contentful element is almost always an image, which means image strategy is LCP strategy. Get this right and you are most of the way to a passing score.
Serve modern formats. AVIF and WebP routinely cut file size 30–50% over JPEG at the same visual quality. There is no reason to ship a hero as a raw JPEG in 2026.
Size images to their slots. A 4000-pixel-wide photo squeezed into a 1200-pixel container wastes bandwidth and decode time. Use responsive
srcsetso every device downloads only what it can display.Set explicit dimensions. Width and height attributes (or an aspect-ratio box) let the browser reserve space before the image arrives. This is the most common single cause of CLS, and it is free to fix.
Preload the hero, lazy-load the rest. Tell the browser the LCP image is important so it fetches early; defer everything below the fold so it never competes for that first, precious bandwidth.
A modern image component handles most of this automatically — format negotiation, responsive sizing, and lazy-loading — which is why we lean on the framework's image primitive instead of hand-rolling <img> tags across a site.
Fonts: the silent layout-shift culprit
Custom fonts are a brand requirement and a performance hazard in equal measure. The danger is the swap: the browser renders fallback text, the web font arrives, and the text re-lays-out into a different size — a flash of unstyled text that both annoys the eye and registers as layout shift.
Self-host your fonts. Pulling fonts from a third-party origin adds a DNS lookup, a connection, and a point of failure on the critical path. Host them yourself and serve them from the same domain.
Preload the weights you use above the fold, so the font is in flight before the text that needs it paints.
Use
font-display: optionalor a tuned fallback. Match the fallback font's metrics to the web font so that when the swap happens, nothing moves. Tooling can generate a size-adjusted fallback automatically.Subset aggressively. If you only render Latin characters, do not ship the glyphs for every script on earth.
Taming the main thread for INP
INP is the metric most teams discover late, because it only misbehaves once real people start interacting with a real bundle. The root cause is almost always the same: long tasks hogging the main thread so that, when a visitor taps, the browser cannot respond until the current work finishes.
The fixes are structural, not cosmetic:
Break up long tasks. Anything over 50 milliseconds blocks interaction. Split heavy work, yield to the browser between chunks, and move pure computation off the main thread with a web worker where it makes sense.
Defer non-critical third parties. Analytics, chat widgets, heat-mapping, and tag managers are the usual INP wreckers. Load them after interaction is possible, not before.
Stop shipping interactivity you do not need. The fastest event handler is the one that does not exist. Audit your bundle for libraries doing work no visitor asked for.
Third-party scripts are where good Core Web Vitals scores quietly go to die. Every tag is someone else's code running on your critical path — budget for it like rent, not like a free add-on.
Measure real users, not just lab tools
Lab tools like Lighthouse are invaluable for catching regressions before they ship, but they run one simulated load on one simulated device. Core Web Vitals are scored on field data — what your actual visitors experience, aggregated over 28 days. The two can disagree, and when they do, the field data wins.
Watch the Core Web Vitals report in Search Console for the ground truth Google uses to rank you.
Capture real-user metrics yourself with the web-vitals library so you see problems the day they appear, segmented by device and page, instead of a month later.
Gate deploys on a performance budget. Wire Lighthouse into CI and fail the build when LCP or bundle size crosses a threshold. Performance you do not defend in the pipeline erodes one merge at a time.
Cache aggressively and render close to the user
Two visitors request the same marketing page. There is no reason for your server to build it twice, and there is no reason for the bytes to travel from a single data center to every corner of the planet. Caching and edge delivery are how a fast site stays fast under load and across geography — and they are frequently the cheapest large win available.
Serve static pages from a CDN. A marketing page that changes a few times a week should be generated once and served from edge nodes near your visitors. The closer the bytes start to the browser, the lower the latency before the first paint.
Use incremental regeneration so content can update without a full rebuild — you get the speed of static delivery with the freshness of a dynamic site, and your origin server stops being a bottleneck.
Set long cache lifetimes on immutable assets. Fingerprinted CSS, JavaScript, fonts, and images should be cached for a year. A returning visitor should re-download almost nothing.
Cache the HTML, not just the assets. Many teams cache their images and forget the document itself is cacheable too. Edge-caching the HTML collapses time-to-first-byte for everyone after the first request.
Time to First Byte is the metric that quietly caps everything else: LCP cannot be fast if the document is slow to arrive. Edge caching attacks TTFB directly, which is why it so often moves the vitals more than any amount of in-page tuning.
A pragmatic order of operations
When we inherit a slow site, we do not optimize randomly. We work the list in impact order: fix the rendering model, then time-to-first-byte and caching, then the LCP image, then layout-shift sources, then fonts, then the third-party and main-thread work behind INP. Most sites pass long before the list is finished, because the first few items are responsible for the overwhelming majority of the pain. Optimizing out of order — hand-tuning a font swap while the page still ships a megabyte of render-blocking JavaScript — is how teams spend a week and move the needle by nothing.
What “fast” actually buys you
It is easy to treat performance as an engineering vanity metric — a green score to screenshot and move on from. The reason we treat it as a first-class deliverable is that it pays in three currencies at once, and very few investments do that.
Ranking. Core Web Vitals are a confirmed signal in Google's ranking systems. When two pages are otherwise comparable, the faster one wins the position — and position is traffic, and traffic is pipeline.
Conversion. The relationship between speed and conversion is one of the most replicated findings in the field. Faster pages convert better, full stop, and the effect is largest on the mobile visitors who are hardest to win.
Brand perception. A site that responds instantly feels competent and trustworthy before a visitor has read a word. Sluggishness reads as carelessness, and carelessness is the last thing you want a prospect projecting onto your product.
That triple return is why performance is not a phase at the end of a build for us — it is a constraint we design against from the first commit, defended in code review and in CI, because clawing speed back after the fact always costs more than building it in from the start.
Core Web Vitals are not a checkbox you tick once and forget. They are a continuous property of a site, defended in code review, in CI, and in the choices designers and engineers make every week. But the engineering is well understood, the wins are durable, and the upside is rare in our work: a single investment that improves search ranking, user experience, and conversion at the same time. Build for speed from the first commit and you never have to claw it back later.


