Real User Monitoring (RUM)
Speed data collected from real visitors' browsers while they use your site, instead of from a test you ran on your own machine.
See it
What it is
RUM is a few kilobytes of JavaScript that sits on your page, listens to the browser's own timing APIs (PerformanceObserver, Navigation Timing), and ships what real sessions experienced back to you. In practice that means the 'web-vitals' library capturing LCP, INP, CLS, TTFB, and FCP, then firing them off with navigator.sendBeacon when the page is hidden, because a user who leaves mid-load still counts.
Reach for it once your lab tests are clean and complaints keep coming. RUM is the only thing that can tell you the checkout route is fine on desktop and terrible on three-year-old Androids in India. The public companion is CrUX, Chrome's aggregated dataset, which is what powers the Core Web Vitals assessment in Search Console. It is not a free version of your own RUM: it only covers opted-in Chrome users on URLs with enough traffic, it arrives pre-aggregated so you cannot open a single session or ask why one LCP was slow, and it lags by weeks. Hosted RUM tools (Vercel Speed Insights, SpeedCurve, Sentry, Datadog) add per-route slicing and attribution on top of your own beacons.
Gotchas: RUM is survivorship-biased, since people who bounce at second two contribute the least data and had the worst time. Ad blockers and consent banners silently eat a chunk of your beacons. CrUX is Chrome-only, so Safari and iOS are invisible in it. And always report p75, never the average: one person on a train tunnel connection will drag a mean into fiction.
Ask AI for it
Add real user monitoring to this app. Install the 'web-vitals' library (attribution build), register onLCP, onINP, onCLS, onTTFB, and onFCP, and send each metric with navigator.sendBeacon to a /api/vitals endpoint on visibilitychange 'hidden' rather than on unload. Include route or template name, device type, effective connection type, and navigation type in the payload. Store raw events, then aggregate to p75 per route per device with a 28-day rolling window, and flag any route whose p75 crosses the Core Web Vitals thresholds.