Rage clicks
Three or more clicks within a second on the same spot. Usually something slow, or something that looks like it should respond and doesn't.
The Metrickle script tag notices the moments your interface lets people down: rage clicks, dead clicks, clicks that throw an error, quick u-turns, form errors and abandoned forms. The friction report ranks them by element and page, so you know what to fix first.
| Element and signal | Page | Sessions |
|---|---|---|
button "Apply coupon" Dead click | /cart | 1,412 |
input#postcode Form error | /checkout | 986 |
button "Pay now" Rage click | /checkout/pay | 511 |
/delivery-info U-turn | /checkout | 344 |
a "Track order" Error click | /account | 207 |
“Apply coupon” looks like a button and does nothing until a code is typed. One in three cart sessions with friction starts there.
Add the script tag and friction is recorded from the first page view. Each signal carries the element's selector and visible label, so the report can point at the exact button or field.
Three or more clicks within a second on the same spot. Usually something slow, or something that looks like it should respond and doesn't.
A click on something that looks clickable, followed by nothing: no page change, no DOM change, no focus move and no scroll within a second.
A click followed by a JavaScript error within a second. The error is tied to the click that caused it, not to whatever was clicked last.
Someone goes from page A to page B and comes straight back within seven seconds. Page B wasn't what the link promised.
A field failed the browser's own validation or was marked aria-invalid. The field is recorded; what was typed is not.
Someone started filling in a form and left the page without submitting it.
Counting clicks overstates the problem on busy pages and hides it on quiet ones. The friction report counts sessions instead: how many sessions hit a signal, and what share of each page's sessions that is.
Hotspots list the element, the page and the signal, sorted by sessions affected.
| Page | Chart | Sessions | Friction rate |
|---|---|---|---|
/checkout | 6,480 | 31% | |
/cart | 9,115 | 24% | |
/account/settings | 2,730 | 12% | |
/pricing | 12,904 | 6% | |
/blog/* | 18,332 | 2% |
Rank pages by rate, not volume. The blog has the most sessions and almost no friction. Checkout has a third as many and the highest rate.
Every event carries the accessibility settings seen on the device: keyboard navigation, zoom, large text, high contrast, forced colours and reduced motion. The friction report shows friction rate and conversion rate for each, next to people using none.
A dead click that a mouse user shrugs off can be a wall for someone on a keyboard. This is where that shows up.
| Setting | Visitors | Friction rate | Conversion |
|---|---|---|---|
| None | 33,870 | 12% | 4.1% |
| Reduced motion | 2,140 | 13% | 3.9% |
| Zoomed | 1,208 | 22% | 2.6% |
| Large text | 1,655 | 19% | 2.8% |
| Keyboard | 912 | 38% | 1.4% |
Keyboard users hit friction three times as often and convert at about a third of the rate. Their top hotspot is the same dead “Apply coupon” button.
Browsers hide whether a screen reader is running, so on the web Metrickle reports sustained keyboard navigation instead. The mobile SDKs report the device's screen reader setting.
Sort by sessions affected, or open the page with the highest friction rate.
Split by device and accessibility setting, or filter to sessions that didn't convert or tasks that were abandoned.
Open consented, masked replays of sessions that hit the signal, and read what people said in surveys on that page.
After you ship, compare the page's friction rate for the weeks before and after the release.
The script tag never reads the values of form fields. A form error records which field failed and why the browser rejected it, never the value. Selectors and short visible labels are kept so hotspots are recognisable.
data-mk-mask keeps an element's text out of every event, for labels that include names or account details.<!-- Field values are never read. -->
<!-- For text that must never be captured, -->
<!-- such as a name on a button, add: -->
<button data-mk-mask>
Pay as Jane Doe
</button>
Three or more clicks within one second, all within about 30 pixels of each other. It's recorded with the element's selector and visible label, and the page it happened on.
A dead click is a single click on something that looks clickable, like a button or link, after which nothing happens within a second: no navigation, no change to the page, no focus move and no scroll. It often catches broken or disabled controls that people only click once.
No. The script tag captures all six signals on its own. You can switch rage-click capture off in the npm package options if you need to.
No. Field values are never read. Form errors record the field and the kind of validation failure. Add data-mk-mask to any element whose visible text must stay out too.
Yes, in part. The iOS, Android and Flutter SDKs detect rage taps, u-turns between screens and form errors (through a formError() helper). The React Native SDK detects u-turns. Dead and error clicks come from the web script tag for now.
Free to start. One script tag on the web, one SDK on mobile, and no cookie banner in cookieless mode.
Start tracking for free