Real User Monitoring (RUM): Definition, Tools, Examples
RUM captures performance and errors from actual user sessions in production — JS-based instrumentation. Complements synthetic tests with real-world data.
What is Real User Monitoring (RUM)?
Real User Monitoring (RUM) is the practice of capturing performance, errors, and user-experience data from actual users browsing your application in production. A small JavaScript snippet runs in the user's browser, collects timing/error data, and sends it to a monitoring backend. RUM provides field data: what real users on real devices, real networks, real geographies actually experience.
RUM complements (doesn't replace) synthetic monitoring. Synthetic = consistent baseline from controlled environments. RUM = messy reality across the long tail of devices and networks.
What RUM measures
| Category | Metrics |
|---|---|
| Page load | TTFB, FCP, LCP, DOMContentLoaded, load event |
| Responsiveness | INP, FID (legacy), Long Tasks |
| Visual stability | CLS |
| Errors | JS exceptions, unhandled promise rejections, network errors |
| Resource performance | Per-asset load times, transfer size |
| User context | Browser, OS, device, screen size, country, ISP |
| Custom events | Business KPIs (signup completed, checkout started) |
| Session recording | (Some tools) replay user actions |
RUM vs synthetic monitoring
| Aspect | RUM | Synthetic |
|---|---|---|
| Data source | Real user sessions | Scripted tests from monitoring infra |
| Sample | All real traffic | Fixed schedule (e.g., every 5 min) |
| Coverage | Logged-in pages, all browsers | Public pages, controlled browser |
| Detects pre-traffic issues | No (need users) | Yes (24/7 even with no users) |
| Reflects user reality | Yes | No (controlled env) |
| Cost | ~$ per session | ~$ per check |
Best practice: use both. Synthetic for alerts and SLO tracking; RUM for diagnosing real-world issues and validating performance budgets.
How RUM works (technical)
RUM uses Browser Performance APIs:
// Capture LCP
new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
sendBeacon('/rum', { metric: 'lcp', value: entry.startTime });
}
}).observe({ type: 'largest-contentful-paint', buffered: true });
// Capture errors
window.addEventListener('error', (e) => {
sendBeacon('/rum', { type: 'error', message: e.message, file: e.filename });
});
// Capture INP, CLS, FCP, etc.Data is batched and sent via navigator.sendBeacon() (works during page unload). RUM tools (Sentry, Datadog RUM, New Relic) wrap this in a small JS library.
Popular RUM tools
| Tool | Strengths | Pricing |
|---|---|---|
| Datadog RUM | Tight integration with APM/logs | Per-session |
| Sentry | Error monitoring + RUM | Per-event, generous free tier |
| New Relic Browser | Full-stack observability | Per-user/usage |
| Cloudflare Web Analytics | Privacy-first, Core Web Vitals | Free tier strong |
| Akamai mPulse | CDN-integrated, large-site focused | Enterprise |
| SpeedCurve | Performance-focused, frontend-only | Per-monitor |
| Raygun | Errors + RUM, simpler tooling | Per-error |
| Self-hosted (Boomerang.js + custom backend) | Privacy, no vendor lock-in | DIY |
What RUM is good for
- Diagnosing real-world performance. "Why are mobile users in Brazil seeing 6s LCP?"
- Validating fixes. Did p75 LCP actually improve in production after the fix shipped?
- Catching browser-specific bugs. Safari-only crash? RUM surfaces it.
- User-impact data. Quantify how many users hit a slow path.
- Setting performance budgets. Alert when p75 LCP exceeds 2.5s.
- Correlating performance with conversion. Slow LCP → cart abandonment, with stats.
What RUM is NOT good for
- Pre-launch testing. No users, no data — use synthetic.
- Testing internal/staging. Synthetic gives consistent measurements.
- Detecting infrastructure outages. No users hitting site = no signal. Synthetic alerts on outages.
- Comparing to competitors. CrUX is better for comparing across origins.
- Fully reproducible benchmarks. RUM data has variance; lab benchmarks are stable.
RUM best practices
- Sample appropriately. 100% sampling can be expensive at high traffic. 10% often sufficient for trends; 100% for errors.
- Tag with context. Release version, feature flag, A/B variant — for slicing.
- Track p75 and p95. Average is misleading; long-tail latency is what users feel.
- Segment by device + connection. Mobile vs desktop, 4G vs WiFi — perf varies dramatically.
- Watch for Safari quirks. Some Performance APIs differ; test cross-browser.
- Respect privacy. Don't collect PII; use IP anonymization; comply with GDPR/CCPA.
- Combine with errors. Slow page + error spike → likely related.
- Set alert thresholds. Page on p75 LCP regression, not on every blip.
RUM and Core Web Vitals
Google's CrUX is essentially RUM data from Chrome users. Self-hosted RUM gives you the same metrics but for ALL browsers + tied to YOUR sessions/users — better for diagnosing your specific issues. CrUX is for SEO ranking; RUM is for engineering action.
FAQ: Real User Monitoring
Is RUM the same as APM?
No. APM = backend (server) monitoring. RUM = frontend (browser) monitoring. Together they're "full-stack observability."
Does RUM slow down my site?
Marginally. Modern RUM scripts are 10-30KB gzipped, load async. Use defer or beacon-based tools.
What's the difference between RUM and CrUX?
CrUX: Chrome-only, aggregated, public dataset. Self-hosted RUM: all browsers, your sessions, custom dimensions.
How much data does RUM collect?
Per session: ~1-5KB. At 1M sessions/month: a few GB. Most tools price per session not per byte.
Can I do RUM without a vendor?
Yes — Boomerang.js or web-vitals.js + a custom backend. More work; full control. Open-source RUM in a box: Akumuli, plus the web-vitals library by Google.
Is RUM GDPR-compliant?
Depends on what you collect. Anonymize IPs, no PII, document in privacy policy. Some tools (Cloudflare Web Analytics) are designed for privacy compliance.
How does RUM handle SPAs?
SPAs need explicit page-view markers (no full page reload to detect). All major RUM tools have SPA support — wrap router transitions in route.start() / route.end().
Combine RUM with synthetic via LoadFocus
RUM tells you what users experienced; synthetic tells you what's possible. LoadFocus runs Lighthouse audits + load tests from 25+ regions to set performance baselines that RUM data can be compared against. Sign up free at loadfocus.com/signup.
Related LoadFocus Tools
Put this concept into practice with LoadFocus — the same platform that powers everything you just read about.