Sports analytics platform
Scout
A football analytics tool that pulls fixtures, results and standings from two external providers, runs them through an expected goals model, and surfaces one considered call per match with the full reasoning attached. It is built to help someone judge a decision for themselves, not to hand them a tip and hope.
- 66 API endpoints
- 55,000 lines of backend
- Two data providers
What went into it
- An expected goals model with separate home and away scoring profiles, opponent quality and strength of schedule adjustment, and season aware form decay
- Model goals cross checked against real shot based xG in a blend, a built in reality check that discounts lucky finishing
- Cross competition team strength estimated with an iterative goal difference solver over cup and European fixtures, anchored to the Premier League
- Match and market probabilities from a Poisson goals model, then converted to win, draw and over line prices
- A backtesting harness that replays the exact production model against completed seasons, tracking accuracy separately by confidence tier
- An installable progressive web app with a service worker, so it keeps working on a bad connection
The hard part
Every number a visitor sees is the end of a long chain, and the model refuses to hide it. The xG breakdown opens the whole calculation: the team strength ratings, the raw prediction, each adjustment for ranking and stakes, and the final figure. Making that legible without dumbing it down, while the data behind it arrives late, inconsistently and occasionally wrong, was most of the work.

The full model, opened up: team strength ratings, the raw prediction, every adjustment, and the final expected goals figure. Nothing hidden.

Every call carries the model probability, expected goals, head to head record and a written argument for and against.

Outcomes are resolved automatically and accuracy is tracked separately for each confidence tier.

Form tables split home and away performance across rolling windows of five, ten and fifteen matches.



