Three years, three metric reshuffles
In 2022 the conversation was about FID. In 2024 it became INP. By 2026 every team has had to relearn what "fast" means at least twice. The good news: the underlying work has barely changed. The teams that focused on the basics — image weight, JavaScript discipline, predictable rendering — have stayed in the green band through every reshuffle. The teams that chased the metric of the month are still chasing it.
This piece is what we actually do, on every project, regardless of which letter Google promotes next.
INP changed the conversation
Replacing First Input Delay with Interaction to Next Paint turned the spotlight from a single first interaction to every interaction on the page. Sites that scored well by accident now have to score well on purpose. That is a healthy shift — it rewards interfaces that actually feel responsive, not ones that just loaded fast.
Three habits make a real difference here:
- Keep the main thread short. Long tasks are the single largest cause of bad INP. Break work into smaller chunks. Schedule non-urgent updates with
requestIdleCallbackorscheduler.postTask. - Defer hydration where you can. The cheapest INP win is not hydrating a component the user has not interacted with. RSC and partial hydration patterns help; over-hydrated SPAs hurt.
- Watch the third parties. Analytics, chat widgets, and ad scripts dominate INP on most sites. Audit them quarterly.
INP failures are almost always discoverable in a Performance trace. If your team has not opened DevTools' performance panel in the last quarter, that is the first project, not the last.
LCP is still your hero metric
Largest Contentful Paint correlates with conversion better than any other signal we track. If your hero image is over 200 KB on mobile, you are paying for it in revenue, not just in Lighthouse points.
The reliable wins, in order of payoff:
- Right-size the hero image. Compress, then convert to AVIF or WebP, then serve responsive variants. The biggest gain is almost always here.
- Preload the LCP resource.
<link rel="preload">for the actual asset the browser will use to paint LCP. Stop the discovery game. - Cut the critical CSS. Inline only what the LCP element needs. Defer the rest.
- Move the LCP element earlier. Sometimes the fastest fix is to make the page structurally simpler so the browser sees the LCP target sooner.
- Cache, then cache again. A CDN with smart edge logic beats most server-side optimization, twice over.
Each of these is small. Together they are the difference between a 3.5-second LCP and a 1.5-second LCP. On a high-traffic page, that gap is millions of dollars per year.
CLS is the unforgiving one
Cumulative Layout Shift looks easy until you ship to production. Then a sticky cookie banner, a dynamic ad slot, or a late-loading font knocks you out of the green band overnight. Three rules that hold up:
- Every image has explicit
widthandheight. No exceptions. - Every font is loaded with
font-display: optionalorswap, and the fallback is sized to match. Use thesize-adjustdescriptors in modern browsers. - Every dynamic block (ads, banners, recommendations) has a reserved slot. The slot can be empty; it cannot be missing.
CLS is one of the easiest metrics to nail in development and one of the easiest to lose in production. Ship a synthetic monitor that fails the build if CLS regresses past your budget.
What we measure on launch day
Lab numbers lie. Field numbers tell the truth. On launch day we want to see:
- Field LCP and INP from a real device, not a lab average.
- The 75th percentile, not the median — that is where customers leave.
- Long tasks during the first interaction window.
- Total Blocking Time during scroll, not just on load.
- A weekly trend, not a single number.
If you do not have RUM in place, install it before the next deploy. Without it you are tuning blind. Web-Vitals.js, a basic analytics endpoint, and a dashboard takes a day to set up. It is the single highest-leverage hour your engineering team will spend this quarter.
The boring wins still win
Most performance budgets are blown by one image, one script, and one font.
Compress the image. Defer the script. Subset the font. Almost every "the site is slow" conversation ends with this checklist. Make it a default in your build, not a thing the team has to remember.
The deeper version of the checklist:
| Layer | Default | Cost of ignoring |
|---|---|---|
| Images | Compressed, AVIF, responsive | 30-60% of total page weight |
| JavaScript | Code-split, deferred | INP and TBT spikes |
| Fonts | Subset, preloaded, swap | CLS and "invisible text" |
| Third parties | Audited, async, sandboxed | Death by a thousand 200-ms cuts |
| CSS | Critical inlined, rest async | LCP delay on first paint |
There is no magic in this table. There is just the work most teams keep meaning to do.
What we do not optimize for
Some things look like performance wins and are not. We do not chase:
- Lighthouse scores. A 100 in the lab and a 60 in the field is a feature of how Lighthouse works, not a real customer experience. Optimize for the field.
- Single-metric improvements that hurt others. Cutting LCP by lazy-loading the hero image is not a win. The customer sees a slower paint and a janky load.
- Last-mile micro-optimizations on the first day. A 5 ms saving on a function that runs once is not where the budget went. Always profile first.
A maintenance cadence that holds up
Performance is not a project. It is a habit. The cadence we keep on most clients:
- Daily: RUM dashboards visible in the team chat, regressions trigger an alert.
- Weekly: A 30-minute review of the top regressions, mapped to recent deploys.
- Monthly: A full audit of one page — the slowest, or the most valuable.
- Quarterly: A budget review. New metrics, new constraints, new third parties.
Teams that hold this cadence stay in the green band almost regardless of how complex the product becomes. The ones that treat performance as a launch event quietly slip back.
The metric that matters
The fastest site is not the goal. The site that converts customers without making them wait — that is the goal. Core Web Vitals are a proxy. Revenue is the ground truth. Build the habit of measuring both, and the metric reshuffles stop mattering.