Metrics
How KPIs are computed from raw events at query time
All metrics in Yavio are derived at query time from the raw events stored in ClickHouse. Nothing in this page represents a separately stored value — each metric is a query over the events table.
Overview KPIs
The dashboard overview shows these high-level metrics:
| Metric | How It's Computed |
|---|---|
| Total invocations | Count of all tool_call events |
| Unique sessions | Count of distinct session_id values, without per_request sessions (see Sessions); the card then says how many calls came from clients without a session key |
| Error rate | Ratio of failed tool_call events to total tool_call events |
| Avg latency | Average latency_ms across all tool_call events |
| Invocations over time | tool_call events grouped by time bucket (line chart) |
| Platform breakdown | tool_call events grouped by platform (pie chart) |
| Locations | tool_call events grouped by country_code, and within a country by region (table). Users are counted with the same key as the Users page, per country and per region, so a person seen in two regions is one user of the country. A call without a location is listed as Unknown: in practice only ChatGPT sends one, and only to apps that capture tool arguments; the card shows the share of calls with a location |
| Top tools | tool_call events grouped by event_name, ordered by count |
| Total conversions | Count of all conversion events |
| Total revenue | Sum of conversion_value across all conversion events |
Business KPIs
| Metric | How It's Computed |
|---|---|
| Session-to-conversion rate | Sessions with at least one conversion / total sessions |
| Widget engagement rate | Sessions with any widget_click or widget_form_field / sessions with widget_render |
Tool Explorer Metrics
Per-tool deep-dive analytics:
| Metric | Description |
|---|---|
| Per-tool invocation count | How often each tool is called |
| Latency distribution | Histogram of execution times for a selected tool |
| Error rate over time | Error ratio per time bucket for a selected tool |
| Error category breakdown | Distribution of error types (auth, validation, timeout, etc.) |
| Parameter fill rates | How often each parameter key appears in tool calls |
| Top parameter values | Most frequent values per input key |
| Common parameter combinations | Frequent patterns in input_keys |
| Zero-result rate | Percentage of tool calls that returned empty results |
| Tool discovery-to-invocation ratio | How often a discovered tool is actually called |
Funnel Metrics (Coming Soon)
Funnels follow a conversation's step events in the order they happened. One conversation (session) is one attempt, however many server instances served it:
| Metric | Description |
|---|---|
| Step progression | A conversation's steps, numbered by time; step_sequence only breaks a tie within one millisecond. Steps up to 30 days before the selected range count for the numbering; a conversation that began earlier is numbered from its first step within those 30 days |
| Drop-off rates | Percentage of conversations that don't progress from step N to step N+1 |
| Example traces | Full event timeline for individual traces |
Timing Metrics
| Metric | Description |
|---|---|
| Time-to-first-interaction (TTFI) | Time from widget_render to first widget_click |
| Time-to-first-tool-call | Time from session start to first tool invocation |
| Latency percentiles | p50, p95, and p99 latency across tool calls |
Sessions
A session is the set of events sharing one session_id. Sessions are computed from the raw events at query time. Nothing is materialized, and there is no "session close" event. The dashboard counts distinct sessions. Per-session figures like duration or tool count are an aggregation over events grouped by session_id; you can run one yourself through the analytics MCP server's run_query.
A session whose session_source is per_request is not counted — not in the Sessions KPI, not in a user's session count, not in the anonymous statistics. It comes from an HTTP call that carries no session key, on any host (SDK 0.5.4 and later). Since SDK 0.5.5 every such call is a "session" of its own; on 0.5.4 a server that reuses one stateless transport put all its key-less callers into one. Its widget events carry the label too (the widget stamps its server session's source). Rows from SDKs before 0.5.4 — server or widget — have no session_source and count as before. To group such calls into conversations, set sessionKey; paths and funnels need it too, since they work per session.
Users
Users are counted with one key per person:
- the
user_idfrom.identify()on the event itself; - otherwise the user of the first
.identify()in the same session, so the session's events before the call, and those of other server instances that served the conversation, count for that user; - otherwise the
user_idthat the samesubject_idwas identified with, so the person's other conversations count for the right user; - otherwise the
subject_iditself.
A session is never counted as a user.
| Metric | Description |
|---|---|
| Active users (DAU / WAU / MAU) | Distinct users in the day, and in the 7 and 30 days up to it |
| New vs returning | New: the user's first event in the data Yavio holds falls in the bucket |
| Retention cohorts | Users by the period they were first seen, and how many came back in later periods |
"First seen" means within the raw events still stored: 13 months, or the project's shorter retention (Data retention). A user last active 14 months ago counts as new.