Overview
Parlay Maker builds sports betting parlays from live odds, calibrated stat models, and an AI picker. Pick a sport and date, choose a risk level (which confidence bands legs may come from, and the measured method used to rank them), select games, and generate. All math — calibrated probabilities, p_loss, edge, implied odds — is computed by the pipeline before the model sees anything; the model only picks from a pre-validated menu, and a deterministic validator checks the slip again after it answers.
Configuration Panel
- Sport — NBA or MLB. Controls the available parlay types and data sources.
- Parlay Type — A stat selector with two jobs. For parlay runs it is the single-stat fallback used only when both Auto-pick boxes are off. Picking a Rankings entry (Points/Threes, DD/TD, HR Power) reroutes the Generate button to a ranked-list output instead of a parlay.
- Instructions — The App picks the best-measured creation method per risk level automatically. Download Instructions downloads a model-routed run's instructions as a .txt instead of generating; it greys out when the risk level is composed deterministically.
- Ability line (under Generate) — What the active risk level is, and its measured card win rate on the App's graded benchmark. These historical results are not a prediction of future wins.
- Date — The slate date. Defaults to today; see Dates & Calendar.
$ Kelly — Stake Sizing Calculator
The $ Kelly button opens a bankroll-sizing calculator. The Kelly Criterion tells you what fraction of your bankroll to stake on a given edge so you grow your money as fast as possible without going broke.
Why it matters: A "good bet" isn't defined by how likely it is to win — it's defined by whether the odds are mispriced. Kelly translates that mispricing (your edge) into a dollar amount.
- Bankroll ($) — Total money you have set aside for betting. Kelly sizes each bet as a slice of this, not of your net worth.
- Odds (decimal) — The sportsbook's price for the leg (e.g.
1.91, 2.50). Decimal odds are always > 1.0; values closer to 1 = favorite, values further above 2 = underdog. The calculator converts this to an implied probability — what the book thinks the leg's hit rate is — via P = 1 / decimal.
- Assessed win % — Your estimate of the leg's true hit rate, informed by the player's recent games, matchup, and any strategy analysis you've already done. This is the number the book may have priced wrong.
- Fraction — A multiplier on full Kelly. Full Kelly maximizes long-run growth but is brutal on variance — a handful of bad beats can halve your bankroll. Quarter Kelly (0.25) is the conservative default; lower it when your data is thin. You can override it manually any time.
Output — what the result line means:
- edge X% — your assessed win % minus the book's implied probability. Positive = +EV (the bet is worth making). Negative = the book is charging more than the bet is worth; the result line turns red. Most reputable sources won't bet a prop with less than +3% edge because the estimate error alone is usually that big.
- full Kelly X% — the maximum-growth stake, as a % of bankroll. Shown so you can see what you're fractioning off of.
- sized X% — full Kelly × your chosen fraction. This is the % of bankroll the calculator actually recommends.
- stake $X — sized % × bankroll. The dollar amount to risk on this specific leg.
Example: Bankroll $500, odds 1.91 (implied 52.4%), assessed 60%, fraction 0.20. Edge = +7.6%, full Kelly ≈ 16%, sized ≈ 3.2%, stake ≈ $16. If edge is negative the calculator floors stake at $0 — Kelly never tells you to bet into a losing proposition.
Parlays: for multi-leg parlays, use the combined parlay odds and the product of each leg's assessed probability as your assessed win %. Kelly on parlays is inherently volatile — stay on the conservative side of the fraction.
Odds Converter
The three live-linked inputs above the Generate button convert any sportsbook number to the other two formats on the fly. Type into one and the other two auto-fill:
- American — the signed integer with magnitude ≥ 100 (e.g.,
-110, +150). Negative = favorite, positive = underdog.
- Decimal — the bookmaker multiplier ≥ 1.01 (e.g.,
1.91, 2.50). The format the App's data and prompts use end-to-end.
- Implied % — what the book thinks the leg's hit rate is (
P% = 100 / decimal). Use this to compare against your own assessed win % — if assessed beats implied by 3+ percentage points, the leg is +EV.
Clear any field to reset the trio. Invalid inputs (American with |val| < 100, decimal ≤ 1.0, percent outside 0–100) clear the other two until the input is valid.
Data Updates
Odds, stats, and scores refresh through two paths:
- Update menu button — Immediate refresh for the selected sport and date. Use it for the freshest odds before generating.
- Automatic refresh (production) — The hosted server runs a background pass roughly every 2 minutes; how often each game is actually re-fetched scales with proximity to its start (live games freshest). Local runs skip the background thread — the Update button is the only refresh path there.
- Sportsbooks on the board — the feed posts every book it carries; which of them your legs may come from is your choice (see Bookmakers under Legs & Settings). With no choice made, every book on the board is eligible and a leg's price is read in preference order — DraftKings, then BetMGM, then FanDuel. A market carried by only one of your books is not refused for that reason alone: it is admitted when its price clears the board-quality bounds, and refused when it does not.
Player & Game Selection
The panel lists the slate sorted by start time. Games with no posted roster sink to a No Props section and are unselectable. Click a game header to select the whole game (this also flags both teams as fully selected, unlocking team-level bets); click individual player rows to hand-pick. Clear resets, Collapse All / Expand All toggles the blocks.
- Status tags — No tag / start time = not started. Green tag with score = live (Q1–Q4, IN1–IN9, or Live). Yellow = late-game cue (Q3+/OT for NBA, IN5+ for MLB). Grey = Final or another terminal state. Canceled / postponed / suspended / forfeited games are greyed and unselectable — the books void them.
- Manual clicks stay permissive — you can still hand-select a live or ended game (useful for past-slate review); the tinting is informational. Generating with ended games included prompts a confirmation dialog first.
- Auto-select never does — the quick-pick game buttons only ever pick from games that have not started yet.
Quick Actions
Shortcut buttons above the Games & Players list. All three game buttons draw only from not-yet-started, bookable games — live, ended, canceled, and no-props games are never auto-selected. Each click replaces the current selection.
- Rnd Games S — 2–4 random games. Focused slips.
- Rnd Games L — roughly half or more of the eligible games, never all of them.
- All Games — every eligible (not-yet-started) game.
- Reselect — restores the exact game + player selections from your most recent generation. Enabled once you've generated something.
Parlays
The Risk Level selector is the only creation control — each level has one measured method (strategies were removed in 7.0.0 because they were producing the same card). The parlay is built from your selected games, or from the whole day's slate when none are selected; the resulting scope shows in the parlay's name (Day, N Games, or AWY@HOM).
- Value — Targets market mispricings, not safe favorites. Drops any leg with edge below +5% (stricter than the +3% rule of thumb) and any leg with decimal odds below 1.50; largest edges first.
- Statistical — Every leg must cite a numeric quantitative anchor (FIP / K-BB% / wRC+ for MLB; pace / usage / DRtg for NBA). Picks defended only by "form" or "consistency" are dropped.
Each risk level is created by the method that proved best for it on graded slates — the App's deterministic composer or an AI model — selected automatically by the routing table. Today every risk level composes deterministically.
Generate Jackpot combines 3 sub-parlays (tunable 2–4) into one ticket. It can use several games or distinct markets from a single game. Each sub-parlay uses the same per-risk method as an ordinary parlay, with its own four-leg ceiling. Jackpots require every joined leg to win and are expected to hit less often; their historical hit rates are measured separately.
Risk Level
The Risk Level selector determines which server-published Lo/Med/Hi tiers a parlay may use. Each leg keeps the server's probability and tier at its exact offered line. Both selected books must offer the same participant, stat, direction and line. Recovery cannot widen the risk's tiers or your book selection.
- Aggressive — Longer odds, higher risk.
- Balanced — Balances wins and payout.
- Safe — Favors higher-confidence picks.
- All Bands — Picks across confidence levels.
Payouts multiply the offered odds of all joined legs. Your leg setting is a maximum: the app adds eligible legs while the whole card passes its risk checks. Jackpot sub-parlays retain their separate four-leg ceiling.
Home-run legs (OVER 0.5 HR) are a separate partition, never a ladder rung: allowed only in Aggressive and Mix, at most one per slip, and in Mix only when positively correlated with another selected leg.
Legs & Settings
- Parlay Legs slider — Sets the leg budget for parlay generations (2–20). The recommended count (4) anchors the slider's color — the readout turns orange when you push above it. Jackpot sub-slips ignore the slider and use the recommended count.
- Auto-pick Players / Teams — Let the worker pick across player and/or team stat types. With both off, generation runs single-stat using the Parlay Type dropdown as the filter.
- Leg Tolerance — How far a leg's loss-model
p_loss may exceed its implied loss (1 − stated confidence) before the leg is blocked, for every risk level in the run. Default keeps the strict setting (≈98% realized-win legs, scarce); 0.15 admits ≈86%-win legs at ≈2× supply; 0.20 admits ≈83% at ≈2.5× supply.
- Bookmakers — Which sportsbooks your legs may come from. This is an account preference, not a per-date one: it persists across dates and sports until you change it. Legs are filtered to your books where the board is parsed, so the candidate pool, the prices and the finished card all agree, and nothing downstream can re-admit a book you excluded. Narrowing books narrows supply — when it leaves too few legs the run abstains and names the cause rather than quietly widening back out. The control is hidden when the board carries only one book, since a choice with one option is not a choice.
- Jackpot subs — Number of sub-slips composed into the jackpot (2–4, default 3).
- All of these (plus sport, type, risk) persist locally and sync to your session's cloud preferences.
Generating
- Generate — Builds a parlay over your selection with the current risk level and leg budget. The status log streams progress; the finished slip renders in the output panel and is saved to your session.
- Combination abilities — The line under Generate reports the share of graded parlay cards that won in the active risk level's benchmark. Aggressive requires a combined quoted payout of at least 2.5x within your settings; voided legs can reduce the settled payout.
- Generate Jackpot — Composes the sub-slips, each built by the same per-risk method as a normal parlay.
- Rankings — When a Rankings parlay type is selected, the button generates a ranked list (no stake, no win/loss grading) instead of a slip.
- Download Instructions — With the checkbox on, every Generate button downloads the fully rendered instructions as .txt instead of generating. Only available when the active risk level routes to a model; deterministic risk levels grey it out.
- No Qualifying Card — When a risk level has nothing it can honestly bet, the run abstains and saves a card that says so. It is never padded to a leg count. The card names the cause and quotes the counts behind it — events scanned, bettable candidates, any relaxation steps that were applied and still came up empty. If your Bookmakers choice is the binding constraint, it says bookmaker filter leaves too few legs — widen books or change risk and reports what the same slate offers across all books; if widening would not help, it says that instead, so you are never sent to change a setting that cannot fix it.
- Ended-game warning — If the run would include already-ended games, a confirmation dialog appears before anything is generated.
Parlays & Statuses
Saved parlays appear as chips under Previous Parlays. Chip names are compact — Type · Scope #N (e.g. Statistical · Day #1, Value · PHI@ROY #2) — with a small risk pill (Aggressive / Balanced / Safe / Mix) when the parlay's risk level is known. Older parlays without risk info simply show no pill.
Dual parlays: a parlay generation saves a main slip and a hedge slip as a pair. One chip represents both files; once graded it splits into two color halves — left = Slip A, right = Slip B — so a main-loss + hedge-win reads at a glance.
- Pending (plain chip) — not graded yet. Games not finished, or actuals not yet available. Missing data always stays pending — it is never voided or guessed.
- Won / Lost — green / red once every leg resolves.
- Unresolvable — could not be graded (event couldn't be matched to results), or a no-bet artifact: a slip that failed the post-model validator is saved as a no-bet card with the violations named in its note. It documents a blocked bet — don't place it.
- Void (per leg) — scratched player / injury / DNP only. Void legs drop out and the remaining legs decide the result; a slip where every leg voided shows as unresolvable.
- Legacy — generated before grading existed. Rankings never carry a status — they're lists, not bets.
Which books priced it: every leg carries the book that quoted its price (2.10 @ DraftKings). A card built while a Bookmakers choice was active also carries a Bookmakers line naming the selection it was priced against and the books that actually quoted its legs, so a saved card always records the board it came from. A card built with all books eligible needs no such line — its legs already say it.
Download exports chips as PDFs (a dual pair becomes one PDF with both slips), Import accepts a .txt/.md with a v2 parlay-meta block, Delete removes selected chips.
Parlay Types (stat menu)
What the Parlay Type dropdown offers per sport. Remember: for parlay runs this is only the single-stat fallback; Rankings entries change the output shape.
- NBA — Player Points, Rebounds, Threes, PRA, Points+Assists, Points+Rebounds, Rebounds+Assists, Double-Double, Triple-Double, Handicap (spread), Game Totals, Team Totals; Rankings: Points/Threes, DD/TD.
- MLB — Batter HRR (hits+runs+RBIs, the default), Batter Hits, Batter Home Runs, Batter Total Bases, Batter Runs, Pitcher Strikeouts, Handicap (run line), Game Totals, Team Totals; Rankings: HR Power.
- Game / Team Totals — single types: the model picks Over or Under per game/team from the calibrated safe-line, you don't pick the side.
Dates & Calendar
- Date picker — selects the slate. Defaults to today; past dates load that day's games, parlays, and results for review.
- Calendar button — month view with per-date indicators: Device Data (games cached locally), Device Parlays, and Cloud (synced to your session). Click a date to jump to it.
- On past slates the auto-select game buttons find nothing (everything has started); manual selection still works for review, and generating warns about ended games.
Glossary
- Parlay / Leg — One bet combining multiple picks; every leg must hit. A leg is one pick (e.g., "Over 1.5 hits").
- Line / Over-Under / Prop — The bookmaker's number for a stat; you bet the player/team finishes over or under it. A prop is such a bet on an individual player.
- Implied probability — The hit rate the book's price encodes:
P = 1 / decimal odds.
- Edge / +EV — Your assessed win % minus the implied probability. Positive edge = the bet is worth more than it costs.
- p_loss — The model's calibrated probability that a leg loses. Every candidate leg carries one, and a per-leg cap is enforced on it.
- Tier / band (lo / med / hi) — The confidence band a posted line falls into by calibrated probability. The Risk Level composes slips from these bands.
- Correlation — Legs that move together (same game, same lineup). Positively correlated legs raise the slip's true joint probability; the picker accounts for it.
- HRR / Total Bases — Hits+Runs+RBIs combined; total bases = 1/2/3/4 per single/double/triple/HR.
- Jackpot — Multiple sub-parlays combined into one ticket. The payout joins all leg odds. Its win estimate accounts for dependencies between legs; it is not an ordinary parlay's hit rate raised to a fixed power.
- Status tags — NS = not started; Q1–Q4 / OT / HT / BT = NBA period; IN1–IN9 = MLB inning; FT / AOT / Final = ended; PST / CANC / ABD = postponed / canceled / abandoned.
Sessions & Storage
- Session ID — Each device gets one (top bar); parlays and preferences are tied to it. Link Email makes it recoverable across devices (verification required; unlinked sessions are deleted after 30 days of inactivity). Restore Session loads a previous session by ID or linked email.
- Local-first cache — Games, props, and parlays are cached in the browser (IndexedDB) and read from there first; the cloud (Firestore) is the fallback and the durable copy. Parlays that fail to sync stay queued locally and retry.
- Preferences — Sport, parlay type, risk level, legs, and toggles persist locally and sync to your session.