How the +EV detector scores an alert.
The exact math, applied in the same order the detector applies it.
Vig-removed consensus across the seven tracked books
Before any alert can fire, the detector needs a "fair" price for the market the promo is attached to. For every active market, services/odds-scorer.js queries the Polsia agent with web search across all seven book feeds, takes the consensus line, and converts whatever shape the venues use — US (+150, −200), fractional (5/2), or decimal (3.50) — into a single canonical decimal fair odds per market.
That canonical number is the vig-removed synthetic price: one per market, not one per book. The conversion itself is the same math your book uses to print a line on the screen, only inverted:
The detector watches these seven venues, which together cover the US regulated market:
Is the boost actually paying you more than fair?
Once the detector has both a boosted price (from the sportsbook) and a fair price (from the consensus), it computes the edge. The two formulations are algebraically identical — pick whichever reads more naturally:
Equivalent to the canonical form OddsWatch writes into ev_percent on each scored promo:
Anything strictly above 0% is +EV. Negative means the sportsbook is paying less than the real probability warrants — pass. The detector also flips an explicit boolean (is_positive_ev) and, on the way out, gates the row on ev_score × 100 ≥ thresholdPct, defaulting to 3.0%.
Quarter-Kelly, capped at the book's stake ceiling
A book's boost may be +EV, but staking your whole bankroll on a single line is how +EV bettors go broke. The detector sizes stakes from a quarter-Kelly fraction:
Quarter-Kelly is the standard conservative choice: it captures most of the expected growth from a +EV bet while limiting drawdowns during inevitable losing streaks. Plug in the worked example in the section below and it returns the same dollar figure the +EV Alert card shows.
OddsWatch surfaces each sportsbook's own stake cap as max_stake_usd on the promos row, and the +EV Alert card echoes it as the recommended stake for subscribers who haven't configured a custom bankroll — so the suggested stake never exceeds what the sportsbook itself will actually accept.
Which alerts actually fire
The four formulas above produce an EV score for every scraped promo. The filter chain in front of the alert decides which of those become real notifications. An alert only fires when every condition is met:
- Promo is currently live in the scrape:
is_active = TRUE,boosted_odds IS NOT NULL, andfair_odds > 0. - Edge clears the 3% floor (configurable per environment):
ev_score × 100 ≥ thresholdPct. - Confidence score is high enough to act on. Confidence starts at a 0.5 base and earns bonuses for a fresh market quote (≤ 30 minutes old), corroboration across two other books on the same line, and a successfully resolved fair price.
- For free bets and no-sweat bets (where you don't get the stake back), EV is computed at a 70% conversion rate — the same constant the Free Bet Converter uses.
- The promo came from one of the seven tracked book adapters that ship a
scrapePromos-compatible export — anything outside that list never reaches the scorer in the first place.
Reconciling to a /samples card
The first card on /samples ships these numbers as the morning briefing: boosted_odds = 4.20, fair_odds = 3.70, max_stake_usd = 50, confidence_score = 0.88. Running the same detector pipeline against them, in plain decimal math:
This is the same boosted / fair / edge / stake a subscriber sees on the morning-briefing card titled DraftKings · Bills -3.5 @ Patriots, viewable at /samples#draftkings-bills-patriots. The and $50 max stake from the book seats as the recommended stake for users who haven't set a custom bankroll.
boosted_odds = 4.2 · fair_odds = 3.7 · max_stake_usd = $50 · confidence_score = 0.88
For educational and informational purposes only. Not a sportsbook. Not a betting service. Always bet responsibly. 21+ in eligible states.