Product analytics · Beta

Product analytics,
without the cookies.

Count visitors, page views, and custom events, see where they come from, and find where they drop off. Monocle sets no cookies, uses no browser storage, and never receives the identity of your users.

No cookies

No storage, no user identity

Sources & UTM

Referrers and campaigns

Funnels

See where visits drop off

Journeys

Every page and event of a visit

One line in the SDK you already have

Analytics comes from the browser SDK, so it lives next to your traces and errors. Add analytics() and page views are recorded on their own, including client-side navigation.

  • Single-page apps need no router hook
  • Pages grouped by route, like /blog/:slug, guessed or taken from your router
  • Custom events with up to 20 properties. Identity keys like email are rejected
src/monocle.ts
import {
  analytics,
  errors,
  initMonocle,
  network,
} from '@monocle.sh/browser-sdk'

export const monocle = initMonocle({
  dsn,
  environment: 'production',
  integrations: [network(), errors(), analytics()],
})

monocle.track({
  name: 'plan_selected',
  properties: { plan: 'pro', seats: 3, annual: true },
})

See where visits drop off

Build a funnel from page views, routes, and custom events, and see how many visits reach each step. Click the drop-off to list the visits that stopped there.

  • 2 to 8 steps, in order, within one visit
  • Share of visits that continued, and median time from the previous step
  • Conversion split by source, entry page, country, device, browser, or OS

Anonymous by design

Monocle cannot recognize a returning visitor, on purpose. Each visitor ID is a keyed hash, and the key changes every day at midnight UTC. After that, nothing links the two.

  • The IP address and User-Agent are used in memory, then dropped
  • Sessions list each visit and its journey, never the user behind it
  • Data kept for 90 days. During the beta, it does not count toward your usage
how visitors are counted
visitorId = keyedHash(dailySecret, site, ip, userAgent)

dailySecret   random, rotates at 00:00 UTC, never written to disk
ip, userAgent used in memory for the ID, location, and device
stored        visitorId, country, region, city, browser, OS, device
Works with

Plugs into your stack

Browser SDK

The analytics() integration

TanStack Router

Page views grouped by route

Vue Router

Page views grouped by route

UTM parameters

Source, medium, campaign, term, content

Custom events

monocle.track() with properties

Traces & errors

In the same project

Early access

See what your apps
are really doing.

Traces, logs, errors and metrics for every app you ship. Bring it all into focus.