Needs more than a quick edit13 of 14 checks passed
The primary metric requires basket session data that is currently missing, and the spec relies on obtaining that data or falling back to a different metric; a PM would need to resolve this before running the experiment.
Output
Experiment spec: delivery date and fee on the basket page
Owner: Checkout PM · Squad: Checkout · Status: Draft for review
1. Hypothesis
Showing the delivery date and delivery fee on the basket page, before checkout, instead of only on the final checkout step, will increase orders per basket session (checkout completion) by at least +0.19 percentage points (about +3% relative, from 6.35% to 6.54%).
Mechanism: shoppers who learn the fee at the final step are surprised by it and leave. Seeing it early removes that surprise.
Counter-risk: some shoppers who would have paid the fee will leave at the basket page instead. The guardrails below test for this.
2. Population, unit and randomisation
- Population: all signed-in users who reach the basket page on app or web.
- Unit of randomisation: user, not session. Users average 3.8 checkout sessions a month, and 31% shop on both app and web. Session-level randomisation would show the same person both versions.
- Method: hash of the cross-platform user ID, salted per experiment, assigned 50% control / 50% treatment. The same assignment applies on app and web.
- Stratification: check balance by platform. App converts at 7.09% and web at 5.32% (see §4), and app is 57.9% of sessions.
- Dependency: this needs a cross-platform user ID. If we only have device or cookie IDs, cross-device contamination must be estimated before launch.
3. Metrics
Primary - Orders per basket session = orders ÷ basket sessions. Baseline 6.35%. This captures both early exits (at basket) and late exits (at checkout). Denominator needs confirming with the data team (see §8).
Secondary - Checkout-start rate from basket. - Average order value (baseline $64). - Orders per user over 14 days. - All of the above split by platform and by Pay later exposure (see §5).
Guardrails - Basket exit rate (leaving the basket without starting checkout). Must not rise by more than 0.5 percentage points absolute. This is the main test of the early-leave risk. - AOV must not fall by more than 2% ($1.28). - Delivery-fee contacts (support tickets mentioning fee) per 1,000 orders must not rise by more than 10%. - Order cancellations within 24 hours must not rise.
4. Sample size and duration
Baseline (from `checkouttrafficlast8weeks.csv`, 10 Aug to 4 Oct, 56 days): - Checkout sessions: 2,083,390 (about 260,000 a week, 37,000 a day) - Orders: 132,196 - Conversion: 132,196 ÷ 2,083,390 = 6.35% - Weekly range: 6.31% to 6.39% - App: 85,526 ÷ 1,206,537 = 7.09% (1,206,537 sessions) - Web: 46,670 ÷ 876,853 = 5.32% (876,853 sessions)
Power calculation (two-sided α = 0.05, power 80%, p₁ = 0.0635, p₂ = 0.0655): - Variance sum: 0.0635 × 0.9365 + 0.0655 × 0.9345 = 0.05946 + 0.06121 = 0.12067 - (z₀.₉₇₅ + z₀.₈₀)² = (1.96 + 0.8416)² = 7.849 - n per arm = 7.849 × 0.12067 ÷ (0.0020)² = 0.9472 ÷ 0.000004 = 236,800 sessions - Design effect for repeat sessions per user, assumed 1.2: 236,800 × 1.2 = 284,000 per arm, 568,000 total
Duration: - Traffic per arm: 260,000 ÷ 2 = 130,000 a week. - 284,000 ÷ 130,000 = 2.2 weeks. Two weeks is too short: it does not cover the full weekday cycle and gives no margin. - Run 3 full weeks (21 days). That gives 390,000 sessions per arm, which exceeds the 284,000 needed. Each weekday appears three times.
Sensitivity: detecting +0.10 pp needs 0.9472 ÷ 0.000001 × 1.2 ≈ 1.14M per arm, about 9 weeks. Not feasible, so +0.19 pp is the smallest effect this test can detect.
5. Calendar and overlaps
| Event | Dates | Conflict |
|---|---|---|
| Search ranking test | to 30 Oct | None on checkout. Changes search traffic mix only. |
| Pay later (checkout page, 50% of users) | to 9 Nov | Yes. Same page, same funnel. |
| Code freeze | from 16 Nov | Our build must be live and tested before this. |
| Black Friday | from 20 Nov | Must not overlap. |
Proposed window: launch Mon 12 Oct, run 21 days, end Sun 1 Nov. Readout by 5 Nov, decision before the 16 Nov freeze.
- Must start by 26 Oct to finish before 16 Nov, so there is no slack for later starts.
- Pay later overlap: our test runs alongside Pay later until 9 Nov. Randomise independently (separate salt) so the two effects cross, and analyse the interaction. A 2×2 readout is enough. If Pay later changes how people respond to fees, the interaction term will show it.
- Search overlap: the search test runs until 30 Oct and changes which products people add to baskets. Monitor basket-value mix in both arms. Not a blocker.
6. Analysis
- Pre-registered, one readout at day 21. No interim peeking.
- Two-sided test for the primary metric; report 95% CI.
- SRM check: expected 50/50 split. Flag if the split is off by more than 0.5% and do not read results until resolved.
- Cluster-robust SEs by user.
- Pre-specified subgroups: platform, Pay later exposure. Report only; no decisions on them.
7. Decision rule
| Outcome | Action |
|---|---|
| Primary CI lower bound > 0, point estimate ≥ +0.19 pp, and no guardrail breached | Ship to 100% before 16 Nov freeze |
| Primary CI lower bound > 0 but point estimate < +0.19 pp, no guardrail breached | Ship if the team agrees the effect is worth the cost; otherwise keep control |
| Primary CI includes 0, no guardrail breached | Do not ship. Keep control. Revisit after Black Friday |
| Any guardrail breached (basket exit, AOV, fee contacts, cancellations) | Do not ship. Keep control and investigate |
| Primary CI upper bound < 0 | Kill. Revert and record the learning |
8. Open questions and data gaps
- Basket session counts are missing. The CSV only has checkout sessions. Without basket sessions the primary metric and basket exit rate cannot be measured. Data team to supply by 8 Oct or we fall back to checkout-based conversion, which misses early exits.
- Audience numbers do not reconcile. The data team says 412,000 people placed an order in the last 30 days, but the CSV shows about 71,000 orders a month (132,196 ÷ 56 × 30 ≈ 70,800). At 3.8 sessions a month, 412,000 buyers would imply about 1.57M checkout sessions a month, against about 1.13M in the CSV (260,000 × 4.33). One of these definitions is wrong. I used the CSV, which is daily and specific to checkout, for all sample sizes.
- Cross-platform user ID. Needed for user-level randomisation (§2).
- Confirm launch date and build owner. Build must be ready by 9 Oct for a 12 Oct launch.
Grades and run details
Decision model 82 · LLM judge 93
Decision model checks
- failUses the supplied evidence correctly20%
- passAddresses the actual decision45%
- partialRespects explicit constraints20%
- passIdentifies material uncertainty92%
- passAvoids unsupported claims41%
- partialProduces the required deliverable53%
- passRandomises by user100%
- passWorks around the calendar100%
- passDoesn't let the metric flatter the change66%
- passAn unambiguous primary metric70%
- passDecision rule written before the test100%
- partialSized from the real traffic38%
- passGuardrails with thresholds69%
- passSays why a test is worth it here83%
Run
- Run
- #1
- API response time
- 50 s
- Submitted
- 8 Oct 2026