Bet Tracker

Parlays are joint bets. Each leg has its own bar. Refresh pulls ESPN stats.

Exposure

Stake vs. payout if hit

Loading bets…

New bet

Add a bet

Ticket
Target

For a team record, target is the number of wins needed (Over 9.5 → 10). Put "under" in the description for an under bet. ESPN refresh fills in current stats.

Legs
Money and odds

Result

One-time setup

Connect GitHub to save

Saving commits your changes to data/bets.json in . The latest version of the file is read first, so the hourly ESPN updates are kept. You need a fine-grained token that can write to that one repository:

  1. Open GitHub → Fine-grained tokens → Generate new token.
  2. Repository access: Only select repositories → choose the repository above.
  3. Permissions → Repository → Contents: Read and write. Nothing else is needed.
  4. Pick an expiration, generate it, and paste it below.

The token is saved only in this browser (localStorage) and is only ever sent to api.github.com. It is never put in the repo. Use "Forget token" on shared computers. If you'd rather not use a token, close this and use Copy JSON or Download instead.

Save without a token

Your updated bets.json

Open data/bets.json on GitHub, click the pencil to edit, select everything, paste this over it, and commit. Do it soon: this copy has the stats from when the page loaded.

Help

How the charts and numbers are calculated

Stake vs. payout if hit

  • Rows are groups of tickets. By type groups by bet type (player props, team records, parlays, awards, futures). By user groups by who placed the bet.
  • Horizontal axis is dollars.
  • Staked (gray) is the total amount wagered on the tickets in that group.
  • Payout if hit (purple) is the total return those tickets pay if they win, stake included. It's taken straight from each ticket's payout amount and includes every status (open, hit and miss).
  • Hover a bar to see the dollar amount and how many tickets are in the group.

Summary cards

  • Tickets: how many tickets are in view, split into open, hit and miss.
  • Total staked: all stakes in view. "Still riding" is the stake on open tickets only.
  • Potential payout: total payout of open tickets. The profit line is that payout minus their stake, if every open ticket wins.
  • Record: hits – misses. Win rate = hits ÷ (hits + misses). Net = payouts of hits − stakes of all settled tickets. ROI = net ÷ settled stake.

Chart Report: progress and pace

Each bar is a pace score from 0–100%. It shows how well a bet is tracking. It is not a win probability. Awards and futures (yes/no bets) are left out, and so is any entry without a target.

  • Player props: progress = current stat ÷ target. Required pace = target ÷ season games (NFL 17, college 12, NBA 82, MLB 162, NHL 82 unless the bet sets its own). Actual pace = current ÷ the team's completed games from ESPN, which counts team games, not the player's appearances. Score = 40% progress + 60% pace, with pace capped at 100%. A player exactly on pace after 3 of 17 games scores about 67%. If team games haven't loaded yet, the score is just progress. Props are treated as "over" bets.
  • Team win totals (over): wins needed = target. Score = actual win rate (wins ÷ games played, ties count as played) ÷ required win rate (target ÷ season games), capped at 100%. Once the team reaches the target it's 100%. Once the target can no longer be reached it's 0%.
  • Team win totals (under) (the description or notes contain "under"): max wins = target − 1. Score = actual loss rate ÷ required loss rate ((season games − max) ÷ season games). It's 0% once wins pass the max and 100% once the under is locked in.
  • Settled tickets: a hit counts as 100% and a miss as 0%. If a parlay is settled, all its legs follow it.
  • Parlays: each leg gets its own row. The ticket's stake and payout are split evenly across its legs (award and future legs are skipped). The parlay's bar is the average of its leg scores. That can look optimistic, because every leg has to hit to win.
  • Implied value = payout × score. Overall progress is the average score weighted by payout, or a plain average if no entries have payouts.
  • Eligible entries counts the report rows (single bets plus parlay legs). Tickets selected counts every ticket matching the filters, awards and futures included. Allocated stake totals stake across eligible entries.

The bars on the bet cards are simpler. They show raw progress (current ÷ target, or wins ÷ target), and parlays show the average across their legs.

Which filters apply

  • The User, Sport, Type, Timeline and Status dropdowns apply to everything: the bet list, summary cards, stake chart and Chart Report.
  • Search applies to the bet list, summary cards and stake chart, but not to the Chart Report.
  • Sort only changes the order of the bet list.

Closing-line value (CLV)

  • Enter the odds when placed and the closing odds (the final odds right before the game or market locks) in the form. Both use American odds like −110 or +150.
  • CLV = (decimal odds when placed ÷ decimal closing odds − 1) × 100. A bet at +110 that closes at −110 has CLV of +10.0%, because you got a better price than the market's final number.
  • A positive CLV means you beat the close. Within ±0.05% counts as matching it. Beating the close over time is the best sign your bets are actually good, whether or not they win.
  • The Closing-line value card shows the average CLV across tickets in view that have both odds, plus how many beat the close. Tickets missing either odds are left out. CLV doesn't change pace scores, progress or P/L. It uses the posted odds as given, with no adjustment for the bookmaker's cut.

Adding, editing and settling bets

  • Add bet opens the form. Edit, Mark hit and Mark miss are on each card. Settling records the result (hit or miss) and today's date as the settled date (settledAt).
  • Changes show up right away but stay unsaved in this browser until you save them from the bar at the bottom. Commit to GitHub writes them to data/bets.json using your token. It reads the newest file first and applies only the fields you changed, so ESPN stats from the hourly bot are never overwritten. Copy JSON and Download give you the whole file to paste in by hand.

Open, hit and miss

  • Open: not settled yet.
  • Hit: the bet won. A refresh marks it automatically when a prop or team-win "over" reaches its target, or when every parlay leg reaches its target.
  • Miss: the bet lost. A refresh marks it automatically when a team-win "under" reaches its target. Otherwise it's set by hand in data/bets.json, and awards and futures are always set by hand.
  • Refresh ESPN in the browser only updates what's on screen. The hourly GitHub Action is what saves new stats.