Demo Modules Data Model Compare Pricing FAQ Help Dashboard Get Started

Help Center / Tracking modules

04 · Tracking modules

Nine modules, seven of them automatic.

Measr ships nine tracking modules: page views, interactions, navigation, exit links, scroll depth, errors, and downloads auto-detect after one Measr.init() call; video and forms take one line of code each. All nine are included in the single €19/month tier. This page shows what fires on its own, how to control it with data attributes, and how to wire the two manual modules.

The module table

ModuleWhat it tracksEvent typeMode
A · PagesPage views, sessions, bounce rate, entry and exit pagespage_viewAuto
B · InteractionsCTA clicks, toggles, accordions, tabsinteractionAuto
C · NavigationInternal nav clicks, tagged by surface (header, footer, breadcrumb)navigationAuto
D · Exit LinksOutbound link clicks with URL captureexit_linkAuto
E · Scroll Depth25 / 50 / 75 / 90 / 100% milestones, once per page viewscroll_depthAuto
F · VideoPlay, milestones, completion, watch timevideoManual
G · ErrorsClient-side JavaScript errors, sanitized before inserterrorAuto
H · DownloadsFile download clicks (.pdf, .zip, .csv, and more)downloadAuto
K · FormsForm view, start, and submit, per registered formform_view / form_start / form_endOpt-in per form

Every auto module can be switched off in the init() config, and every module also has a manual API for AJAX flows, custom widgets, and React state machines. The full signatures live in docs/MODULES.md.

What auto-detection actually does

Control tracking with data attributes

AttributeEffect
data-measr-ignoreSkip this element (and its subtree) entirely, across all modules.
data-measr-name="..."Override the interaction name the SDK would derive from the element's text.
data-measr-interactionForce-track an element the heuristics would miss; pair with data-measr-element to set the element label.
data-measr-download-name="..."Report a friendly file name instead of the raw path.
<a href="/files/q4-2026.pdf" data-measr-download-name="Q4 2026 Annual Report">
  Download (PDF)
</a>

<a href="/files/internal.pdf" data-measr-ignore>Don't track this one</a>

Video tracking (manual)

Every player has its own events and quirks, so video stays manual. One method covers them all:

Measr.trackVideo(videoName, milestone, videoSeconds);
// milestone: '0%', '25%', '50%', '75%', '90%', '100%'
// videoSeconds: seconds watched since the previous milestone

Ready-to-paste reference implementations for HTML5 <video>, the YouTube iframe API, and Vimeo Player.js are in docs/MODULES.md. In the dashboard, a video counts as completed at the 90% milestone.

Form tracking (opt-in per form)

Register each form you care about; the SDK then watches its full lifecycle:

Measr.trackForm('#waitlist-form', { name: 'Waitlist' });
EventFires when
form_viewThe form enters the viewport (at least 50% visible)
form_startThe visitor focuses the first input
form_endThe form is submitted

For multi-step wizards and AJAX-only flows, call the three manual variants yourself: trackFormView(name), trackFormStart(name), trackFormEnd(name). The dashboard turns these three events into a view → start → submit funnel per form.

Campaign tagging (UTM)

Zero configuration. When a visitor lands with UTM parameters in the URL, the first page view of the session stores the full query string. The dashboard breaks down utm_source, utm_medium, and utm_campaign as three tables in the Traffic & Acquisition section.

https://yoursite.com/?utm_source=linkedin&utm_medium=social&utm_campaign=product-launch

Links you already tagged for GA4 work unchanged; the UTM standard is universal. Keep values lowercase and consistent (utm_source=google, never Google), otherwise you get duplicate rows in the breakdown tables. Visitors without UTM parameters are attributed by referrer, with no referrer counting as Direct.

Bot filtering

Before any module fires, init() runs a three-layer bot check: the navigator.webdriver flag (Playwright, Puppeteer, Selenium), a user-agent list (Googlebot, Bingbot, GPTBot, ClaudeBot, and 20+ others plus catch-all tokens), and missing browser APIs. A detected bot produces zero rows. To analyze bot traffic instead, pass excludeBots: false.

Debug mode

Measr.enableDebug();   // logs every event payload to the console
Measr.disableDebug();

The flag persists in localStorage across reloads. One caveat that matters when verifying: the console line prints before the HTTP request, so a log entry alone does not prove delivery. The troubleshooting page shows how to confirm rows actually land.

Frequently asked

Which modules fire automatically?
Seven of nine: pages, interactions, navigation, exit links, scroll depth, errors, and downloads. Video and forms are manual because every player and form has its own lifecycle.
How do I exclude one element?
Add data-measr-ignore to it or any ancestor. The SDK skips it across all modules.
Do double-clicks count twice?
No. The SDK dedups back-to-back identical interaction and exit-link calls within 500 ms, and identical error messages within one second.
Previous← Manual setup NextCampaign tagging →