Aannot8

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.

<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

ViewShows
OverviewUnique visitors, page views, average session length, bounce rate, with top pages, sources, and devices
Real-timeActive visitors right now and what they're looking at
PagesPage-by-page views, with scroll depth
SourcesReferrers, and UTM campaigns
DevicesDevice type, browser, and OS breakdown
EventsClicks, scrolls, custom events, conversions, and errors
FunnelsConversion paths you define

Most views support a date range of today, 7, 30, or 90 days.

What's collected

SignalDetail
PageviewsURL, title, referrer
SessionsEntry and exit page, duration, page count, bounce, max scroll depth
VisitorA random id stored in the browser — no cookie, no cross-site identifier
UTMutm_source, utm_medium, utm_campaign, utm_term, utm_content
DeviceDevice type, browser, OS, screen size
InteractionsClicks (selector and text), scroll depth, JS errors
CustomWhatever 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.

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.

On this page