An AI reading on every screen, not a chat box in one tab

An analytics console is a wall of numbers that each need a sentence. Errors are up — is that one bug or many? Sessions are flat — is that good for a Tuesday? LCP is 3.4 seconds — on which page, and does it matter? The sentence is the work an analyst does, and most products leave it to the reader. The ones that have added AI mostly added it as a destination: open the assistant, type the question you already had.

InsightClickIQ does it the other way round. Every screen in the console carries a contextual reading of what that screen is showing, written for the scope you are looking at — project, date range, filters, the error or person or form you opened. Every chart and every dashboard widget has an Explain. You do not ask; the reading is there when the page loads, with the numbers it rests on beside it.

Errors · AI reading expanded
The Errors page with its AI strip expanded. Headline: Checkout TypeError surged to 870 errors this month, tripling error-affected sessions. A narrative paragraph, five findings tagged Risk, Down, Anomaly, Tip and Win, each with an action such as Inspect error, View affected sessions or Ask why; a row of evidence chips (870 total errors, 23 previous period, 1 fingerprint, 223 sessions, 2.71% of sessions, 25.6% vs 10.1% conversion, /checkout); and three suggested questions
Read the evidence chips before the prose. Every figure in the paragraph above them is one of those chips, computed before the model was asked anything. The links on the right go to real console routes; “Ask why” hands a question to Ask AI.

What a reading is

Every reading, on every screen, has the same shape. That consistency is the point: you learn to read one and you can read them all.

PartLimitWhat it is for
Headline≤ 90 charactersThe one thing on this screen worth knowing, collapsed by default
Narrative≤ 120 wordsThe headline with its reasons, in plain sentences
Findings≤ 5Each tagged up, down, risk, win, anomaly or tip, with an action: a link to a console route, or a question for Ask AI
Evidence3–8 numbersThe figures the narrative rests on, as chips
Questions≤ 3Follow-ups, one click into Ask AI
ModeAI or RulesWho wrote the words; the badge is always shown
Cached, updated—How old the reading is, with a refresh button

Rules first, model second

Behind every strip is one mechanism, not seventeen features. Each screen is a surface with a function that computes its facts in code from the real data: the KPIs against the previous period, the biggest movers, the device and country mix, the share of sessions with errors and how they converted. Those facts are compacted and handed to one shared narrate step, which asks the model to word them as JSON. The model sees numbers. It never sees raw events and never writes SQL.

What comes back is checked before it is shown: finding kinds must be ones the console knows, every action link must point at a real console route (overview, signals, sessions, heatmaps, forms and so on) or be an Ask question, and lengths are capped. If the check fails, or the model is switched off (CLICKIQ_AI=false), or the call errors, a rules template for that surface produces the same shape from the same facts, and the badge says Rules instead of AI.

One mechanism behind every insight strip A console screen asks for an insight with its surface name and context. A cache keyed on organisation, surface, project, range and context answers in about 0.03 seconds when warm. On a miss, a facts function computes the numbers in code from the real data, one shared narrate call asks the model to word them as JSON, the answer is checked, and a per-surface rules template answers instead if the model is off or fails. The result is cached for 10 minutes, or 2 for overview and live. Any screen overview · live events · sessions session · people person · errors · error performance · heatmap forms · form · journeys dashboard · chart project 17 surfaces + context: filters, an id, a chart spec insight_cache sha256(org, surface, project, range, context) TTL 10 min 2 min for overview, live facts_<surface> KPIs vs previous period, movers, mixes, splits — in code, no model narrate (model) one shared call sees compacted facts only never writes SQL check known finding kinds links to real routes capped lengths rules template per surface no model, failed or rejected → same shape, “Rules” Insight headline ≤ 90 narrative ≤ 120 findings ≤ 5 + action link evidence 3–8 questions ≤ 3 mode: AI | Rules cached · ttl hit: 0.02–0.03 s miss miss: 7–13 s, mostly the model call fails Timings measured on the Northwind demo with Claude Sonnet on Bedrock.
The same path for all 17 surfaces. The green box is where the numbers come from; the model only touches the words, and the red box catches it when it cannot.

The rules path is not a theoretical fallback. On the Northwind demo, the Performance page answered with Rules while its neighbours said AI: the model’s JSON for that larger fact payload came back truncated and failed to parse, so the template answered. The reading is plainer — “3 of 5 vitals good; LCP p75 3.4s”, then each vital with its rating and the slowest pages by LCP — but every number in it is right, and the reader can see which kind of reading they are getting.

Performance · a Rules reading
The Performance page with its insight strip expanded and a Rules badge. Headline: 3 of 5 vitals good; LCP p75 3.4s. Narrative lists CLS 0.020, FCP 1.20 s good, INP 0.21 s needs improvement, LCP 3.44 s needs improvement, TTFB 0.28 s good, and the slowest pages by LCP: / 4.7 s, /products/NW-PCK-010 2.2 s, /journal/pct-gear-review 2.1 s. One tip: slowest page / with LCP p75 4.7 s over 3,047 samples
The badge says Rules. No model wrote this. The facts are the same ones the model would have been given, laid out by a template: less fluent, never wrong about a number. The same strip says AI on most other pages.

Why the fallback is silent, and why that is a known issue

Today the rules reading replaces a failed model reading without telling anyone. The reader sees an honest badge; the operator sees one log line. Our own QA review lists the fix — a larger token budget for big fact payloads, one retry on a parse failure, and logging the raw tail — as open. A Rules badge where you expected AI is worth a look in the logs.

Seventeen surfaces, one contract

Here is what each screen’s facts are made of. Screens that already have their own AI narration — a session summary, a heatmap’s Explain this page, forms, journeys — are delegated to it, so there is one reading per screen, not two competing ones.

