All posts

fundamentals

Synthetic monitoring vs real user monitoring (RUM)

Uptimera team8 min read

Synthetic monitoring and real user monitoring (RUM) sound like competitors. They're not — they answer different questions. Synthetic tells you whether the lights are on. RUM tells you what it feels like to walk into the building. Most teams need both eventually; few teams need both on day one.

The one-paragraph distinction

Synthetic monitoring runs scripted requests against your service from servers you control. The requests are not real users; they're bots checking specific URLs at fixed intervals. Real user monitoring (RUM) embeds a small script in your frontend that reports back what real browsers experienced — page load times, JavaScript errors, which links got clicked. Synthetic is push (we initiate the check); RUM is pull (we collect what already happened).

What synthetic monitoring is good at

  • Detecting that something is broken when no users are around. 3am outages, weekends, holiday weeks — synthetic still pings the service.
  • Catching regional failures. Probes from us-east, eu-west, and ap-south will surface CDN or DNS issues that affect specific geographies. RUM can't do this unless real users in that region happen to try.
  • Monitoring surfaces that aren't public. Internal APIs, staging environments, scheduled jobs (via heartbeats), background workers.
  • SSL, DNS, and protocol-level checks. Cert expiry, DNS propagation, TCP port reachability — none of which a browser-based RUM script can observe.
  • Holding vendors accountable to an SLA. When AWS or Stripe says they're up and you say they're not, synthetic check history is the evidence.

Where synthetic monitoring is blind

Synthetic checks run from a small number of well-connected data centers. Real users sit on cafe wifi in São Paulo with a five-year-old Android browser. The two experiences diverge in ways synthetic cannot see:

  • Slow-but-not-broken UX. A login that takes 8 seconds in mobile Safari but 400ms from your probe. The site is "up"; the experience is unusable.
  • Client-side errors. A JavaScript exception in Firefox 95 that blocks the upload button. Synthetic checks happen so rarely on real browsers (most use headless Chrome) that they don't see this.
  • Third-party dependencies that fail conditionally. A payment SDK that throws only when ad-blockers are present. A font CDN that gets blocked in certain corporate networks.
  • Performance trends across releases. Did the last deploy slow down checkout for users on 3G connections? You won't see that without RUM telemetry.

What RUM is good at

  • Core Web Vitals across the population. LCP, FID/INP, CLS — measured on real devices, weighted by how often each combination appears.
  • Cohort analysis. "What's the median load time for users in India on Android?" Synthetic can't answer; RUM can, with millions of samples.
  • JavaScript error tracking by browser/version. The kind of long-tail bug that affects 0.3% of users but is the reason the support queue keeps growing.
  • A/B test impact on performance. Did the new dashboard layout improve or hurt time-to-interactive? RUM is how you measure it.

Where RUM falls short

RUM has three structural weaknesses you should understand before relying on it:

  • It can't see what didn't load. If the page never reaches the browser, the RUM script never runs, and nothing gets reported. RUM data goes silent during the most important kind of outage.
  • Ad blockers and content blockers strip the script. Estimates vary, but 10-30% of users (depending on geography and audience) block analytics. Your numbers represent a non-random sample of the population.
  • It's reactive, not proactive. You learn about a problem when users hit it. For a low-traffic page, you might not learn for hours.

Which to invest in first

If you have neither, start with synthetic. The reason is simple: synthetic gets you paged when something breaks. RUM gives you graphs that explain why retention is bad. Both are valuable, but only one of them gets you out of bed at 4am.

Day one stack (small team, single product)

  • Synthetic uptime checks on 5-10 critical URLs (homepage, login, the main API, the webhook receiver). Multi-region with quorum.
  • SSL and DNS monitoring on the main domain.
  • Heartbeats on cron jobs and background workers.

Add when you're ready (typically 6-18 months in)

  • RUM library on the frontend (Web Vitals or a vendor like Sentry / Datadog RUM).
  • JavaScript error tracking with source maps.
  • Synthetic browser tests for multi-step flows (signup, checkout) — the bridge between the two worlds.

A note on synthetic browser checks

Modern synthetic tools can run full browser sessions: launch a Chrome instance, navigate, click, fill a form, assert something rendered. These are sometimes marketed as "synthetic monitoring 2.0" — they're not RUM, but they close part of the gap. A scripted checkout flow run from three regions every five minutes will catch most of the regressions that a pure HTTP probe misses, without needing to wait for real users.

The tradeoff is cost and brittleness. Browser checks are 10-20× more expensive to run than HTTP checks, and any frontend selector change can break the script. Use them for the 3-5 most important flows, not as a replacement for HTTP-level probes.

Where to go from here

Audit what you currently have. If you don't know within five minutes when a key endpoint goes down, you're under-invested in synthetic. If your users report bugs that never appear in your error logs, you're under-invested in RUM. Most teams discover they need both, but the order is almost always synthetic first.

Uptimera's free plan covers the synthetic side — five monitors with multi-region quorum, SSL tracking, and Slack alerts. It pairs cleanly with any RUM vendor when you're ready for the other half.