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:
| Metric | Good | Poor |
|---|---|---|
| LCP, Largest Contentful Paint | 2.5 s or less | over 4 s |
| INP, Interaction to Next Paint | 200 ms or less | over 500 ms |
| CLS, Cumulative Layout Shift | 0.1 or less | over 0.25 |
| FCP, First Contentful Paint | 1.8 s or less | over 3 s |
| TTFB, Time to First Byte | 800 ms or less | over 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:
| Metric | Weight |
|---|---|
| LCP | 30% |
| INP | 30% |
| CLS | 25% |
| FCP | 15% |
| TTFB | 0% |
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.