Ol' Sporty — confidence-scored sports betting picks with explainable factors



Constraint
The box they were trapped in
Sports bettors are buried in stats, takes, and gut feelings. The serious ones either build their own spreadsheets of factors per game or trust whichever talking head they like. The client wanted a web product that did the spreadsheet automatically per game, scored each pick, and — critically — showed the user which factors moved the score. Not a black-box "trust us" predictor; a transparent system the user can defend after a bad Sunday.
Approach
How we attacked it
Next.js web app over a weighted scoring engine that pulls live game data from real-time sports APIs and supplements it with LLM-driven scraping where the structured APIs don't reach (some injury reports, public-sentiment threads, line-movement boards). The engine combines 15+ factors per pick — team performance, injury reports, Vegas odds, home/away trends, public sentiment — into a confidence percentage. GPT writes the explanation alongside the number, but doesn't decide it. Firebase Cloud Functions for the backend, Stripe + Firebase Auth for the freemium-to-$47-a-month upgrade path, Vercel for the front end.
Decisions
What we picked, and what we rejected
Transparent rules engine, LLM narrates the result
A black-box ML predictor can produce a confidence number that fits past games well and tells the user nothing. Bettors need to know which factor moved the score and which didn't — that's the trust. So the score is a weighted sum of named, inspectable factors, and the LLM's job is to write the paragraph explaining it, not to decide it.
Live sports APIs first, LLM-augmented scraping where the API doesn't reach
Structured APIs cover team stats, schedules, and core odds well. They don't cover everything — injury notes from beat reporters, line-movement chatter, sentiment threads. The LLM-scraping path fills those gaps as a labelled secondary source so the rules engine can still use them, with the source flagged in the explanation.
Freemium with a $47/month gated premium tier
A pure paywall in front of an unproven recommendation product is a hard sell. Freemium picks let the user watch the system work for a few weeks before committing; the premium tier earns the subscription by holding back the higher-confidence picks. Stripe + Firebase Auth handle the upgrade flow without bespoke billing code.
Vercel + Firebase Cloud Functions for the 5-week timeline
A 5-week MVP can't afford a custom backend platform and a pipeline to provision it. Next.js on Vercel and the data + auth + functions on Firebase let the team ship a real, paying product in the time most teams spend writing infrastructure tickets — and the same setup scales when subscriptions grow.
Trade-off
What we didn't build
We rejected a black-box ML predictor in favour of a transparent rules engine. An ML model that fits historical games well can spit out a 72% confidence number without explaining itself; bettors don't trust that number, and we couldn't either. So the score is a weighted sum of named factors the user can inspect, the LLM only narrates the result, and calibration is something the team tunes by hand against the factor weights. The trade-off is slower iteration than letting a model auto-fit; the gain is a pick the user can defend.
Outcome
What changed after we shipped
MVP shipped in five weeks. Live web app delivers confidence-scored picks with the factor breakdown visible inline on every card. A freemium tier shows the system at work; the premium picks sit behind a gated $47/month plan with Stripe checkout, Firebase auth, and clean onboarding for paying users.
Talk to us
Have a similar project in mind?
Tell us what you're working on. We'll let you know whether it's a fit.