Why did conversion drop? Watching an agentic analyst work

A chat assistant answers the question you asked, in one pass: plan some queries, run them, describe the result. That is useful when you already know where to look. “Why did conversion drop?” is not that kind of question. An analyst answering it does not run four queries and stop; they look at the overall picture, find the step that moved, check whether a segment explains it, go and look at the sessions, check for an error, check what was released, and only then write it up.

InsightClickIQ’s agents work that way. An agent is given a goal, a toolbox of 31 tools (the same registry the MCP server exposes to Claude, Cursor and other external agents), a budget, and rules: never state a number that did not come from a tool, go broad before going deep, and finish with evidence. Every tool call it makes is recorded and streamed to the run page as it happens. This post is one real run, start to finish.

Starting the run

Nine playbooks ship with the product — conversion analyst, frustration hunter, traffic analyst, page audit, journey explorer, error triage, form doctor, weekly review and install health. A playbook is a goal template, a hint about which tools matter, and a deterministic plan for when no model is available. We started the conversion analyst on Northwind with nothing but the project id:

POST /api/agents/runs
{"playbook": "conversion_analyst", "project_id": "f2d35484-…"}

The request returned at once with a queued run whose goal had been rendered from the template: “Explain how conversion on Northwind Outfitters moved over the last 7d and why. Compare the period with the previous one, find the funnel step, device, source or page that carries the change, and prove it with sessions. End with what to fix first.” The same run can be started from the Agents page, from a conversion-drop signal’s Analyze with an agent button, from Ask with Deep analysis switched on, or on a daily or weekly schedule.

AI Agents — run
The agent run page: on the left a trace of ten numbered tool calls with timings and one-line results; on the right the answer, headed Orders dropped from 165 to 111, with the funnel impact and what to fix first
The trace on the left is the audit trail. Each row is a tool, its arguments (expand the chevron), how long it took and what it returned. The answer on the right was written only after step 10, from those results.

The ten steps

The run finished in 37 seconds, used 85,973 model tokens and made ten tool calls. Here they are exactly as the trace recorded them:

#ToolTimeWhat came back
1web_overview254 ms1,499 visitors (−39%), 1,536 sessions, bounce 12%, 309 errors, 232 rage clicks
2compare_periods14 msProduct views 1,529 vs 2,215 (−31%); add to cart 449 vs 556 (−19%); checkout started 218 vs 250 (−13%); orders 111 vs 165 (−33%)
3run_query (funnel)15 msThis week: 950 → 375 → 212 → 107, 11.3% overall
4run_query (funnel)49 msThe week before: 1,316 → 441 → 237 → 155, 11.8% overall
5drivers9 msOrders 165 → 111; no source carries it (orders carry no UTM source)
6journey_dropoff3.2 s218 started checkout, 107 never ordered (49%); none of them left /checkout
7errors11 msOne error group: Uncaught TypeError: Cannot read properties of undefined (reading ‘days’)
8run_query (funnel)13 msThe funnel again (a repeat; see below)
9error_detail87 ms893 events, 229 sessions over 30 days; stack at app.js:217, on form submit
10list_annotations7 msOne annotation: release — v2.4 — new checkout flow, October 20

Read the trace as an analyst’s notebook and the reasoning is visible in the order of the calls:

