UC-10 — Which experiment first: gain and cost to learn
Route: "which experiment first", "which metric to move first", "what to optimise" — a ranking of every lever, no change named or two to choose between ("a trial, or the paywall change first?") (SKILL.md § Router) · Eval: P10 · MCP: uc-10, cases-uc-10 Contents: Turns · Calls · Answer skeleton · Boundary · Stops · Worked example
Turns
- Nothing is asked before the table: the base is
.ue/<slug>.json(none →cases/uc-00-launch-card.md's interview), the daily budget sits involume, the horizons default to 30 and 90 days. A budget in the reader's message goes intovolume({ "amount": <budget>, "unit": "budget_day" }) with ameasuredOnnaming the budget as theirs ("your budget $<budget> a day; the rest from the book") before the run (SKILL.md § Files) — never the book's volume. - A lift the reader states goes in as
--override <lever>=<lift>(their "+25 % on the paywall" →--override p3=0.25); none stated → the CLI's default on every lever, labelled "assumed lift". Never propose a lift. - After the table: ONE question, naming only the lever it asks about. "What lift do you expect on
<lever>, as +X %?" The reader's answer to that question: a lift stated → a second
ue rankrun with--override <lever>=<lift>, printed as the skeleton; the default kept → no new run — record it, and restate no row; a restated row carries the table run'sboundarywhole under it.
Calls
npx -y @segmently/cli ue rank .ue/<slug>.json [--override <lever>=<lift>] [--horizon <N>[,<M>]]— ONE run, JSON.- Links:
recommendation.linksof that run (the two lifted variants; they carry the base'slabelandmeasuredOn— set both in the base before the run). Noue linkcall here.
Answer skeleton
sentences.ledger, when the run printed one — above the tablesentences.traffic- every
sentences.tableline, a blank line, everysentences.belowTableline as its own-bullet, a blank line,sentences.pick(SKILL.md § Blocks the CLI renders, the rank table row) — the belowTable lines aresentences.ranking,sentences.population, eachsentences.realism,sentences.ceiling,sentences.blocked,sentences.price, then everysentences.warningsline - the privacy sentence (
privacy.sentence— due forrecommendation.linkswhateverrecommendation.privacysays), thenrecommendation.links, each with the lever it lifts; under a structural pick's link, its row'ssentences.diffline(s), whole boundary— whole (SKILL.md § The boundary, rendered)- the one question
Boundary
Rendered: print boundary whole, after the pick and the links. Nothing about a row or the pick after it.
Stops
recommendation.firstnull →sentences.picksays no lever is learnable within the horizon at this budget; no link.- A lever with
lift0 (sentences.ceiling/sentences.blocked) is never attempted with a variant of your own;renewalsis a calendar read with no sample size. priceis ranked as a threshold on each plan's take (theprice:rows); a revenue-per-user price test iscases/uc-08-test-plan.md's means test (σ from the reader's data).- A structural row the reader wants to pursue →
cases/uc-13-test-an-offer-change.md(its break-even, the reaction question, the test).
Worked example
Base: the seed scenario, named before the run as a real answer names its base — label "seed at the
book's volume" and measuredOn "benchmark book, nothing measured" set in seed.json, so both
recommended links carry them — 986.84 funnel starts a day (base.startsPerDay) at $45,000 a month, from
the run below — every lever at the CLI's default +10 % relative ("assumed lift"), horizons 30 and 90
days. ONE run, in JSON:
npx -y @segmently/cli ue rank seed.jsonThis run's sentences.ledger is absent — no card has opened an entry yet, so nothing prints above
the table.
sentences.traffic, every sentences.table line, every sentences.belowTable line
(sentences.ranking, sentences.population, each sentences.realism, sentences.ceiling,
sentences.blocked, sentences.price, then every sentences.warnings line) and sentences.pick —
printed whole, in this order:
986.84 funnel starts a day (base.startsPerDay) at $45,000 a month
| lever | lift | gain / month | ROAS after | population / day | n per arm | days | spend routed | MDE @ 30 d | MDE @ 90 d | realistic | note |
|---|---|---|---|---|---|---|---|---|---|---|---|
| p1 | 0.1 (assumed lift) | 5112.01 | 1.25 | 986.84 | 3763 | 7.63 | 11289 | 0.0501 | 0.0288 | true | n/a |
| p2 | 0.1 (assumed lift) | 5112.01 | 1.25 | 296.05 | 1565 | 10.57 | 15650 | 0.0594 | 0.0343 | true | n/a |
| price:Annual subscription=131.99 | at the break-even | n/a | 1.14 | 51.81 | n/a | n/a | n/a | 3.55 pts | 2.02 pts | false | pays while Annual subscription's take stays ≥ 13.6 % |
| price:Annual subscription=107.99 | at the break-even | n/a | 1.14 | 51.81 | n/a | n/a | n/a | 3.83 pts | 2.19 pts | false | pays while Annual subscription's take stays ≥ 16.6 % |
| price:Monthly subscription=21.99 | at the break-even | n/a | 1.14 | 51.81 | n/a | n/a | n/a | 4.32 pts | 2.48 pts | false | pays while Monthly subscription's take stays ≥ 23.2 % |
| price:Monthly subscription=17.99 | at the break-even | n/a | 1.14 | 51.81 | n/a | n/a | n/a | 4.59 pts | 2.64 pts | false | pays while Monthly subscription's take stays ≥ 28.4 % |
| trial-add:Monthly subscription=free~7 | at the break-even | n/a | 1.14 | 51.81 | n/a | n/a | n/a | 6.07 pts | 3.03 pts | false | pays while the share of trial starters taken from Monthly subscription stays ≤ 37 % |
| trial-add:Annual subscription=free~7 | at the break-even | n/a | 1.14 | 51.81 | n/a | n/a | n/a | 6.07 pts | 3.03 pts | false | pays while the share of trial starters taken from Annual subscription stays ≤ 37 % |
| p3 | 0.1 (assumed lift) | 5112.01 | 1.25 | 148.03 | 2978 | 40.24 | 59560 | 0.116 | 0.0666 | false | not at this traffic: within 30 days you can only see a ≥ 11.6% change — test a bigger change, or raise volume |
| bought | 0.1015 (assumed lift; typed +10.00 % → landed +10.15 %, snapped) | 5175.93 | 1.25 | 51.81 | 2281 | 88.05 | 130342.86 | 0.1745 | 0.1004 | false | not at this traffic: within 30 days you can only see a ≥ 17.4% change — test a bigger change, or raise volume |
| mix | 0.1 (assumed lift) | 1474.2 | 1.17 | 51.81 | 9331 | 360.21 | 533200 | 0.363 | 0.204 | false | shifts picks toward Annual subscription, the product whose share move gains the most; not at this traffic: within 30 days you can only see a ≥ 36.3% change — test a bigger change, or raise volume |
| close | 0 | 0 | 1.14 | 20.93 | n/a | n/a | n/a | n/a | n/a | false | at its ceiling: payment completion is already 100.0% and the calculator's own control stops there |
| trialConv | 0 | 0 | 1.14 | 0 | n/a | n/a | n/a | n/a | n/a | false | no product on the paywall has a trial |
| renewals | 0.1014 (assumed lift; typed +10.00 % → landed +10.14 %, snapped) | 2328.26 | 1.19 | 20.93 | n/a | n/a | n/a | n/a | n/a | false | calendar: one billing period per read |
| upsell:Monthly subscription~One-time add-on | at the benchmark | 1164.71 | 1.16 | 13.21 | n/a | n/a | n/a | n/a | n/a | false | clears at every point of upsell acceptance the calculator tried (from 1 %) |
| downsell:Monthly subscription~Annual subscription 30% off | at the benchmark | 7464.56 | 1.3 | 19.49 | n/a | n/a | n/a | n/a | n/a | false | clears at every point of downsell acceptance the calculator tried (from 1 %) |
| downsell:Monthly subscription~Annual subscription 7d trial | at the benchmark | 3999.02 | 1.22 | 19.49 | n/a | n/a | n/a | n/a | n/a | false | clears at every point of downsell acceptance the calculator tried (from 1 %) |
| upsell:Annual subscription~One-time add-on | at the benchmark | 680.56 | 1.15 | 7.72 | n/a | n/a | n/a | n/a | n/a | false | clears at every point of upsell acceptance the calculator tried (from 1 %) |
| downsell:Annual subscription~Annual subscription 30% off | at the benchmark | 4361.65 | 1.23 | 11.39 | n/a | n/a | n/a | n/a | n/a | false | clears at every point of downsell acceptance the calculator tried (from 1 %) |
| downsell:Annual subscription~Annual subscription 7d trial | at the benchmark | 2336.68 | 1.19 | 11.39 | n/a | n/a | n/a | n/a | n/a | false | clears at every point of downsell acceptance the calculator tried (from 1 %) |
- Ranked by gain per day of testing:
p1andp2are learnable inside 30 days in this run'srealisticcolumn. - The population a test can use depends on the lever's place in the funnel — 986.84 funnel starts a day for
p1, 296.05 funnel starts past step 1 a day forp2, 148.03 funnel starts reaching the paywall a day forp3, 51.81 buy-taps a day forbought, 51.81 buy-taps a day formix, 20.93 buy-taps that pick a paid product a day forclose, 0 trial starters a day fortrialConvand 20.93 payers a day forrenewals. - Within 30 days you can only see a ≥ 11.6% change on
p3. - Within 30 days you can only see a ≥ 17.4% change on
bought. - Within 30 days you can only see a ≥ 36.3% change on
mix. close: at ceiling — no lift to test (at its ceiling: payment completion is already 100.0% and the calculator's own control stops there).trialConv: no product on the paywall has a trial.- Price is ranked below as a threshold on each plan's take (the
price:rows); a revenue-per-user price test still needs the variance of revenue per user from your own data. - rank bought: +10.00% was asked; the calculator's own control puts it on its grid and the lifted scenario carries +10.15% — every figure of this row uses the landed lift
- rank renewals: +10.00% was asked; the calculator's own control puts it on its grid and the lifted scenario carries +10.14% — every figure of this row uses the landed lift
p1 is the pick (recommendation.first), p2 the runner-up (recommendation.runnerUp).
None of the 12 structural rows is realistic, so none can out-rank p1 or p2 here — a structural
row only reaches a plan of its own with a stated belief, cases/uc-13-test-an-offer-change.md; this
run prints no sentences.diff.
base: profitPerStart 0.20, roas 1.14; recommendation.links — the two lifted variants,
round-trip checked.
Both recommended links carry the base's label= and measured= — set in the base before the run,
so no label_missing / measured_missing is left to handle. Here recommendation.privacy
says due false for both — the lift is ue rank's default, not the reader's number — but
each carries a lifted rate off the book (p1 33 % in first), so ue check asks for the
sentence; it is always allowed. privacy.sentence — printed whole:
This link carries your numbers in plain text — browser history, referrers and analytics can see it. I can give you the JSON file instead.
recommendation.links.first of npx -y @segmently/cli ue rank seed.json (p1 lifted):
https://www.segmently.ai/unit-economics?v=2&label=seed%20at%20the%20book's%20volume&cps=1.5&p1=33.0&p2=50.0&p3=35.0&vol=45000:budget_month&measured=benchmark%20book%2C%20nothing%20measured&p=Monthly%20subscription~19.99~1month~none~25.50~100.0~2.86~&p=Annual%20subscription~119.99~1year~none~14.90~100.0~1.00~&off=Lite%20monthly~4.99~1month~none~~100.0~2.86~&off=One-time%20add-on~29~once~none~~100.0~1.00~&ref=skill
recommendation.links.runnerUp of the same run (p2 lifted):
https://www.segmently.ai/unit-economics?v=2&label=seed%20at%20the%20book's%20volume&cps=1.5&p1=30.0&p2=55.0&p3=35.0&vol=45000:budget_month&measured=benchmark%20book%2C%20nothing%20measured&p=Monthly%20subscription~19.99~1month~none~25.50~100.0~2.86~&p=Annual%20subscription~119.99~1year~none~14.90~100.0~1.00~&off=Lite%20monthly~4.99~1month~none~~100.0~2.86~&off=One-time%20add-on~29~once~none~~100.0~1.00~&ref=skill
boundary — printed whole (the price sentence is already under the table):
These figures are this scenario's arithmetic on the inputs above.
- cost per start $1.50,
p130 %,p250 % andp335 % — assumed: the book- Monthly subscription: $19.99, monthly, no trial — assumed: the book's seed paywall
- Monthly subscription's take 25.5 % — assumed: the CLI's init split
- Monthly subscription's charges 2.86 — assumed: the book
- Monthly subscription's completion 100 % — assumed: the book
- Annual subscription: $119.99, yearly, no trial — assumed: the book's seed paywall
- Annual subscription's take 14.9 % — assumed: the CLI's init split
- Annual subscription's charges 1 (its cadence cap) — assumed: the book
- Annual subscription's completion 100 % — assumed: the book
- $45,000 a month — assumed: the book's volume
- the book's first renewal behind payback (monthly 60 %, from
words.payback) — assumed: the book- the +10 % on
p1,p2,p3,bought,mixandrenewals— assumed:ue rank's default ("assumed lift"), at each lever's landedliftin the table.- the 12 structural rows of this table — their targets, prices and trials: assumed: the CLI's proposals (price ± the run's lift, a 7-day free trial, a $29 add-on, the annual downsells)
- the default horizons, 30 and 90 days (
ue rank's own) — assumed- the 50/50 split of the test this table plans — assumed: the test design
p1is decidable in 7.63 days andp2in 10.57 days at this budget.- not testable soon, in this 30-day run:
p340.24 days,bought88.05 days andmix360.21 days — past 30 days at this budget, each at its owndays;renewals— a calendar read.