Every sharp bettor knows the drill: sportsbooks embed their profit margin (the "vig" or "juice") directly into their odds. A fair coin flip should offer +100 on both sides, but you'll see -110/-110 instead. That 10-cent difference? Pure house edge.
Building a no-vig calculator in Google Sheets that connects to live odds data transforms how you evaluate bets. Instead of manually converting odds and doing probability math in your head, you'll have a dynamic spreadsheet that pulls fresh lines, strips the juice, and reveals the sportsbook's true implied win probabilities.
This walkthrough shows you how to build exactly that using Google Sheets and the MoneyLine API for live odds data.
Why Remove the Vig from Sports Betting Odds?
Sportsbooks don't offer fair odds. They build in a profit margin by making the implied probabilities of all outcomes sum to more than 100%.
Take a typical NFL game with -110 odds on both sides:
- Team A -110 = 52.38% implied probability
- Team B -110 = 52.38% implied probability
- Total: 104.76%
That extra 4.76% is the vig. The true probability split might be 50%/50% or 51%/49%, but the book inflates both sides to guarantee profit regardless of outcome.
By calculating no-vig probabilities, you can:
- Find EV opportunities: Compare your model's probabilities against the true market probabilities
- Spot soft lines: Identify when books haven't adjusted properly to sharp money
- Build better models: Use fair market probabilities as inputs rather than juiced lines
Setting Up Your Google Sheets No-Vig Calculator
Start with a clean Google Sheet. We'll build this in sections: odds input, vig removal calculations, and live data integration.
Basic Two-Way Market Setup
In row 1, create headers:
- A1: "Team A Odds"
- B1: "Team B Odds"
- C1: "Team A Implied %"
- D1: "Team B Implied %"
- E1: "Total Vig %"
- F1: "Team A No-Vig %"
- G1: "Team B No-Vig %"
In row 2, start with sample odds:
- A2: -110
- B2: -110
Converting American Odds to Implied Probability
In C2, enter the formula to convert Team A's American odds to implied probability:
=IF(A2>0, 100/(A2+100), ABS(A2)/(ABS(A2)+100))
Copy this formula to D2 for Team B, changing the reference to B2.
This formula handles both positive and negative American odds:
- For positive odds (+150): 100/(150+100) = 40%
- For negative odds (-110): 110/(110+100) = 52.38%
Calculating the Vig
In E2, calculate the total vig by summing both implied probabilities:
=C2+D2-1
This shows how much the sportsbook is overcharging. Fair odds would sum to exactly 1.00 (100%).
Removing the Vig
Now for the core calculation. In F2, calculate Team A's no-vig probability:
=C2/(C2+D2)
In G2, calculate Team B's no-vig probability:
=D2/(C2+D2)
This proportionally redistributes the implied probabilities so they sum to 100%. If the original split was 52.38%/52.38% with 4.76% vig, the no-vig split becomes 50%/50%.
Adding Live Odds Data with MoneyLine API
Static calculations are useful for learning, but live odds data makes this tool powerful. We'll use Google Apps Script to fetch real-time odds from the MoneyLine API.
Setting Up the API Connection
Go to Extensions → Apps Script in your Google Sheet. Replace the default code with:
function fetchLiveOdds() {
const API_KEY = 'your_api_key_here'; // Get free API key at moneylineapp.com
const url = `https://mlapi.bet/v1/odds?sport=americanfootball_nfl&markets=h2h®ions=us&oddsFormat=american&apikey=${API_KEY}`;
try {
const response = UrlFetchApp.fetch(url);
const data = JSON.parse(response.getContentText());
if (data.data && data.data.length > 0) {
const game = data.data[0]; // First game for demo
const outcomes = game.bookmakers[0].markets[0].outcomes;
// Write to specific cells
SpreadsheetApp.getActiveSheet().getRange('A2').setValue(outcomes[0].price);
SpreadsheetApp.getActiveSheet().getRange('B2').setValue(outcomes[1].price);
}
} catch (error) {
Logger.log('API Error: ' + error.toString());
}
}
Save the script and authorize the necessary permissions when prompted.
Creating a Refresh Button
Back in your spreadsheet, insert a drawing or button shape. Right-click and assign the script function fetchLiveOdds. Now you can refresh odds with one click.
For automatic updates, modify the Apps Script to include a time-based trigger:
function createTrigger() {
ScriptApp.newTrigger('fetchLiveOdds')
.timeBased()
.everyMinutes(5)
.create();
}
Run createTrigger() once to set up automatic 5-minute updates.
Advanced Features for Sharp Bettors
Multi-Book Comparison
Expand your sheet to compare no-vig probabilities across multiple sportsbooks. Add columns for DraftKings, FanDuel, BetMGM odds, then calculate each book's no-vig probabilities.
This reveals which books are offering the softest lines on each side.
Expected Value Calculation
Add your own win probability estimates and calculate expected value:
In H1: "My Team A %" In I1: "Team A EV"
In I2:
=(H2*IF(A2>0,A2/100,-100/ABS(A2))-(1-H2))*100
This shows your expected profit percentage when your probability assessment differs from the no-vig market probability.
Three-Way Markets (Soccer, Hockey)
For sports with draws, modify the formulas to handle three outcomes. The principle remains the same: divide each implied probability by the sum of all implied probabilities.
Building a Live Odds Scanner
Take this concept further by scanning multiple games simultaneously. Create a multi-row setup where each game occupies one row, and use Apps Script to loop through all available games:
function scanAllGames() {
const API_KEY = 'your_api_key_here';
const url = `https://mlapi.bet/v1/odds?sport=americanfootball_nfl&markets=h2h®ions=us&oddsFormat=american&apikey=${API_KEY}`;
const response = UrlFetchApp.fetch(url);
const data = JSON.parse(response.getContentText());
const sheet = SpreadsheetApp.getActiveSheet();
let row = 2;
data.data.forEach(game => {
const outcomes = game.bookmakers[0].markets[0].outcomes;
sheet.getRange(row, 1).setValue(outcomes[0].price);
sheet.getRange(row, 2).setValue(outcomes[1].price);
row++;
});
}
This approach lets you monitor dozens of games simultaneously, automatically identifying lines with unusually high or low no-vig probabilities.
Connecting to Your Betting Strategy
Your no-vig calculator becomes most powerful when integrated with your broader betting approach. Many sharp bettors use arbitrage opportunities identified through cross-book vig removal, while others focus on expected value betting by comparing their models against fair market probabilities.
The key insight: sportsbooks often apply vig unevenly. A book might charge 4% vig on the favorite and 6% on the underdog, creating subtle EV opportunities that only become visible after vig removal.
Frequently Asked Questions
What's the difference between no-vig odds and fair odds?
No-vig odds remove the sportsbook's profit margin from quoted odds, revealing the market's implied true probabilities. Fair odds would require perfect information about the actual probability of each outcome, which doesn't exist in sports betting.
How much vig do sportsbooks typically charge?
Standard vig ranges from 4-5% on main markets like moneylines and spreads, but can reach 20-30% on exotic props. Lower-limit books often charge higher vig, while sharp books like Pinnacle operate with vig as low as 2%.
Should I always bet the side with higher no-vig probability?
No. Your betting edge comes from comparing your probability assessment to the no-vig market probability. If you think Team A has a 60% chance to win but the no-vig probability shows 55%, that's a potential EV bet on Team A.
Can I use this calculator for live betting?
Yes, but odds move quickly during games. Consider upgrading to more frequent API calls (every 30-60 seconds) for live betting applications. The MoneyLine API offers real-time odds updates that integrate seamlessly with Google Sheets.
How do I handle three-way markets like soccer?
Use the same proportional redistribution principle: divide each team's implied probability by the sum of all three implied probabilities. The formulas become =TeamA_Implied/(TeamA_Implied+Draw_Implied+TeamB_Implied) and so on.