Product analytics
See how people actually use your site
A pageview counter tells you a page was opened. This tells you where somebody clicked and got nothing back, how far down they read, which step they gave up on, and what they did next. It comes from the same cookieless script tag, with no second vendor and no separate contract.
Five questions, and what answers each
Every signal below is collected by the script already on your page. Each one links to how it works and how it is measured.
Where do people get stuck?
Two signals name the element, the section and the page somebody was fighting with. Both run on every site by default, with no tagging.
- Rage clicks
- Three or more clicks in the same spot inside one second. One event per burst, carrying the element, its section and the page, so you know which control is not answering the way people expect.
- Dead clicks
- A click on something that looks clickable and then does nothing: no change on the page, no navigation, no scroll, for 700 milliseconds afterwards. Real links and buttons are excluded, so what is left is the div dressed as a button whose handler never ran.
How far do they get?
A pageview says the page opened. These say how much of it was read, and where the drop happened.
- Engaged time
- Time counted only while the tab is in view. It pauses when a visitor switches tab, minimises the window or locks their phone, so a page left open overnight does not read as a night of reading.
- Scroll depth
- How far down each page a visitor actually reached, recorded per pageview. A call to action below the point most people stop is one most people never see.
- Funnels
- Counts through a path you define, step by step, with the drop between steps. Break any step down by device, browser, operating system, country or referrer to see which group is losing it.
What do they do next?
One visit read end to end, and the shape of every visit put together.
- Journey inspector
- A single visit as a timeline: the pages in order, the clicks, the scroll depth reached on each, the downloads and the exit. It is rebuilt from the events already stored rather than filmed, so there is no video of anybody to store, redact or leak.
- Page graph
- How many steps each page sits from a conversion page, recomputed nightly from the paths visitors took. A busy page that is far from a conversion and passes almost nobody through is the one worth fixing first.
- Autocapture
- Outbound links, file downloads, form submissions, and clicks on links and buttons, recorded with no tagging at all. Tag an element with data-verita-event-name when you want a click under your own name instead.
Who is worth following up?
Ranking by intent, without identifying anyone and without following them to another site.
- Lead quality scoring
- A per-site model ranks visits by intent, from engaged time, page depth, scroll and the sequence of clicks. It ranks the visit, not the person: there is no cross-site identifier behind it.
- In-browser intent signal
- The same signals can fire an event in the visitor's own browser when a session looks warm, so your form or CRM can act on it while they are still there. Off until the script tag asks for it with data-warm-lead="true".
How fast is it for them?
The speed your visitors get on their own phones and networks, which is the speed Google scores.
- Core Web Vitals
- LCP, INP and CLS measured from real visits and reported at the 75th percentile, the cut Google ranks on. Collection is off until the script tag asks for it with data-web-vitals="true".
Three more, once you say what matters
The five above need nothing from you but the script tag. These three need you to name the things on your site that count, in one HTML attribute or one line of JavaScript. That is the whole setup: no SDK, no schema to design first, and nothing else to deploy.
How many people did the thing you care about?
Autocapture already records the click. What it cannot know is which control you meant, because every card on a page has an expander and they all say "Show more". Put data-verita-event-name on a button or a link and the click reports under the name you chose, which survives a copy edit, a translation and a redesign. That name is what you turn into a goal. There is no JavaScript to write.
<button data-verita-event-name="signup" data-verita-prop-plan="pro">
Sign up
</button>
<a href="/signup" data-verita-event-name="trial_start" data-verita-prop-plan="pro">
Start a trial
</a> Of the people who started, how many finished?
A click count says somebody pressed Pay. It cannot say whether the payment went through. Open an attempt with one call and close it with another: every attempt is started, and then exactly one of succeeded, failed, abandoned. Someone who closed the tab mid-checkout counts as abandoned without you writing anything to catch them leaving, so starts always equal successes plus failures plus abandonments, and two counts of the same funnel cannot disagree.
verita('startAction', 'checkout');
// later, when you know how it went
verita('endAction', 'checkout', 'succeeded');
verita('endAction', 'checkout', 'failed', 'card_declined'); Did they ignore it, or never see it?
Those two need opposite fixes, redesign it or move it up the page, and a click count cannot tell them apart. Tag an element with data-verita-expose and each page load reports whether it was rendered, whether it reached the screen and whether anybody touched it. Seen means half the element on screen or half the screen filled by it, measured on the same clock as engaged time, so a tab left open in the background adds nothing.
<section data-verita-expose="pricing-table">
...
</section> What this costs the person on the other end
Behavioural depth usually arrives as a second tag from a second company. Here it is the same script, and the limits are worth reading before you decide it is enough.
No cookies, and no full IP address
Visits are counted with a salted hash that rotates daily, not a cookie. We never send a visitor's full IP address to anyone: the network lookup that resolves a country receives a truncated block, never the address itself.
No screen recording
Our journeys are rebuilt from the events we already store, so there is no pixel playback of a visitor's screen. That is less than a recording tool shows you, and it is also why there is nothing to mask, redact or lose.
Clicks we capture, and clicks we do not
Automatic capture covers links, buttons, submit inputs and anything you tag. A click on plain page furniture is not recorded, which keeps the event table small and the reports readable.
If you already run Microsoft Clarity
Clarity finds rage clicks and dead clicks too, draws heatmaps, records sessions and catches JavaScript errors. Microsoft charges nothing for any of it: their FAQ calls it a free service forever with no traffic limits. It is the behavioural tool most sites already have, and we are not going to tell you it is worse than it is. What is worth reading first is what free is paying for.
What free is paying for
- Microsoft has access to what Clarity collects and holds it as a controller in its own right, not as a supplier acting on your instructions. Clarity FAQ (opens in a new tab)
- Grant advertising storage and, in Microsoft's words, "Clarity shares data with Microsoft Ads to improve retargeting, conversions, and campaign effectiveness". Consent management (opens in a new tab)
- Masking starts on Balanced, which hides numbers and email addresses. Every other word rendered on the page is uploaded until an admin changes the setting. Masking content (opens in a new tab)
- Erasing one visitor is not an operation Clarity has. The documented answer is to delete the entire project. Clarity FAQ (opens in a new tab)
- Your own access to the data stops after 30 days from the recording. The free tier here keeps 180 days of history. Clarity FAQ (opens in a new tab)
What we do not replace
Clarity draws heatmaps and replays what a visitor's screen showed. We do neither. Our journeys are rebuilt from the events we store, so there is nothing to play back, which is a real limit and not only a privacy feature.
Clarity also catches JavaScript errors, and that is the strongest thing in the product. We do not catch JavaScript errors at all, so if a broken script is what you are chasing, keep it.
What we do replace is the other half, from the script already counting your pageviews: rage clicks, dead clicks, engaged time, scroll depth, funnels and a visit timeline. One tag instead of two, one set of numbers instead of two that disagree, and the behavioural data goes where your pageviews already go.
Hotjar, Mouseflow and Contentsquare answer the same question for a fee, and the shape is the same: a second script, a second contract and a second company holding your visitors' behaviour. Every claim above is Microsoft's own documentation, linked, read at source on 5 September 2026.
Find out where your visitors get stuck
Frustration signals, engaged time, scroll depth, funnels and journeys, from one script tag.