Documentation

Metrics and money

Definitions, and the four places where a reasonable assumption will make you wrong.

Revenue is gross, and a lower bound

Every money figure on this server comes from the web pixel, which observes checkout completion and never learns what happened next.

  • It reads high.Returns, cancellations and post-purchase edits are invisible. One store with a 32% return rate reported 1.47× Shopify's net figure.
  • The order count reads low. Consent refusals and ad blockers hide some orders entirely.

Say it out loud

Never present these figures as Shopify's “total sales”. Say “gross, before returns”, and discount by your store's return rate before committing spend against a sized opportunity.

Currency

Money is quoted in your store's Shopify reporting currency, and every response carrying money also carries a currency field. Do not assume euros — most multi-currency stores report in something else, and a merchant reading SEK figures labelled € acts on a number that is wrong by the exchange rate.

Foreign-currency orders are converted at ECB reference rates, on read. Correcting a rate therefore fixes history rather than only new data.

One exception: add-to-cart events carry no currency code, so a foreign-currency cart that never reached checkout is assumed to be in the reporting currency. That affects get_cart_analysis only.

Conversion rate means two different things

This trips up everyone once.

get_funnel_analysis
Session-based over product-viewing sessions. The denominator is sessions that reached a product page.
get_session_insights
Over all sessions, including the ones that bounced off the homepage.

The two will not match and neither is wrong. Say which one you are quoting, and never compare one against the other across a report.

Sessions, not events

Every funnel step counts sessions. A visitor who adds to cart four times counts once. That makes step-to-step ratios true drop-off rates rather than inflated event ratios — and it is why these numbers will not line up with an event-counting tool.

One consequence worth stating: add-to-cart counts still include quick-adds and repeat adds, so the add-to-cart to checkout drop always looks worse than the true loss of intent.

Engagement and frustration scores

Both are 0 to 100, computed per session during nightly enrichment. Engagement rises with pages viewed, active time and scroll depth. Frustration rises with rage clicks, dead clicks and JavaScript errors.

They are ranking devices, not physical quantities. “Frustration above 60” is a useful filter for finding sessions worth reading; “average frustration rose from 21 to 24” is not a finding.

Rage clicks and dead clicks

A rage click is a burst of repeated clicks in the same spot. A dead click is a click on an element with no handler and no href.

Rage on repeated-use controls is usually not rage

Quantity steppers, carousel arrows, gallery next buttons and number pickers are clicked rapidly by design. The heuristic cannot tell four eager clicks from four angry ones. Rage on a checkout button is a finding; rage on a plus stepper needs corroboration — a JavaScript error on the page, a conversion gap, dead clicks nearby — before you call it frustration.

Why the numbers beat GA4

Declared crawlers are excluded before any rate is computed, so Click Context reports fewer sessions and a better conversion rate than GA4 or Shopify for the same window. Expect the gap. It is the correction working.

AI-agent sessions are flagged rather than removed, and reported as agentSessions. Keep them out of UX conclusions — an agent does not hesitate, hover or rage-click like a person.

Orientation benchmarks

The server ships these to your assistant so it can judge whether a number is a problem. Prefer your own history or a sibling segment as a baseline whenever you have one — a store's past self is a far better control than an industry median.

MetricWeakTypicalStrong
Session to order<1.0%1.3–2.0%3%+
Product view to add-to-cart<4%5–10%12%+
Add-to-cart to checkout started<35%40–60%70%+
Checkout started to completed<40%45–65%75%+
Rage-click rate (page)>5%1–3%<1%
Dead-click rate (page)>8%2–5%<2%
Bounce rate (homepage)>65%40–60%<35%

One expectation matters more than the absolute numbers: desktop normally converts at 1.3 to 2× the mobile rate. Desktop converting below mobile is an inversion of the usual pattern, and almost always means a broken desktop flow rather than a difference in shopper intent.

Check the median before quoting an average

Session duration and time on page are heavily skewed by abandoned tabs. A single 20-hour session can carry most of a page's total engaged time. get_session_insights returns both a median duration and a mean active duration for exactly this reason.