docs

Web Vitals

LCP, INP, CLS, FCP and TTFB from real visits at the 75th percentile per route, a 0 to 100 score, and the elements behind slow interactions and paints.

Web Vitals shows how fast your pages feel to the people using them. It reads the samples the browser SDK's webVitals() integration sends from each visit, so the numbers are field data, not a lab run.

The page lives at /o/:org/projects/:project/web-vitals. The environment, service and time range in the top bar apply to everything on it.

What the page shows

  • One tile per metric. The 75th percentile (p75) of LCP, INP, CLS, FCP and TTFB in the range, its rating, the share of good samples and a sparkline.
  • A performance score, from 0 to 100.
  • A trend chart of one metric's p75 per bucket. Pick the metric with Trend.
  • Routes. The 200 busiest route templates, each with its score and the p75 of every metric. Search narrows the list to templates that contain the text. Click a route to open its drilldown.

A rating compares the p75 with the web.dev thresholds:

MetricGoodPoor
LCP, Largest Contentful Paint2.5 s or lessover 4 s
INP, Interaction to Next Paint200 ms or lessover 500 ms
CLS, Cumulative Layout Shift0.1 or lessover 0.25
FCP, First Contentful Paint1.8 s or lessover 3 s
TTFB, Time to First Byte800 ms or lessover 1.8 s

The good and poor shares count each sample by the rating the browser gave it, with the same thresholds.

The performance score

Each metric's p75 scores from 0 to 100 on the log-normal curve Lighthouse uses, with the good threshold at 90 and the poor threshold at 50. The score is the weighted mean of those:

MetricWeight
LCP30%
INP30%
CLS25%
FCP15%
TTFB0%

A metric with no samples in the range is left out and the other weights scale up, so a page nobody interacted with is not marked down for INP. TTFB is shown but not scored, because it measures the server and the network more than the page. 90 and up reads as good, under 50 as poor.

Route drilldown

A route's page shows the same tiles, score and trend for that route template alone, and three tables:

  • INP interactions. The element each INP sample was measured on, its p75 and the mean split of its time into input delay (before handlers ran), processing (in your handlers) and presentation (until the next frame painted).
  • LCP elements. The element each LCP sample painted, its p75 and the mean split into time to first byte, resource load delay, resource load and render delay.
  • Layout shifts. The element that moved most in each CLS sample, and its p75.

Each table lists the 20 elements with the most samples. The phase split is the mean of the samples that sent phases; samples from SDK versions before 0.5.0 count toward the p75 but show no split.

How the numbers are kept

Each browser.web_vital record is rolled up per minute, route template, metric and service as it arrives, so the page never scans your logs. The rollups follow your logs retention. Records sent before this page existed were rolled up once, back to the 30 days before the release that added it.

In your AI assistant

The MCP server's get_web_vitals tool returns the same numbers: the routes with their p75s and score, or, given a route, its attribution.