App activity

See who uses your app, what they view and what they do there. Turn it on in createSixb():

TS
activity: { enabled: true }

Then open Observability › Activity from the user menu. Reading it takes can.observe(project.activity) in a role:

TS
export const productActivity = defineRole("product.activity", {
  grantedTo: [product],
  grants: [can.observe(project.activity)],
})

Sixb records signed-in users and shared-link visitors. An app without sign-in records nothing.

Visits

  • A visit groups the tabs of one sign-in. It ends after 30 minutes without activity (activity.idleTimeoutMs, from 1 minute to 24 hours) or after 24 hours.
  • A user counts once per period. Shared-link visitors have no account: they are counted apart, by the share they opened.
  • Periods cover the last 24 hours, 7 days or 30 days. A user's calendar covers a year, and a day opens its visits. Days are in UTC.
  • A visit keeps how it arrived: the utm_source, utm_medium and utm_campaign of your links, otherwise the referring site, otherwise Direct.

What a visit shows

A visit's timeline lists, by time and filterable by kind:

EntryWhat it shows
PagesRoute patterns, such as /invoices/:invoiceId
InteractionsThe elements you mark
Actions and workflowsThe runs the visit's session started, with their outcome
Agent runsStatus, messages and cost

Above it, the connection names the browser and system, or the shared link. A user's view also lists their sign-ins with the visits each opened.

Each page view is a step, with what happened on that page under it and a mark when it is a revisit.

An action names its object, and links to its run, only if you may read them. A visit shows at most 200 page views and interactions and 200 runs, and says when it stops short.

Track interactions

Mark what people click, or call trackSixbEvent for what is not a click:

TSX
<Button data-sixb-track="invoices.export">Export</Button>
TS
import { trackSixbEvent } from "@sixb/client/browser"

trackSixbEvent("invoices.filter.applied")
  • Names are constants in lowercase dotted segments, such as invoices.row.open. Names that look like values, such as invoices.123, are refused: never put an id or user input in a name.
  • Sixb records the name, the page and the time, never the element's text or a value.
  • Call trackSixbEvent in response to something the person did, not on each keystroke.

Privacy and limits

  • Never recorded: URLs and their values, page contents, form values, element text and IP addresses.
  • The built-in Data, Observability, Ontology and Settings pages are not recorded.
  • Use SQLite or PostgreSQL to keep history across restarts. It has no automatic expiration.
  • Browsers can fail to deliver events: use activity to understand usage, not as an audit trail.

Search docs

Search the documentation