Reference7 min read
Metrics glossary
Each definition below matches the query that produces the number, not a rough description of it. Where a metric is computed differently under filters than without them, that's noted.
VisitorsCOUNT(DISTINCT visitor_id) over sessions in range- Distinct people, counted from the sessions table over the selected range. Visitor identity depends on tracking mode: see the cookieless-vs-cookie note in accuracy, since it changes what "distinct" means over a multi-day range.
Sessionsone row per (site, session_id) in `sessions`- One row per continuous visit. A session starts when the tracker generates a fresh session id (on a new tab, after 30 minutes of inactivity, or after the tab was closed and reopened at least 2 seconds later), and every event in that session, including the final page-leave beacon, extends its last-seen time.
PageviewsCOUNT of event_type='pageview' rows- Every pageview event recorded, including ones fired manually via
mrkr.pageview()and the automatic ones on SPA route changes. A session'spage_countonly increments on pageview events, not on clicks, scrolls, or custom events. Views per sessionpageviews / sessions- Total pageviews divided by total sessions over the range. Not a per-session average computed row by row and then averaged: it's the range totals divided once.
Bounce ratesessions WHERE page_count <= 1, ÷ total sessions- The share of sessions with exactly one pageview. This is purely a page-count threshold: there is no time or engagement component, so a session where someone read one page carefully for ten minutes and left still counts as a bounce.
Session durationAVG(MIN(last_seen − started_at, 30 min)), single-event sessions excluded- The average of (last event time − session start time) across sessions, with each session's span capped at 30 minutes before averaging so one abandoned tab left open overnight can't drag the average up. Sessions that never received a second event (last-seen equal to started-at) are excluded from the average entirely, not counted as zero.
Engaged timeper-pageview, cumulative, MAX of reports; no average surfaced- Time a visitor spent actively on one page: ticking only while the tab is visible and there's been mouse, keyboard, scroll, or touch activity in the last 30 seconds, capped at 30 minutes per page. The tracker reports it as a cumulative total that can arrive more than once for the same page (once when the tab is backgrounded, again when it is closed); the server keeps the largest reading. No page-level or session-level average of engaged time is shown anywhere in the product today. It appears only as a single formatted duration per pageview, in the visitor timeline drawer and the live event feed. For a session-level figure, use session duration instead.
Entry pagesessions.entry_path- The path of the first pageview in a session. Set once, when the session starts, and never overwritten.
Exit pagesessions.exit_path- The path of the most recent pageview in a session. Overwritten on every pageview, so mid-session it reflects "the current page," and only becomes final once the session goes idle.
Scroll depthdeepest of 25/50/75/100 per pageview; short pages unmeasured- The percentage of a page's content visible at the bottom of the viewport at the deepest point reached (25/50/75/100), not scrollbar position. Pages with less than roughly 240px below the fold report no scroll data at all, by design: there's nothing to scroll, so a fabricated "100% scrolled" would misrepresent a page the visitor simply saw in full without scrolling. The denominator in any scroll-depth report is pageviews that reported at least one threshold, not all pageviews of that page.
Stickinessdistinct active UTC days per visitor, bucketed- How many distinct calendar days each visitor was active within the range, bucketed. "Returning share" is the portion of visitors active on more than one day; "average days" is the mean active days per visitor. This is a different question from retention: retention asks whether someone came back at all, stickiness asks how often.
Conversion rateconverting visitors / all visitors- Unique visitors who triggered a conversion-marked event, divided by unique visitors in the range: visitor-based, not session-based, so a visitor who converts twice in one range still counts once in the numerator. An event becomes a "conversion" when it's starred from the Events page.
RevenueSUM(amount) WHERE event_type = 'revenue'- The sum of the amount field on events whose type is specifically
revenue, and nothing else. The restriction matters: the same amount column carries a scroll percentage on a scroll event and a duration in milliseconds on an engagement event, so revenue is only ever summed from rows that actually represent money. Amounts are stored and summed exactly as passed tomrkr.revenue(), with no currency conversion. ARPV (average revenue per visitor)revenue / visitors- Total revenue divided by total visitors over the same range.
Why chart bars don't always sum to the headline
Note
The Visitors KPI is a range-wide distinct count; the daily chart is a distinct count *per day*. Someone active on three separate days is one visitor in the KPI but contributes to three separate bars, so summing the bars can legitimately exceed the headline number. Pageviews and sessions don't have this property; their daily bars always sum exactly to the range total, because a pageview or a session belongs to exactly one day.