Core Web Vitals are field data, not a lab score

A lab tool measures one load on one connection, and the metric that counts is the 75th percentile of real visitors over 28 days.

import { getLCP, getFID, getCLS } from 'web-vitals'

const send = ({ name, value, id }) => {
  navigator.sendBeacon('/vitals', JSON.stringify({ name, value, id }))
}

getLCP(send)
getFID(send)   // needs a real interaction. no lab tool has one.
getCLS(send)

First Input Delay cannot be measured in a lab at all, because it requires somebody to interact — a lab tool reports it as zero or omits it. sendBeacon is what makes collection reliable, since it survives the page being closed where a fetch does not. Collecting your own field data rather than relying on an aggregated public dataset is what gives per-template numbers, which is where the actionable information is.