Views
"Views on /pricing are 2.4σ below the trailing baseline — check recent deploys and campaigns." Volume shifts surface before they cost you a week.
Performance RUM
Real-user Core Web Vitals at full percentile depth — p50, p75, p90, p95 for LCP, INP, CLS, FCP and TTFB — collected by the official web-vitals attribution build and stored as TDigests in ClickHouse, so every percentile is the true percentile of real field data. Averages hide regressions; percentiles convict them.
Full percentile depth
Every vital is stored as a ClickHouse TDigest per day, per page, per device class — which means any percentile can be recomputed exactly, at any retention depth, without averaging anything away. Ratings follow the CrUX methodology: good, needs-improvement, poor.
| Vital | p50 | p75 | p90 | p95 | p75 rating |
|---|---|---|---|---|---|
| LCP — largest contentful paint | 1.6 s | 2.1 s | 3.0 s | 3.8 s | good |
| INP — interaction to next paint | 96 ms | 148 ms | 214 ms | 268 ms | good |
| CLS — cumulative layout shift | 0.03 | 0.12 | 0.18 | 0.24 | needs-imp. |
| FCP — first contentful paint | 1.1 s | 1.5 s | 2.1 s | 2.6 s | good |
| TTFB — time to first byte | 0.4 s | 0.9 s | 1.2 s | 1.9 s | needs-imp. |
Thresholds are Google's published CrUX boundaries: LCP 2.5 s / 4.0 s · INP 200 ms / 500 ms · CLS 0.10 / 0.25 · FCP 1.8 s / 3.0 s · TTFB 800 ms / 1.8 s — good, needs-improvement, poor. Percentiles come from TDigests, not from sampled averages.
Breakdowns & attribution
Daily series for trend-watching, per-page breakdowns to find the slow routes, per-device splits because mobile is a different internet — and attribution data for the drill-down: which element painted last, which interaction target stalled.
The official web-vitals attribution build reports the element behind LCP and CLS and the interaction target behind INP — so a bad percentile names its suspect, and drill-downs start with a suspect, not a blank page.
Every percentile is available per path and per device class. "The site is fine" is not an answer when /checkout on mobile is the one dragging p75 over the line.
Vitals are collected with zero cookies and zero browser storage in the default tier — the same banner-free posture as the rest of Observer, running on your own hardware.
Anomaly detection
z-score ≥ 2 against a trailing baseline, evaluated on views, errors, goals and Core Web Vitals — and rendered as plain-language cards on Overview. No ML theater, no opaque scores: an honest statistical flag, phrased so a human can act on it.
"Views on /pricing are 2.4σ below the trailing baseline — check recent deploys and campaigns." Volume shifts surface before they cost you a week.
"Error rate moved to 2.1σ above baseline in the last hour." The card links straight to the window where it started moving.
"Goal conversions are 2.3σ below baseline over 24 h." Conversion dips get flagged with the same math as traffic dips.
"LCP p75 moved to 3.1 s on /pricing — check recent deploys." Exactly the card the Overview shows when a vital crosses its baseline.
All detections are z-scores on aggregate data vs a trailing baseline — the same honest statistics that drive the alert rules. Nothing is inferred about individuals, because no individuals exist in the data.
Deploy diff
POST a deploy webhook — authenticated with your site token — and Overview gains "since last deploy" deltas: views, goals, errors and CWV after the deploy, against an equal-length window before it. Regression hunting stops being archaeology.
# site-token auth; the timestamp lands on the deploy table
curl -X POST https://sa.yourdomain.com/api/v1/deploy \
-H "Authorization: Bearer <site-token>" \
-H "Content-Type: application/json" \
-d '{ "version": "v2.4.2" }'
| Metric | Before | After | Δ |
|---|---|---|---|
| Views | 6,120 | 7,214 | +17.9% |
| Goals | 214 | 262 | +22.4% |
| Errors | 96 | 31 | −67.7% |
| LCP p75 | 2.9 s | 2.3 s | −0.6 s |
Core Web Vitals RUM ships in the default tier — percentiles from day one, no consent banner. Access is granted after an NDA, and we deploy together with your DevOps team, on your hardware.