Skip to content

Web vitals

The client uses PerformanceObserver when the browser has it and silently reports zero when an entry type is unsupported. Nothing here blocks the page.

value unit source
lcp ms the last largest-contentful-paint entry
cls score the sum of layout-shift entries without recent input
inp ms the slowest event entry with an interaction id (durationThreshold 40 ms)
fid ms the first first-input entry, as an INP fallback
ttfb ms responseStart from the navigation timing entry
dcl ms domContentLoadedEventEnd from the same entry
ld ms loadEventEnd, or the entry's duration if load has not fired

All values are rounded to whole milliseconds except cls, which keeps three decimals (for example 0.05).

Where they go

They are part of the session payload inside ext1; see Events and payload. A page view carries the values known at the moment it is sent, so early views have zeros and the final summary on pagehide has the full set.

Caveats

  • lcp is the last candidate observed. A late candidate updates the next beacon, not one already sent.
  • cls excludes shifts within 500 ms of user input, which is the usual definition. The client does not keep the shift sources.
  • inp is only reported by browsers that implement event timing; older browsers fall back to fid, which is reported separately.
  • When Navigation Timing level 2 is unavailable, the client falls back to performance.timing; if neither exists the three navigation values stay zero.
  • These are single-session numbers. Aggregation (P75, per-route, per-release) happens on the receiving side, not in the browser.