The conversion analyst's ten steps on Northwind, grouped as breadth, locate, prove and concludeBREADTHwhat moved, and by how much1 · web_overview1,499 visitors (−39%)2 · compare_periodsorders 111 vs 165 (−33%)LOCATEwhich step, which segment3 · run_queryfunnel this week: 11.3%4 · run_queryfunnel last week: 11.8%5 · driversno single source or device8 · run_queryfunnel re-checkedPROVEthe sessions and the error6 · journey_dropoff218 started, 107 never ordered7 · errors1 error group on /checkout9 · error_detailTypeError … 'days'10 · list_annotationsv2.4 — new checkout flowfinish()headline ≤ 90 charsanswer ≤ 300 words6 findings, each witha console link or a questionevidence: steps 2, 3, 4, 53 follow-up questionsEvery step is a tool call through the same registry the MCP server exposes. Each is stored with its arguments, a one-line summary,its time and its result, and streamed to the run page as it happens. Budget: 12 tool calls and 150 seconds; this run used 10 and 37 s.
The same ten steps grouped by what they were for. The model chose each next tool after reading the previous result; nothing about this order is hard-coded.
  • Breadth first. Steps 1 and 2 establish the size of the problem: visitors down 39%, orders down 33%. Most of the fall in orders is a fall in traffic.
  • Is it only traffic? Steps 3 and 4 run the purchase funnel for this week and the week before, with explicit dates for the previous period. Overall conversion barely moved (11.3% vs 11.8%) — but the step-by-step figures tell a different story. Add-to-cart actually improved (39.5% of product viewers against 33.5%). The last step, checkout started to order completed, fell from 65.4% to 50.5%.
  • Is it one segment? Step 5 asks the drivers analysis which dimension carries the change. It finds no single source — Northwind’s orders carry no UTM source, so the whole change sits under “(none)” — and the device split is even (mobile 64 → 36, desktop 91 → 63). So not a campaign, not a device.
  • Prove it with sessions. Step 6 looks at the 218 sessions that started checkout: 107 never ordered, and not one of them left /checkout. They did not wander off; they were stuck. 64.5% rage-clicked, 60.8% hit an error.
  • What error? Steps 7 and 9 find a single error group — a TypeError reading days of undefined at app.js:217, fired on form submit — and its detail.
  • What changed? Step 10 reads the annotations: v2.4, a new checkout flow, released on October 20.

Step 8 is a repeat

The agent ran the same funnel a second time. The harness refuses an identical call and points the model at the earlier step; this one differed in a detail of its arguments, so it ran — in 13 milliseconds. It cost nothing that matters, but we show it because the trace shows it. An agent that hides its wasted steps is harder to trust than one that leaves them in.

The answer

The run ends when the model calls finish with a headline (at most 90 characters), an answer (at most 300 words), up to six findings, the step numbers whose results should be shown as evidence, and up to three follow-up questions. The headline here was “Orders fell −32.7% in 7d — a JS crash introduced in v2.4 (Oct 20) is blocking checkout”. The answer’s core paragraph:

The overall funnel conversion held roughly flat (11.3% vs. 11.8%), meaning the revenue loss is mostly a traffic problem — but a critical bug is making it far worse at the last step.

The conversion analyst, run 5295fd3b

It then lists the funnel impact (65.4% → 50.5% at the final step, a 14.9-point drop), notes that the drop is spread across mobile and desktop and every source — “not a campaign or device-specific issue” — flags the dead Apply coupon button on /cart as a second friction point it saw in the session summaries, and ends with an ordered list: hotfix app.js:217 (guard the .days access, or roll back v2.4 if a fix is hours away), then fix the coupon button, then investigate the traffic fall separately.

AI Agents — findings
The findings column of the agent run: orders down 32.7 percent with a View funnel action, a JS crash on checkout with View error, the v2.4 release coinciding with the error spike with See sessions stuck on checkout, a 64.5 percent rage-click rate with Watch a rage-click session, the traffic fall, and the dead Apply coupon button with View cart heatmap
Every finding has somewhere to go. A console route (the error, a session, the cart heatmap) or a question for Ask. The harness rejects links to routes that do not exist.

Each of the six findings carries an action. “See sessions stuck on checkout” and “Watch a rage-click session” open specific replays the drop-off step returned. One of them is a Safari session from Tokyo whose AI summary reads, in part: “On the checkout page they filled in all form fields and attempted to place a $59 order, but every submission triggered an uncaught TypeError … The session ended with repeated failed order attempts and a rage click.”

