Skip to content

Read and explain results

The commands read results RoutingCat prepares in the background; running them computes nothing. This guide shows how to read status, show, sources and download, and how to explain what they say to a person. What the numbers mean explains the kinds of number behind them, and Read the dashboard reads the same results on the dashboard.

Check how it’s going

Run npx routingcat status. Here it is nine days after a site’s home page went live with four headlines:

$ routingcat status
inkwell · production · 2026-10-11 09:20Z · counts to 09:00Z · estimates matured to 10-11 · contract 1.0
since 2026-10-04 09:20Z: 1 deploy (dp_01m4k54960e4ma9r026sfe2he2), no acts → routingcat status --since 2026-10-04
home · objective signup, 24 h · control: the defaults, 10% · live since 10-02 · publication pb_01m4k57yc0fa9vhrhd9qpf2dm2
gain +9 conversions (signup) vs defaults, no range: too few visits · measured · 341 routed / 47 control visits · maturity 0.88
hero default write-daily · 4 live
write-daily default 2.2% [0.5, 3.9] · signal 3 Early · served 28% · 96 visits
streaks favored 2.6% [0.7, 4.5] · +19% [−100, +145] vs default · signal 3 Early · served 40% · 135 visits
prompts learning 3.3% [1.1, 5.6] · +51% [−100, +207] vs default · signal 3 Early · served 31% · 104 visits
private prior 2.7% [0.4, 5.3] · +24% [−100, +177] vs default · signal 0 New · served 2% · 6 visits
variant rates and contrasts are predicted; the measured gain compares routed visits with the control
tracking signup 19 in 7 days · joined 37% (visitor 32%, account 5%) · no routed visit 53% · no key 0% · unlinked 0% · outside window 11%
visitors 333 on routed pages in October so far, people only · 5 automated left out
variants 3 live of the 10 the Hobby account's sites share, the defaults not counted
sources 7 days, accounting: search 8 · direct 4 · social 3 · email 2 · paid 1 · unknown 1 → routingcat sources
warnings none · deployments: dp_01m4k54960e4ma9r026sfe2he2 current (commit 2d79ae7), none unregistered
more routingcat show home/hero:streaks · --json for every field

Line by line:

  • The header says how fresh the figures are: counts include what arrived by 09:00 UTC, and estimates use visits matured by October 11. Below it, what changed since you last ran status on this machine, or over the last 7 days.
  • The page line gives the objective and its window, and the control’s share.
  • gain is the page’s measured gain: the extra sign-ups its routed visits produced over the defaults, with its range once there are enough visits, the routed and control visits behind it, and the share of them matured.
  • Each variant shows its label, its predicted rate with its range, its predicted difference from the default with its range, its signal, the share of the slot’s routed visits it was served, and its routed visits. The line under them says which figures are predicted.
  • tracking says how the objective’s conversions over 7 days joined routed visits, by visitor or by account, and why the rest didn’t. Track conversions explains each reason.
  • visitors counts this month’s distinct visitors on routed pages, people only, as your plan counts them, and the automated visitors left out.
  • variants, on Hobby, counts live variants against the 10 your account’s sites share, the slots’ defaults not counted, with this site’s part when you own several, and those held past them.
  • sources is 7 days of conversions by channel, as accounting.
  • drift, when there is any, lists each place where what’s live differs from your code, as Change what’s live explains.
  • warnings lists each warning with its message id, which Messages explains.

On Hobby, a variant past the 10 live variants across your sites is held: registered, and not served until there is room. Its slot counts it apart, and its row says so. From status welcome, at the 10:

checklist default steps · 3 live · 1 held
steps default 3.0% [0.4, 5.7] · signal 0 New · served 35% · 11 visits
video favored 3.0% [0.4, 5.7] · 0% [−100, +128] vs default · signal 0 New · served 29% · 9 visits
quiz prior 3.0% [0.4, 5.7] · 0% [−100, +128] vs default · signal 0 New · served 35% · 11 visits
tour held registered, not live: past the 10 the Hobby account's sites share

The variants line then ends · 1 held, warnings names the held variants with the way out, and show welcome/checklist:tour reads live · held by the plan.

