Journal / Performance Optimization

Performance Optimization

The Real Numbers Behind a Fast Web App in 2026

The real numbers behind a fast web app are not goals you pick from a blog post. They are the thresholds at which users stop noticing load time, at which search engines reward you, and at which churn starts to drop. I track six metrics per app: LCP, INP, CLS, API p95 latency, time to first byte, and bundle size. Every one has a concrete target and a measurement method.

What you actually need to know

  • LCP under 2.5 seconds, INP under 200 milliseconds, CLS under 0.1. Miss any of these at the 75th percentile and Google's ranking algorithm notices.
  • API p95 under 300 milliseconds for interactive endpoints. Users feel everything above that.
  • Time to first byte under 200 milliseconds. It is the ceiling for everything else.
  • JavaScript bundle under 150 kilobytes gzipped for initial load. The rest loads lazily.
  • Field data from real users almost always looks worse than lab data. Both matter.

Metric

Good threshold

Needs improvement

Poor

LCP (Largest Contentful Paint)

Under 2.5 seconds

2.5 to 4 seconds

Over 4 seconds

INP (Interaction to Next Paint)

Under 200 ms

200 to 500 ms

Over 500 ms

CLS (Cumulative Layout Shift)

Under 0.1

0.1 to 0.25

Over 0.25

TTFB (Time to First Byte)

Under 200 ms

200 to 800 ms

Over 800 ms

API p95 (interactive endpoint)

Under 300 ms

300 to 800 ms

Over 800 ms

Initial JS bundle (gzipped)

Under 150 KB

150 to 300 KB

Over 300 KB

The core argument

Most engineers think of performance as a qualitative thing. The app feels fast or it does not. That framing is what lets regressions accumulate. Qualitative judgments are hard to enforce, hard to alert on, and hard to argue about in a PR review. Numbers are not.

The six metrics above are the ones that actually move outcomes. LCP, INP, and CLS are the Core Web Vitals that Google uses as a ranking signal and that correlate with user satisfaction research. TTFB is the upstream dependency for all of them. API p95 is the metric that determines whether the product feels fast in daily use. Bundle size is the upstream dependency for everything that happens in the browser before the server responds.

The useful discipline is to track all six, set targets for each, and measure against field data rather than lab data. A Lighthouse score of 95 in a lab test can coexist with a p75 LCP of four seconds in the field because real users are on real networks with real devices, not a Chrome instance on a fast connection. The Chrome User Experience Report gives you the field reality. It is worth checking quarterly.

The teams that have consistently fast apps treat these numbers the same way they treat test coverage. They have targets, they measure against them, and they treat regressions as blocking rather than informational. The teams that have inconsistently fast apps do Lighthouse audits when someone complains and move on.

Where apps actually fall short

Time to first byte

TTFB is the most common hidden problem. An app can have a well optimized frontend and still feel slow because the server is taking 700 milliseconds to send the first byte. The fix is almost always edge caching, better database queries, or moving the rendering closer to the user. For apps on Vercel or Cloudflare, edge rendering is the primary lever. For custom infrastructure, CDN configuration and query optimization are the starting points.

JavaScript bundle size

The second most common problem. Teams add dependencies without auditing their weight. A date picker library that brings in 80 kilobytes. An analytics SDK that loads 60 kilobytes synchronously on every page. A component library that is imported in full instead of tree shaken. These accumulate. A bundle audit every quarter, run with a tool like bundlephobia or the Next.js bundle analyzer, catches the worst offenders before they compound.

Interaction latency

INP failures are usually caused by long tasks running on the main thread. Heavy client side state management, unthrottled event handlers, or synchronous operations on interaction events. The fix is to measure which interactions are slow with the INP debugger, then profile the main thread work that happens on those interactions.

What it costs to close the gap

Gap

Fix

Engineering effort

Impact

TTFB over 800 ms

Edge caching, CDN config

1 to 3 days

High

LCP over 2.5 seconds

Image optimization, preloading

2 to 5 days

High

Bundle over 300 KB gzipped

Code splitting, dependency audit

1 to 4 days

Medium

API p95 over 500 ms

Index addition, query rewrite

2 to 10 days per endpoint

High

INP over 200 ms

Main thread profiling, lazy execution

2 to 5 days

Medium

CLS over 0.1

Layout reservation, skeleton screens

