← All projects
Project

A/B Decision Engine

An experimentation engine with an uplift model that tells a team whether to ship, kill or keep testing, and whether to trust the result.

Role
Solo
When
Sep to Oct 2026
Status
Live API and dashboard
Links
Live app, code
The obvious version

A p-value calculator

What I built

A ship / kill / hold verdict that checks trust first

Left out

A dashboard before the maths was proven

What I measured

22.7% → 1% false positives from peeking

01Where it started

Most A/B testing work stops at one question: is the p-value below 0.05? That's the obvious tool to build, and plenty of calculators already do it.

02What changed my mind

That question comes too late. Experiments mislead teams in three ways before significance even matters. A broken redirect skews the traffic split and quietly invalidates the test. Teams check the dashboard every day and stop at the first good-looking result. And an average can hide a change that helps one group while hurting another.

How strong is this? Each failure is well documented in experimentation research, and each one was reproduced here with a simulator whose true effect is known, so every method could be checked against the right answer.

03What I built

An engine that runs four checks and returns one verdict: ship, kill or hold.

It detects a mismatched traffic split and finds which platform the imbalance comes from. It uses sequential testing, which stays valid however often you peek. It uses CUPED, which borrows pre-experiment data to cut noise. And an uplift model shows who the change actually worked for. It all runs behind a FastAPI service with a small dashboard.

04What I left out, and why

  • A single p-value verdictIt's the answer people expect, and the one that misleads them. The verdict only comes after the trust checks pass.
  • A dashboard before the maths was provenThe first eight steps were statistics, each validated against simulated ground truth. The API and dashboard came last, so there was nothing to make look good until it was right.
  • A full Qini curveA simpler ranking check confirms the uplift model orders users sensibly. Publication-grade evaluation would have taken longer than it would have changed any decision.

05What I measured

Main metric measured

22.7% → 1%

false-positive rate when a team peeks at results every day, without and then with sequential testing. The promised rate is 5%.

What moves it
  • CUPED narrowed confidence intervals by 11.6%, matching the theoretical prediction
  • On Criteo's 13.9 million-row dataset, only about 44% of targeted users showed a positive response, so the rest of that ad spend is plausibly wasted
  • An injected iOS-only split bug (58% against an expected 50%) was isolated, while Android and web were correctly cleared
What must not get worse

The error rate stays at or below the 5% it promises.

06Trade-offs I accepted

  • Sequential testing came in conservative, at 1% rather than exactly 5%. That's safer but less sensitive, and a tuning parameter can trade some of it back.
  • CUPED helps much less on yes-or-no outcomes like conversion than on revenue. That's a property of the method, so the tool says so rather than overselling it.

07What I'd do next

Put it in front of a team running real tests and track one thing: how many "ship" decisions it changes to "hold". That's the number that says it saved someone from a bad launch.