status home shows one page with all its variants; with many pages, status shortens to a line per slot to stay under 40 lines. status --since 2026-10-04 lists what happened since then: deploys, changes, acts and warnings. --json gives every field of every command.

Look closer at one variant

npx routingcat show takes any address, or any id the other commands print. For a variant:

$ routingcat show home/hero:streaks
home/hero:streaks · vr_01m3yns6z0e829v0t88n5qnn6n · live · favored · served by dp_01m4k54960e4ma9r026sfe2he2
version @v1 (rv_01m3yns6z0f2ebpyen892gv87p, 3243c8) since 10-02, ch_01m3yns6z0fz8v4em957cjc5jf "Try three headlines on the home page"
headline "Keep your writing streak alive"
scores signup@1 · release rl_01m4m5qzm0f71bbb0zaavzqx05 · publication pb_01m4k57yc0fa9vhrhd9qpf2dm2 · counts to 00:50Z · matured to 10-11
rate 2.6% [0.7, 4.5] · predicted
vs default +19% [−100, +145] relative · +0.4 pts [−2.1, +3.0] · predicted
signal 3 · Early · 101 matured visits
counted 2.5% of 122 matured visits · 3.0% of all 135, incomplete · 71.1% rendered
served 40% of hero; routing currently intends 33%
scorecards
ev_01m3yns6z0fm693znkpv7yttp9 vs default write-daily, since 10-02 · as served · +24% [−100, +176] predicted · run_01m4m79dn0eb28eg2mc30hyx16
by device visits served relative counted predicted
mobile 68 37% 0.93 3.3% 3.0% [0.3, 6.3]
desktop 64 44% 1.10 1.7% 2.1% [0.2, 4.9]
other 3 30% 0.76 0.0% 2.4%, no range: too few visits
also --by traffic_source, visit, time_of_day, day_type
other outcomes, counted trial_started 0.0%
engagement seen 79% · 2.7 s visible · 4.0% click inside the slot
related sl_01m3yns6z0f33vg9d3m1a5nngd · ch_01m3yns6z0fz8v4em957cjc5jf · pb_01m4k57yc0fa9vhrhd9qpf2dm2 · ev_01m3yns6z0fm693znkpv7yttp9 → routingcat show <id>
  • version is the variant’s current version and its content, with the commit message that made it.
  • rate and vs default are predicted: its rate, and its difference from the default in percent and in points, each with a range. In --json, that difference is contrast_with_default, and a scorecard’s is lift_vs_comparator.
  • signal gives the evidence behind the predicted rate, and the matured visits behind it.
  • counted is its counted rate over matured visits, then over all visits so far, which reads low, and the share of its visits where the browser confirmed it rendered.
  • served compares the share it got with the share routing intends now.
  • scorecards lists the comparisons opened when it went live, each with its latest result; show with the scorecard’s id gives its detail.
  • by device breaks the variant down by a report dimension: visits, share served, relative share, and counted and predicted rates.
  • other outcomes and engagement are counted: its rates for the other tracked outcomes, and how often the slot was seen, how long, and how often clicked inside.

Breakdowns are report options. --by picks the dimension: device, by default, traffic_source, visit, time_of_day or day_type. The relative share is the share served in that group over the share served overall: it describes where the variant was shown, not which group prefers it. A small group shows its value with no range.

Find where conversions come from

npx routingcat sources counts conversions and revenue by where each visit came from, over the last 7 days by default:

