Analytics
Privacy-first, consent-gated visitor analytics — pageviews, sources, devices, custom events, and conversions.
Analytics is a lightweight, cookieless visitor analytics layer that rides along with the widget you already have installed. It's a Pro feature and it is off by default.
Turning it on
Both of these are required. Neither is enough on its own.
Enable it on the project
Project → Settings → Features → Analytics.
Pass consent from your page
<script
src="https://www.annot8.app/widget.js"
data-project-id="pj_xxxxxxxxxxxx"
data-convex-url="https://your-deployment.convex.cloud"
data-analytics-consent="true"
async
></script>Or, from your consent-management platform, once the visitor has agreed:
window.Annot8("init", {
projectId: "pj_xxxxxxxxxxxx",
convexUrl: "https://your-deployment.convex.cloud",
analyticsConsent: true,
});Do not hard-code data-analytics-consent="true" for visitors in the EEA or
the UK. Wire it to your consent manager, and describe Annot8 in your own
privacy and cookie notices. See Privacy.
Analytics is the one part of the widget that keeps running on production hosts even when the panel is hidden — collection and the feedback UI are independent.
The views
| View | Shows |
|---|---|
| Overview | Unique visitors, page views, average session length, bounce rate, with top pages, sources, and devices |
| Real-time | Active visitors right now and what they're looking at |
| Pages | Page-by-page views, with scroll depth |
| Sources | Referrers, and UTM campaigns |
| Devices | Device type, browser, and OS breakdown |
| Events | Clicks, scrolls, custom events, conversions, and errors |
| Funnels | Conversion paths you define |
Most views support a date range of today, 7, 30, or 90 days.
What's collected
| Signal | Detail |
|---|---|
| Pageviews | URL, title, referrer |
| Sessions | Entry and exit page, duration, page count, bounce, max scroll depth |
| Visitor | A random id stored in the browser — no cookie, no cross-site identifier |
| UTM | utm_source, utm_medium, utm_campaign, utm_term, utm_content |
| Device | Device type, browser, OS, screen size |
| Interactions | Clicks (selector and text), scroll depth, JS errors |
| Custom | Whatever you send via track and trackConversion |
URLs are minimised. Query strings, hash fragments, and any embedded credentials are stripped before an event is stored, because those routinely carry tokens and personal data.
The visitor id is random, generated in the browser, and scoped to your site. It is not derived from an IP address, a fingerprint, or anything shared between sites.
Custom events
// A named event with arbitrary properties
window.Annot8("track", "signup_clicked", { plan: "pro" });
// A conversion, with an optional monetary value
window.Annot8("trackConversion", "purchase", 49.99);Both are no-ops when Analytics is disabled or unconsented — nothing is transmitted and nothing throws, so you can leave the calls in place unconditionally and let the toggle decide.
Event properties are capped at 25 keys per event.
Withdrawing consent
Re-initialise with consent off:
window.Annot8("init", {
projectId: "pj_xxxxxxxxxxxx",
convexUrl: "https://your-deployment.convex.cloud",
analyticsConsent: false,
});Your consent manager should also clear the host-page keys ca_visitor_id,
ca_session_id, and ca_session_start.
Retention
Analytics events and sessions are deleted automatically after 13 months. Sessions that go quiet without an end beacon are finalised after 30 minutes of inactivity, so a closed laptop doesn't leave a session open forever.
What Annot8 Analytics is not
It isn't a replacement for a full product-analytics suite, and it deliberately doesn't do cross-site tracking, advertising identifiers, or session replay. It's here to answer "which pages matter, where do people come from, and did they get through the flow" — next to the feedback about those same pages.