All events

The names our clients write for you, and what every one of them carries.

These are the names our clients write without being asked. Every one of them is an ordinary log entry: nothing in the backend branches on any name here, and an event you invent yourself is stored, indexed, filtered and grouped identically. What a premade event buys you is a spelling two projects agree on, and a starting-point board that already knows where to look.

Each has its own page, with every attribute it carries and what it never carries.

Written for you

Measured by the client, with no call of yours involved. Everything the browser tag does is behind consent: before consent is granted nothing is stored and nothing is sent, unless the tag is in ephemeral mode, which keeps nothing on the device and so has no banner to wait for. Lifecycle tracking in a desktop app is off until you turn it on, because a source has no kind and a client cannot know whether an install means anything where it is running.

EventWritten byWhat it means
page_viewBrowser tagA page or screen was viewed, including single-page-app navigations.
session_startBrowser tag, .NET, TauriThe first entry of a visit or a run.
page_leaveBrowser tagA page was left, with visible time and scroll depth.
outbound_clickBrowser tagA link to another site was followed.
file_downloadBrowser tagA link to a file was followed.
form_submitBrowser tagA form was submitted. The form, never its contents.
web_vitalBrowser tagOne Core Web Vital sample, once per metric per document.
app_install.NET, Tauri, PythonThis installation ran for the first time. Lifecycle tracking only.
app_launch.NET, Tauri, PythonAny run of an installed app. Lifecycle tracking only.

Written when you call

The helpers fill in a convention and nothing more. Everything they produce, log() can produce by hand, and an entry that follows no convention at all is stored and queried identically.

EventFromWhat it means
exceptionerror()Something threw. The tag can also catch uncaught ones, if you turn it on.
logtrace() through fatal()A free-form line, with the level as the severity.
identifyuser()This client now knows its user id. Every SDK, not the browser tag.
page_viewpage()The same name a browser writes automatically, from a server or a desktop app.

Suggested, but written by nobody

Two names with no emitter behind them. They are in the vocabulary so that two projects logging the same thing spell it the same way, and the keys are what the pickers offer.

EventWritten byWhat it means
http.requestYouOne request served, with the http.* attributes.
measurementYouA plain numeric sample. The shape every number here takes.

What rides on every entry

A client sends a resource once per batch: what is true of the client rather than of one entry. It is merged underneath each entry's own attributes at the edge, so a row ends up self-contained without the session id travelling fifty times over the wire. None of the event pages repeats these.

AttributeSent byWhat it holds
session.idEvery clientThe visit or the run. The tag cuts a new one after 30 minutes idle or a new external referrer; an SDK holds one for the process until you rotate it.
user.idEvery client, after user()Only ever the string you passed. Absent until you pass one, and never inferred from anything.
browser.languageEvery clientA BCP-47 tag. The tag reads it off the browser; an SDK sends what you configured.
service.nameSDKsWhat your software is called. Configured, never guessed.
service.versionSDKsThe build that wrote the entry. What a crash-by-version breakdown groups on.
os.typeSDKswindows, darwin, linux. Defaults to the platform.
host.archSDKsThe machine architecture. Defaults to the platform.
firstrun.channelSDKsstable, beta, nightly. Configured.
firstrun.testEvery client, in test modeThe JSON boolean true, and only ever when true. Production omits the key rather than sending false, so a staging build cannot move a number somebody is looking at.
firstrun.droppedEvery client, when it has droppedEntries the bounded queue discarded, cumulative. Absent while nothing has been lost.

The server then stamps project_id, firstrun.source.id and ingested_at, and those win outright: a client cannot claim to have arrived through a source other than the one whose key it used. The full row shape is in the log event reference.

One event of your own, with no code

Any element carrying data-fr-event="name" writes an event of that name when it is clicked, with no attributes and no change to what the element already did. A download button stays a plain link that happens to be counted, and it keeps working whether or not the tag loaded.

None of this is a fixed list

An event with a name nobody here has heard of, at a severity we have never used, carrying keys we do not suggest, is stored and queried exactly like a page view. Following a convention buys a suggestion in a picker and a shared spelling with the next project. It buys nothing else, and skipping one costs nothing.