SurfaceWhat its reading is computed from
overviewKPIs and conversion vs the previous period, page and source movers, devices, countries, visitors online
liveVisitors now vs the same hour last week, pages now, errors, rage and dead clicks in the last 15 minutes
events, eventThe event mix vs previous: new and vanished names, movers; for one event, its trend, splits and the conversion of sessions that fired it
sessions, sessionThe filtered list against all sessions: frustration, conversion, errors, replay share, length, entry and exit; one session reuses its summary
people, personNew vs returning, identified share, most active and most frustrated; one person’s history
errors, errorVolume vs previous, new fingerprints, worst pages, conversion with and without errors; one error’s trend, browsers, pages and nearby annotations
performanceEach vital’s p75 vs previous with its rating, worst LCP pages, LCP by device
heatmapThe zones table and scroll bands (delegated to Explain this page)
forms, formField drop-off, time, refills, empties, errors (delegated to the forms service)
journeysMined patterns, converted vs dropped (delegated to the journeys service)
dashboardEvery widget’s query run under the current scope and compacted
chartOne chart’s result, its previous period, and drivers for a single series
projectInstall health: events per day, custom, identify, vital and form events, replay coverage — tips like “no conversion events defined”

Explain, on every chart

The chart surface is the one you meet most. Every dashboard widget has a small Explain button; every result in Analyze has one beside it. It runs the widget’s own query under the dashboard’s current scope, adds the previous period, and for a single series works out which source, device, page or country carried the change.

UX & frustration dashboard · Explain
The UX and frustration dashboard with the Explain popover open on the Rage and dead clicks chart. The popover says rage clicks totalled 1,061 and dead clicks 2,550 over 30 days, that the previous period had only 40 rage clicks and 115 dead clicks, which is too low for the percentage changes to mean anything, and that dead clicks peaked at 128 on 15 October. The dashboard strip above reads: Rage clicks surged to 1,042 — Apply coupon alone accounts for 27% of all rage clicks
Note what it refused to say. The previous 30 days held 115 dead clicks against 2,550 now. Instead of announcing a 2,000% surge, the reading says the baseline is too small to compare — the demo’s history starts 30 days ago.

That refusal is worth dwelling on, because it is the failure mode of most automated commentary. A naive narrator sees +2,117% and leads with it. This one was handed both totals, saw that the earlier window was more than ten times smaller, and said the comparison was not meaningful. It is not perfect at this yet — the change pills on the same dashboard still show “new”, and our QA review asks for a floor below which no change is shown at all — but the reading is on the right side of it.

Read the reading critically

A reading is a starting point, and the evidence chips are there so you can argue with it. The Errors reading above contains a good example. Its third finding says sessions with the checkout error converted at 25.6% against 10.1% for sessions without — “indicating high-intent users are disproportionately triggering this bug.”

True as arithmetic, and the model framed it sensibly, but the obvious explanation is selection: the error only fires on the checkout page, and anyone who reaches checkout has already put something in a cart. They would convert above the site average whether or not the bug existed. The right comparison is sessions that reached checkout with and without the error. The finding comes with an Ask why button for exactly that reason: it hands the question to Ask AI, which runs the comparison as a real query rather than speculating.

A reading taken on trust“Error-hit sessions convert 2.5× better”

Read as a fact about the bug, it suggests the error is harmless or even a sign of good traffic. Someone deprioritises the fix.

A reading taken as a lead“Compared with whom?”

The chips show the two rates and the 223 sessions. Ask why runs checkout-reachers with vs without the error. The investigation of 20 frustrated sessions had already shown every one of them failed to place an order.

The cache, and why latency is the real design problem

Readings are cached per organisation, surface, project, date range and context: ten minutes for most surfaces, two for Overview and Live because those move. A refresh button regenerates one on demand. The effect on the demo is easy to measure:

9.9 sErrors reading, first request (model call)
0.03 sthe same reading, cached
11.2 sa chart Explain, first request
~1 sfor the page’s own numbers to render

That gap is the uncomfortable truth about AI on every screen. The numbers on a page render in about a second. The reading, the first time a scope is viewed, takes seven to thirteen seconds, almost all of it the model. Our QA walk of every route found pages settling in 10 to 15 seconds, every one of them waiting on the strip, not on the data.

It matters more than it sounds. A reading that arrives after the reader has already scanned the page and formed a view is a reading nobody reads; a strip that pulses for twelve seconds on every first visit teaches people to scroll past it. The facts are ready in about a second because they are computed in code. The current plan, and the top recommendation in the QA review, is to use that: render the rules reading immediately, stream the model’s wording in when it arrives, and pre-warm a scope’s readings when the Overview loads.

What you get today

Readings are synchronous on first view and instant from the cache for 2–10 minutes after. In practice a team looking at the same project and range shares the warm cache: the first person to open Errors in the morning waits ten seconds, everyone after them does not. The numbers themselves never wait for the model.

What it is not

  • Not a replacement for the screen. The reading sits above the numbers and is collapsed to a headline by default. The page underneath is unchanged.
  • Not a chat. It answers the question the screen implies. Your own question goes to Ask AI, where a deep-analysis mode runs a multi-step agent with a visible trace.
  • Not free. Each first view of a scope is a model call. Caching and the shared narrate step keep it to one call per screen per scope per ten minutes, not one per chart.
  • Not dependent on the model. Turn the model off and every strip still answers, in the Rules voice, from the same facts.

The facts are computed before the model is asked anything, and they are on the screen whether or not it answers. The model’s job is the sentence.

What AI-native analytics means here →  ·  Signals with a cost on them →  ·  Reports with AI narrative panels →

← All posts   Request a demo