1 to 3 days

Low to medium

What to look for in the tooling

  • Real user monitoring that captures field data, not just synthetic results. Google Search Console for Core Web Vitals, Sentry or Datadog for API metrics.
  • A way to break down LCP by page type and by user segment. A fast homepage LCP and a slow dashboard LCP average to something misleading.
  • Bundle analysis built into the build pipeline. The Next.js bundle analyzer and Vite's rollup-plugin-visualizer are the standard options.
  • Alerts on regression, not just current state. A dashboard you check when someone complains is a lagging indicator. An alert that fires when LCP degrades over seven days is actionable.

Expert opinion

The number I look at first when auditing a web app is TTFB. Everything downstream depends on it. Teams spend weeks on frontend optimization and ignore the fact that the server takes 600 milliseconds before any of that optimization can matter. Fix the floor first. The ceiling follows.

Yashveer Singh, founder of Yashveer Labs

How this played out on a real project

A SaaS client came in with a specific problem: their marketing site converted well but their activation rate after signup was low. The hypothesis was feature related. The data told a different story. The first meaningful action in the app, which was creating a project, involved an API endpoint with a p95 of 1.1 seconds and a frontend that took 4.2 seconds to LCP because the dashboard bundle was not split.

The fix took three weeks. We split the dashboard bundle, moved two heavy synchronous imports to lazy loads, and rewrote the project creation query to use a single round trip instead of three. The p95 for project creation dropped to 280 milliseconds. LCP dropped to 1.9 seconds. Activation improved by 22 percent in the following month.

That outcome was not about a clever architectural change. It was about measuring the right numbers, finding the gaps, and closing them methodically. For the API measurement side, API response times: how to track what matters is the companion piece. For what happens when you have identified the slow operations, the hot path: finding and optimizing it covers the next step.

Common mistakes

  1. Measuring only Lighthouse scores and not field data. Lab and field can diverge significantly on real devices.
  2. Treating LCP as a homepage metric. The dashboard LCP and the checkout LCP matter more for user experience than the marketing page.
  3. Ignoring TTFB. It is the upstream dependency for everything and is often the easiest win.
  4. Not splitting the bundle. Shipping a monolithic bundle is the most common cause of slow perceived load in 2026.
  5. Setting no API latency targets. The backend and frontend are separate concerns with separate metrics. Most teams only audit one.
  6. Using only synthetic monitoring. Real user monitoring is required to know what real users are experiencing.
  7. Checking performance quarterly at best. Performance degrades continuously. Weekly review of the six key metrics catches regressions before they compound.

A 30 day plan to hit the targets

  1. Week one. Run a baseline measurement of all six metrics. Lighthouse for lab data, Google Search Console for Core Web Vitals field data, your observability tool for API p95. Write down every number.
  2. Week two. Identify the three metrics furthest from target. For most apps this is TTFB, bundle size, and API p95. Prioritize in that order.
  3. Week three. Fix TTFB first if it is over 400 milliseconds. CDN configuration, edge caching, or server side query optimization depending on the root cause. Run the bundle analyzer and cut the largest unnecessary dependencies.
  4. Week four. Address the API p95 for the primary user workflow. Add indexes, rewrite queries, add a cache layer if the data allows it. Set up weekly dashboard review so the numbers stay visible after the sprint ends.

For related depth on the backend side, backend performance budgets: how to set them covers how to formalize the targets you have now measured. On the frontend, bundle size: the quiet killer of mobile web performance goes deep on the dependency audit.

FAQ

Frequently asked

  • What are the Core Web Vitals targets for a fast web app in 2026?
  • What is a realistic API p95 latency target for a SaaS app in 2026?
  • How does bundle size affect web app performance in practice?
  • What is the relationship between time to first byte and LCP?
  • How do I know if my web app is actually fast for real users rather than just fast in the lab?
  • What is Interaction to Next Paint and why did it replace First Input Delay?
  • Which metric has the most direct impact on churn for SaaS apps?

Author

My approach to this kind of work

I approach this kind of work the way I would want someone to approach a system I depended on. With care, with rigor, with a sense that the next person who touches it should be able to understand it without my help. Yashveer Singh, founder of Yashveer Labs. That is the standard. If it is the standard you are looking for, I am the engineer to hire.

Start the conversation See the work DM on Instagram