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.

Quality · frustration leaderboard · 28 daysall pages
PathRageDeadErrorsScore
/signup/plan4490126.9
/checkout2851225.4
/pricing1862341.8
/changelog947271.6
/blog/cookieless-analytics356150.4
Score = (rage×3 + dead×1.5 + errors×2) ÷ views — red ≥ 5 · yellow ≥ 1.5 · green below.
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.

Form · signup · 28 daysper field
FieldSeenFilledFill rateDropMedian in field
#8c1e… · field 1100%94%
6%0:11
#77c2… · field 291%72%
21%0:38
#e30d… · field 372%41%
43% leak1:22
#5b9a… · field 444%31%
30% leak0:47
Drop > 25% earns the leak badge. Labels render as hashes — the dashboard shows the hash, not the label text.

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.