Session replay
A session replay of the Northwind checkout page with the Place order button, and the timeline beside it showing repeated Clicked Place order, Submitted a form and Uncaught TypeError entries, then a dead click and a rage click
The proof, one click from the finding. Place order, form submitted, TypeError — three times in a row, then a dead click and a rage click. The red ticks on the scrubber are the errors.

The sentence to push back on

The headline says the crash was introduced in v2.4, and one finding says the error was “first seen Oct 20 — the same day v2.4 shipped”. Expand step 9 in the trace and the error detail says otherwise: this fingerprint was first seen on September 25, and the project’s daily error count ran at roughly 15–40 for the whole month. What changed after the release is the rate. Errors went from 23 on October 20 to 41, then 103 and 98 on October 22 and 23, while orders went from 24 a day to 14 and then 7.

DayErrorsOrdersNote
Oct 191923
Oct 202324v2.4 released (annotation)
Oct 214127
Oct 2210314
Oct 23987
Oct 243711

So the accurate sentence is “an existing checkout error became several times more frequent two days after v2.4, and orders fell with it”. The recommendation does not change — guard app.js:217, or roll back — but a reader writing the incident review should use the trace’s numbers, not the headline’s word. This is the point of showing every step with its result: the agent’s conclusion is an argument, and the trace is the evidence you can check it against. A chat answer gives you the conclusion alone.

A one-shot answerPlans, runs, describes — once

Asked “why did orders drop this week?”, Ask (without Deep analysis) found the error spike on October 22–23 and the mobile split in 13 seconds. It did not run the previous week’s funnel, did not look at the release annotation and did not open the error’s detail.

The agentLooks, decides what to look at next

Ten calls, each chosen after reading the last. It found that add-to-cart improved while the last step collapsed, that stuck sessions never left the checkout page, and the release. It also overstated one date — and left the step that shows it.

What keeps an agent honest

An agent with tools can do more than a chat box, which is exactly why the guardrails matter more. The harness enforces these, in code:

GuardWhat it does
Tenant-pinned toolsEvery tool runs on a database session pinned to the caller’s organisation; the agent cannot read another tenant’s data
Writes need an editorTools that create something (investigations, dashboards, segments, annotations, alerts) require the editor role; a viewer’s agent cannot write
No SQLThe agent queries through run_query with a QuerySpec, like Ask; the engine validates it
BudgetsAt most 12 tool calls by default (20 at most) and 150 seconds; past either, only finish is offered
No identical repeatsAn identical call is refused with a pointer to the step that already has the answer
Evidence by step numberThe answer’s charts and session lists are drawn from the results of the steps it names, not from anything it writes
Rules pathIf the model fails, the playbook’s fixed plan runs the same tools and rule findings are read off the results; the run is marked rules
10tool calls
37 sstart to answer
6findings, each with an action
1date the trace corrects

Running it every week

A playbook can be scheduled per project — daily or weekly — with one call (PUT /api/agents/playbooks/conversion_analyst/schedule {"every": "week"}) or a toggle on the Agents page. The background loop starts at most one scheduled run per project per hour and records it like any other, so Monday’s run is waiting with its trace when the team arrives. A conversion-drop signal does the same on demand: its Analyze with an agent button starts this playbook with the signal attached as context.

From signal to fix
  1. Signal
    Conversion drop detected

    Computed statistically in the background, with a cost on it (see signals with a price tag).

  2. Agent
    Conversion analyst runs

    Ten steps, 37 seconds; the trace and the answer are on the run page.

  3. Proof
    Investigate the stuck sessions

    An investigation of frustrated, non-converting sessions: twenty replays summarised and grouped.

  4. Fix
    Guard app.js:217, fix the coupon button

    The decision is a person’s. Next week’s scheduled run is how you check it worked.

The model reads, chooses and writes; the engine counts; the trace records. When the three agree you can act quickly. When they do not — as with one date above — you can see exactly where, which is more than most analysts’ write-ups offer.

← All posts   Request a demo