← Back to Tools
Tool

Betting Tracker

Log bets, track wins/losses, and measure your ROI over time. Your data stays private in your browser.

GamedaySchool Shield
Track Everything Win rate, ROI,
profit/loss
0
Total Bets
0%
Win Rate
$0
Profit/Loss
0%
ROI

Add Bet

Bet History

No bets logged yet. Add your first bet above!

For informational purposes only. Not legal gambling advice. Must be 21+ in your jurisdiction.
Gamble responsibly. If you or someone you know has a gambling problem, call 1-800-522-4700.

// Betting Tracker let bets = JSON.parse(localStorage.getItem('gameday_bets') || '[]'); function formatMoney(n) { return (n >= 0 ? '+' : '') + '$' + Math.abs(n).toFixed(2); } function calculatePayout(stake, odds) { const decimal = odds.startsWith('+') ? (parseInt(odds) / 100) + 1 : (100 / Math.abs(parseInt(odds))) + 1; return stake * decimal; } function addBet() { const match = document.getElementById('betMatch').value.trim(); const type = document.getElementById('betType').value; const stake = parseFloat(document.getElementById('betStake').value); const odds = document.getElementById('betOdds').value.trim(); const result = document.getElementById('betResult').value; if (!match || !stake || !odds) return alert('Please fill in all fields'); const payout = result === 'win' ? calculatePayout(stake, odds) : 0; const profit = result === 'win' ? payout - stake : result === 'loss' ? -stake : 0; bets.unshift({ id: Date.now(), match, type, stake, odds, result, payout: result === 'win' ? payout : 0, profit, date: new Date().toLocaleDateString() }); localStorage.setItem('gameday_bets', JSON.stringify(bets)); renderBets(); clearForm(); } function deleteBet(id) { bets = bets.filter(b => b.id !== id); localStorage.setItem('gameday_bets', JSON.stringify(bets)); renderBets(); } function clearAllBets() { if (!confirm('Clear all bets? This cannot be undone.')) return; bets = []; localStorage.setItem('gameday_bets', JSON.stringify(bets)); renderBets(); } function clearForm() { document.getElementById('betMatch').value = ''; document.getElementById('betStake').value = ''; document.getElementById('betOdds').value = ''; } function renderBets() { const list = document.getElementById('betList'); const totalBets = bets.length; const wins = bets.filter(b => b.result === 'win').length; const totalStaked = bets.reduce((sum, b) => sum + b.stake, 0); const totalProfit = bets.reduce((sum, b) => sum + b.profit, 0); const winRate = totalBets > 0 ? ((wins / totalBets) * 100).toFixed(1) : 0; const roiVal = totalStaked > 0 ? ((totalProfit / totalStaked) * 100).toFixed(1) : 0; document.getElementById('totalBets').textContent = totalBets; document.getElementById('winRate').textContent = winRate + '%'; document.getElementById('totalProfit').textContent = formatMoney(totalProfit); document.getElementById('roi').textContent = roiVal + '%'; const profitCard = document.getElementById('profitCard'); profitCard.className = 'stat-card ' + (totalProfit >= 0 ? 'green' : 'red'); if (totalBets === 0) { list.innerHTML = '

No bets logged yet. Add your first bet above!

'; return; } list.innerHTML = bets.map(b => `
${b.match}
${b.type} · $${b.stake.toFixed(2)} @ ${b.odds} · ${b.date}
${b.result === 'win' ? formatMoney(b.profit) : b.result === 'loss' ? formatMoney(b.profit) : 'Push'}
`).join(''); } renderBets();