$ routingcat sources --since 7d
pantry · production · 7 days to 2026-10-15 08:00Z · accounting, not lift · contract 1.0
channel arrivals signup rate trial_started purchase revenue
search 2,883 63 2.2% 31 11 $99
direct 1,816 39 2.1% 15 6 $129
referral 594 14 2.4% 6 3 $102
social 818 12 1.5% 7 3 $102
email 356 10 2.8% 8 0 —
ai 449 9 2.0% 10 0 —
paid 467 8 1.7% 6 1 $9
other 164 3 1.8% 2 1 $9
unknown 230 7 3.0% 0 0 —
no_arrival — 7 — 5 1 $9
total 7,777 172 2.2% 90 26 $459
top sources google 66 · newsletter 10 · producthunt.com 8 · chatgpt.com 6
top campaigns launch-thread (social) 8 · weekly-digest (email) 6 · retarget-q3 (paid) 5 · brand-search (paid) 2
top landing / 97 · /pricing 15 · /changelog 9 · /blog/meal-prep-sunday 8
channels as classified by program launch-1 · also --by source, campaign, landing
  • It is accounting, as its first line says: it shows where conversions came from, never what caused them.
  • Each conversion counts under the latest arrival from outside the site before it, by the converting visitor or by the visitors linked to its account. One with none counts under no_arrival, so totals match the events.
  • unknown means the arrival carried no usable information. On your site, that includes typed and bookmarked visits, which carry no referrer: they count as direct only where the server helpers set the fetch-site cookie, rc_fs. other means tags RoutingCat didn’t recognize.
  • --by source, campaign or landing groups by those instead of the channel; a page, as in sources home --since 14d, counts only the conversions credited to that page’s visits.

Download the figures

npx routingcat download <report> writes a prepared report to a file in the current folder, and prints the file’s name, its rows and how fresh its counts are. cells is the most detailed report, the counts and sums each figure is built from, as CSV; the others come as JSON. --filter page=home slot=hero narrows it, --by keeps one breakdown or a pair of them, and it covers the last 90 days unless you give since= and until=. A download selects prepared figures, never rows of visitors. The command reference lists the reports.

Explain results to a person

Say each figure with its kind and its range, in plain words:

  • Name the kind. Counted is what happened, predicted is the model’s belief, and measured comes from a random split, as the measured gain does. In --json, a figure’s basis gives its kind: descriptive is counted, modeled is predicted, and randomized is measured; JSON output gives every field.
  • Give the range, and say “too early to call” when it spans zero.
  • Say “leads” or “is shown most”, never a verdict.
  • Say that browsers made the decisions. In --json, your site’s figures carry verification: unverified: they rest on decisions your visitors’ browsers made, which RoutingCat replays from what each browser recorded. A replay shows that a decision follows from its inputs, never that a person saw it.

Worked examples, from the output above and from other sites’ status:

The output What to say
+9 conversions (signup) vs defaults, no range: too few visits “Nine days in, there are too few visits to measure what routing adds. Routing shows ‘Keep your writing streak alive’ most for now, but each new headline’s predicted difference from today’s runs from −100% to well above: none is known to be better or worse yet.”
−33 conversions (signup) vs defaults [−218, +152] “Three months in, routing’s effect on home-page sign-ups is somewhere between 218 fewer and 152 more than showing everyone the defaults: the direction isn’t known yet.”
+246 conversions (signup) vs defaults [+9, +482] “Routing has added about 246 sign-ups on the home page over showing everyone the defaults; the evidence puts it between 9 and 482.”
3.5% [3.0, 4.1] · −20% [−34, −5] vs default · signal 69 Strong, for the variant current “The model predicts the current headline converts about 20% less than the default, between 5% and 34% less, with strong evidence behind that prediction. It is a prediction, not a measured result.”
The email row of sources above “Email brought 10 sign-ups last week, 2.8% of its arrivals, against 2.2% overall. That’s where sign-ups came from, not proof that email caused them.”
The tour row above, held “The tour checklist is deployed but not shown yet: your sites use all 10 live variants Hobby includes. Upgrading to Pro, or retiring a variant, puts it live within about 2 minutes.”

What never to claim

  • A winner, a significant or proven result, or a confidence level. Say what the evidence shows.
  • A predicted difference as a gain. Only the measured gain counts as one, and in prose a predicted difference is “the difference from the default”, never “lift”.
  • A site-wide gain. Each page’s gain stands alone; never add pages’ gains together.
  • A head-to-head of counted rates. Routing shows variants to different visitors, so compare their predicted differences from the default.
  • An incomplete rate as final, or a missing value as zero.
  • Signal as a chance of being best, favored as a verdict, a relative share as a preference, or sources as causes.
  • A result on the first good day. The range is recomputed daily and is not a stopping rule.

Next