Needs more than a quick edit13 of 14 checks passed
The data discrepancy between the CSV and the data team's numbers is unresolved and blocks launch; a PM would need to investigate and reconcile the traffic figures before proceeding.
Output
Experiment spec: delivery date and fee on the basket page
Owner: Checkout PM · Status: Draft. Blocked on one data question (see 0).
0. Data question to resolve before launch
The two sources disagree badly:
- CSV: about 16,525 orders a week, or about 70,800 per 30 days.
- Data team: 412,000 people ordered at least once in 30 days, so at least 412,000 orders.
- Sessions: 412,000 × 3.8 = about 1.57M checkout sessions a month. The CSV shows about 1.12M.
The CSV may cover one region or a subset, or the definitions may differ. I've sized the test on the CSV because it is the conservative figure. If real traffic is about 6× higher, the test still runs the full 4 weeks to cover the weekly cycle. It would simply detect a smaller effect.
1. Hypothesis
Showing the delivery date and fee on the basket page removes the "surprise fee" at the final step. That reduces last-step abandonment and increases orders per shopper.
The counter-risk is that some shoppers leave at the basket instead. The test measures the net effect of both.
2. What's randomised and how
- Unit: account ID, 50/50. It is not the session. Buyers average 3.8 checkout sessions a month, and 31% use both app and web. Session-level randomisation would show the same person both versions and contaminate the result.
- Assignment point: first basket-page view in the test window, with the assignment held for the whole test.
- Logged-out web baskets: use the device cookie, then map to the account at login. Accounts that end up in both arms are excluded, and the rate is reported.
- Platforms: both, with app and web as pre-registered segments.
- Run first: a 2-day A/A check for sample-ratio mismatch.
Why the metric can't be "orders ÷ checkout sessions": the treatment changes who starts checkout. People who leave at the basket drop out of the denominator, which would inflate the treatment's rate. The denominator must be fixed at the point of assignment.
3. Metrics
Primary: orders per assigned account during the test window.
Secondary (diagnostic): - Basket → checkout start rate. Expected to fall; this is the risk the squad named. - Final-step abandonment rate. Expected to fall. - Basket → order conversion, split by app and web. - Share of baskets topped up to reach a free-delivery threshold, if one exists.
Guardrails (any breach blocks shipping): - Average order value (baseline $64): no drop of more than 2%. - Delivery-fee revenue per order: no significant drop. Must be explained if it moves. - Basket-page load time (p75): no increase of more than 100 ms. Basket-page error rate: no increase. - Customer contacts about fees or delivery date: no significant increase. - Sample-ratio mismatch: p > 0.001.
Note: the 30-day repeat rate (38%) can't be read inside the window. It becomes a follow-up read 30 days after the test ends.
4. Sample size and duration
Baseline from 8 weeks of CSV data (10 Aug – 4 Oct):
| Sessions | Orders | Conversion | |
|---|---|---|---|
| App | 1,206,537 | 85,526 | 7.09% |
| Web | 876,853 | 46,670 | 5.32% |
| Total | 2,083,390 | 132,196 | 6.345% |
- Weekly volume is very stable: about 260,424 sessions and 16,525 orders a week.
- Weekdays run about 40% above weekends, so the test must run whole weeks.
Minimum detectable effect: a 3% relative lift, from 6.345% to 6.535% (+0.190 pp). At current volume that is about 496 orders a week, or about $31.7k a week at $64 average order value.
Calculation (α = 0.05 two-sided, 80% power):
- n per arm = (1.96 + 0.84)² × [p₁(1−p₁) + p₂(1−p₂)] / d²
- = 7.84 × (0.05942 + 0.06108) / 0.0019035²
- = 0.9447 / 3.623×10⁻⁶
- ≈ 260,750 sessions per arm, or 521,500 in total
Adjusting for repeat users: randomising by account means sessions from the same user are correlated. I've applied a design effect of 1.5 because the true clustering factor is unknown:
- 521,500 × 1.5 = 782,000 sessions
- ÷ 260,424 a week = 3.0 weeks
Planned duration: 4 full weeks. The extra week covers uncertainty in the clustering factor. It also leaves enough power for a directional read on app and web separately (each about 0.5–0.6 of total traffic).
The analysis will use account-level orders with variance computed directly from the data, so the 1.5 design effect is not baked into the result.
5. When it can run
| Calendar item | Conflict? | Handling |
|---|---|---|
| Search ranking (search results pages, until 30 Oct) | No. Different page. | Randomised independently. Logged for reference. |
| Pay later (checkout page, 50% of users, until 9 Nov) | Yes. Same funnel, same outcome. | Run alongside it with independent randomisation. Treat Pay later as a stratum and check for an interaction (pre-registered). |
| Code freeze 16 Nov, Black Friday 20 Nov | Yes | Must finish before 16 Nov. Promo traffic is atypical. |
Waiting until Pay later ends (10 Nov) leaves only 6 days before the freeze, which is too short. So we run alongside it.
Dates: - Build and A/A check: 5–11 Oct. - Test: Mon 12 Oct – Sun 8 Nov. That is exactly 4 weeks. It ends the day before Pay later finishes, so Pay later's 50/50 split is constant for our whole test. - Analysis and ship decision: 9–13 Nov, before the freeze.
6. Decision rule (pre-registered)
1. Ship if the primary lift is positive and significant (p < 0.05), no guardrail is breached, and sample-ratio mismatch passes. 2. Don't ship if: - the primary is significantly negative, or - any guardrail is breached.
Either way, investigate whether the basket-stage drop outweighed the last-step gain. 3. Flat result (confidence interval within ±3%, no guardrail breach): ship only if final-step abandonment fell significantly, on the grounds of transparency. Otherwise keep control. 4. Pay later interaction: if the effect differs significantly between Pay later arms, report the effect within each arm. The ship decision then follows Pay later's own launch decision. 5. No early stopping on the primary metric. A guardrail breach above a pre-set threshold may stop the test early.
Grades and run details
Decision model 93 · LLM judge 87
Decision model checks
- passUses the supplied evidence correctly5%
- passAddresses the actual decision42%
- partialRespects explicit constraints16%
- passIdentifies material uncertainty89%
- passAvoids unsupported claims46%
- partialProduces the required deliverable26%
- passRandomises by user100%
- passWorks around the calendar99%
- passDoesn't let the metric flatter the change94%
- passAn unambiguous primary metric82%
- passDecision rule written before the test98%
- passSized from the real traffic54%
- passGuardrails with thresholds56%
- passSays why a test is worth it here75%
Run
- Run
- #1
- Time to output
- 77 s
- Submitted
- 5 Oct 2026