Usable with a quick edit14 of 14 checks passed
The spec is complete and actionable; a PM could run it with only the pre-launch data checks already flagged in the document.
Output
Experiment spec: delivery date and fee on the basket page
Hypothesis
Showing the delivery date and fee on the basket page, rather than at the final checkout step, raises the share of basket sessions that end in an order. We expect fewer last-step abandons because the fee is no longer a surprise. The counter-risk is more exits at the basket, so the primary metric must count both.
Randomisation
- Unit: logged-in user ID, not session or device. 31% of buyers use both app and web, and buyers average 3.8 sessions a month. Session-level assignment would show one person both experiences and make observations non-independent.
- Split: 50/50 by salted hash of user ID, the same arm on app and web. Users are assigned on first basket view.
- Independence: use a different salt from the Payments squad's "Pay later" test, so every arm is about 50% Pay-later (see Calendar).
- Checks: run an A/A check in the week before launch. Run a sample-ratio-mismatch (SRM) test throughout, and pause if p < 0.001.
Metrics
Primary: order conversion = basket-page sessions that end in an order ÷ basket-page sessions, with standard errors clustered by user.
Do not use orders ÷ checkout sessions. If the fee scares people off at the basket, they never become checkout sessions, the denominator shrinks, and the treatment looks better than it is.
Secondary: - Basket→checkout-start rate (expected to fall, and we need to see by how much). - Checkout-start→order rate (the squad's mechanism). - Revenue per basket session. - Orders per user over the window. - Platform split (exploratory only).
Guardrails: - Average order value (AOV, baseline $64): fail if the lower CI bound is below −2% (−$1.28). - Revenue per basket session: fail if significantly negative. - Fee-related support contacts per 1,000 orders. - Basket-page error rate and latency. - 14-day repeat rate among exposed users. The 30-day repeat rate (38%) can't be read in a 3-week test.
Baseline from the traffic file
| Sessions | Orders | Conversion | |
|---|---|---|---|
| Week of 10 Aug | 258,437 | 16,336 | 6.32% |
| Week of 28 Sep | 262,044 | 16,676 | 6.36% |
- Weekly sessions are about 260k and daily volumes are stable, so I use p = 6.35%.
- Platform split: app 57–58% of sessions at about 7.1% conversion; web 42% at about 5.3%.
- Weekends run at about 65% of weekday volume, so the test must cover whole weeks.
Sample size
- MDE: +3% relative, which is +0.19pp (6.35% → 6.54%). That is roughly 490 orders a week, or about $31k a week at $64 AOV, which is worth shipping for.
- Settings: two-sided α = 0.05, power 80%, so (1.96 + 0.84)² = 7.84.
- Per arm, ignoring clustering: n = 2 × 7.84 × p(1−p) / δ²
- p(1−p) = 0.0635 × 0.9365 = 0.0595
- δ = 0.00191, so δ² = 3.63×10⁻⁶
- n = 0.932 / 3.63×10⁻⁶ ≈ 257k sessions
- Clustering: users contribute about 2.7 sessions in 3 weeks. I assume an intra-user correlation of 0.2, giving a design effect of 1 + 1.7 × 0.2 ≈ 1.3. That puts the requirement at 257k × 1.3 ≈ 334k sessions per arm.
- Duration: each arm gets about 130k sessions a week (260k ÷ 2), so 334k ÷ 130k = 2.6 weeks. Run 3 full weeks (21 days), which gives about 390k per arm.
- For comparison: a 2% MDE needs 578k × 1.3 = 751k per arm, or 5.8 weeks, which the calendar can't fit. A 5% MDE needs 92k × 1.3 = 120k per arm, under 1 week.
- Subgroups: web alone (42% of traffic) can only detect about 4.6% relative (3% × √(1/0.42)). Platform cuts are exploratory.
Data issues to resolve before launch
- Buyer count doesn't match the traffic file. The data team's 412k buyers in 30 days is inconsistent with about 70k orders a month in the file (16.4k a week × 30/7). Their 3.8 sessions per buyer implies about 1.57M sessions, against about 1.11M in the file. I sized from the traffic file. The data team needs to reconcile the two, since the user-level assumptions (the design effect) depend on it.
- Check the definition of `checkout_sessions`. I assumed it equals basket-page sessions. If it only counts sessions that reached checkout, the true basket-level baseline is lower and the test is longer. For example, at 4% conversion, n scales by (0.96/0.04) ÷ (0.9365/0.0635) ≈ 1.6×, which is about 4.5 weeks.
- Re-run the sums on the real basket-session baseline before launch, and fix the duration then (3 or 4 weeks).
Calendar
- Black Friday: promotions start 20 Nov and code freeze starts 16 Nov. Promo traffic isn't representative, and anything not shipped by 15 Nov waits until after the freeze.
- Waiting for Pay later to end (9 Nov) doesn't work. That leaves 10–15 Nov, which is 6 days and not enough.
- Pay later (until 9 Nov) sits on the checkout page and affects the same outcome, so it can't be ignored. I'll run the test concurrently with an independent split. Each arm then gets about the same Pay-later mix, so the contrast stays unbiased. I'll pre-register a treatment × Pay-later interaction check, and report the effect by Pay-later arm. The Payments squad must freeze their allocation for the duration.
- Search ranking (until 30 Oct) only touches search results pages. It's balanced by randomisation and needs no action, but I'll note it.
- Schedule:
- Build, QA and A/A: 5–11 Oct.
- Run 12 Oct – 1 Nov (3 weeks).
- Readout 2–4 Nov, decision before 9 Nov.
- Ship ramp before the 16 Nov freeze.
- Buffer: a 4-week run (to 8 Nov) still ends before Pay later does.
Decision rule
This is fixed in advance, with one analysis at the end of the run and no peeking.
- Ship if the primary lift is positive with the 95% CI excluding 0, and no guardrail fails, and revenue per basket session isn't significantly negative.
- Do not ship if the CI includes 0. We'd conclude "no detectable effect at +3%". Any wish to ship for fee-transparency reasons is a separate product decision, not an experiment win.
- Kill if the primary is significantly negative, or if AOV or revenue per basket session breaches its guardrail. Basket exits are the main thing we expect to see here.
- Extend: only if an outage or traffic shortfall leaves fewer than 334k sessions per arm, up to 28 days. Never extend because the result is "almost significant".
- Interaction: if the effect differs materially by Pay-later arm, ship only to the configuration that will be live after 9 Nov, and confirm with the Payments squad which one that is.
Grades and run details
Decision model 93 · LLM judge 100
Decision model checks
- passUses the supplied evidence correctly20%
- passAddresses the actual decision69%
- partialRespects explicit constraints21%
- passIdentifies material uncertainty98%
- passAvoids unsupported claims50%
- passProduces the required deliverable60%
- passRandomises by user100%
- passWorks around the calendar100%
- passDoesn't let the metric flatter the change99%
- passAn unambiguous primary metric87%
- passDecision rule written before the test99%
- passSized from the real traffic63%
- partialGuardrails with thresholds83%
- passSays why a test is worth it here98%
Run
- Run
- #1
- API response time
- 64 s
- Submitted
- 6 Oct 2026