Frustration & forms
The worst pages,
ranked first.
A frustration leaderboard computed per page — (rage×3 + dead×1.5 + errors×2) ÷ views, with root-cause counts and red / yellow / green thresholds — plus per-field form drop-off with leak badges. Counts and booleans only: labels are hashed, values are never read or sent.
Frustration leaderboard
Every page scored. Worst first.
One number per page, computed from the signals that actually mean frustration — and sorted so the page that needs you shows up on top.
| Path | Rage | Dead | Errors | Score | |
|---|---|---|---|---|---|
| /signup/plan | 44 | 90 | 12 | 6.9 | |
| /checkout | 28 | 51 | 22 | 5.4 | |
| /pricing | 18 | 62 | 34 | 1.8 | |
| /changelog | 9 | 47 | 27 | 1.6 | |
| /blog/cookieless-analytics | 3 | 56 | 15 | 0.4 |
The formula
Rage clicks weigh triple, errors double, dead clicks one-and-a-half — weighted by how strongly each signal predicts a broken experience, not by how often it fires.
Views in the denominator
Dividing by views keeps low-traffic pages honest: a page with 3 rage clicks and 3 views isn't angry, it's small.
Root causes inline
Rage, dead-click and error counts sit next to every score — the leaderboard tells you what to fix, not just that something is wrong.
Form drop-off
Find the field where
the form leaks.
Per-field analytics for every form marked with data-obs-form: how many saw the field, how many filled it, the fill rate, the drop-% — with a "leak" badge past 25% — and median time-in-field.
| Field | Seen | Filled | Fill rate | Drop | Median in field |
|---|---|---|---|---|---|
| #8c1e… · field 1 | 100% | 94% | 6% | 0:11 | |
| #77c2… · field 2 | 91% | 72% | 21% | 0:38 | |
| #e30d… · field 3 | 72% | 41% | 43% leak | 1:22 | |
| #5b9a… · field 4 | 44% | 31% | 30% leak | 0:47 |
Median time-in-field separates "thinking" from "stuck": a field that takes a minute and still leaks is a different problem from one users blow through.
Counts, never content
The browser sends
booleans and counts.
Form analytics in Observer is structurally incapable of leaking what was typed: the tracker reads whether a field was seen and filled — never what went into it. Counts and booleans only; labels are hashed before they leave the browser.
Same posture as everything else
Form analytics counts fields, never values — and recordings mask inputs at source. The two behavior features agree on the rule.
Opt out per element
data-obs-ignore excludes any element from heatmap and form analytics — the contract is yours to tighten.
Worst pages first.
Root causes attached.
Frustration scoring and form drop-off ship in the default tier — aggregate, suppressed below the k-anonymity floor of n ≥ 5, no consent banner. Access is granted after an NDA, and deployment happens together with your DevOps team.