Build a No-Vig Fair Odds Calculator in Google Sheets
If you've ever stared at a two-sided market and wondered what the true probability actually is — stripped of the sportsbook's cut — you need a no-vig fair odds calculator. It's one of the first tools any serious bettor should have. And unlike most spreadsheet tutorials that stop at a toy example, this one goes all the way: you'll get the core math, a fully functional Google Sheets build, and an Apps Script function that pulls live odds from the MoneyLine API so your sheet refreshes against real markets.
This is not a "insert odds manually and stare at it" spreadsheet. We're wiring in live data.
Why Removing Vig Matters
Sportsbooks don't price markets at 100% implied probability. They price them at 104–110%, depending on the sport and book. That overround is the vig (also called juice or margin). It's how they guarantee profit regardless of outcome.
If you're trying to figure out whether a line has value, you can't compare your model's probability against the listed odds directly. You need the no-vig probability — what the market actually thinks, not what the book wants you to think.
Example: the Giants are -120, Cardinals are +100.
- Giants implied: 120/220 = 54.55%
- Cardinals implied: 100/200 = 50.00%
- Total: 104.55%
The excess 4.55% is the vig. To get fair probabilities, you normalize each side by the total. That gives you the no-vig price.
Once you have fair probabilities, you can convert them back to American or decimal odds, compare against any book's posted line, and calculate expected value. That's the full loop.
The Core Formulas
Let's lay out the exact spreadsheet formulas you'll use. Set up your sheet with these columns:
| A | B | C | D | E | F | |---|---|---|---|---|---| | Team | American Odds | Decimal Odds | Implied Prob | No-Vig Prob | Fair American Odds |
Convert American Odds to Decimal (Column C)
=IF(B2<0, 1 + (100/ABS(B2)), 1 + (B2/100))
Negative odds (favorites): divide 100 by the absolute value, add 1.
Positive odds (dogs): divide by 100, add 1.
Implied Probability from Decimal Odds (Column D)
=1/C2
Simple. Decimal odds are just the reciprocal of probability.
Total Implied Probability (a helper cell, say G1)
Put this somewhere:
=SUM(D2:D3)
This is your overround. A sharp two-sided market will sit between 1.02 and 1.06 for most major sports. If it's above 1.08, the book is pricing in extra margin — think alt lines or lower-volume markets.
No-Vig Probability (Column E)
=D2/$G$1
Divide each side's implied probability by the total overround. Now both sides sum to exactly 1.00.
Fair American Odds from No-Vig Probability (Column F)
=IF(E2>=0.5, -(E2/(1-E2))*100, ((1-E2)/E2)*100)
This converts a probability back into American odds:
- Favorite (prob ≥ 0.5): result is negative
- Underdog (prob < 0.5): result is positive
You'll want to round this:
=ROUND(IF(E2>=0.5, -(E2/(1-E2))*100, ((1-E2)/E2)*100), 0)
EV Against a Posted Line
Want to know if a book's line has edge over fair odds? Add a column G for "Book Odds" (what you're actually getting), then:
=E2 * (IF(G2>0, G2/100, 100/ABS(G2))) - (1-E2)
This is standard EV: (prob of winning × profit per unit) minus (prob of losing × stake). Positive means the line is +EV. For more on applying EV logic at scale, see how to evaluate expected value bets.
Building the Full Sheet
Here's how to structure it so it's actually usable day-to-day.
Rows 1–2: Headers and a two-sided market (Team A / Team B).
Row 4: A second market. Keep going. You can stack 20 games vertically and all the formulas copy down.
Column G: A "Comparison Book" column where you manually enter the odds you see at a specific book. The EV column then lights up green (conditional formatting) when EV > 0.
For conditional formatting:
- Select Column H (EV)
- Format > Conditional formatting
- Custom formula:
=H2>0→ fill green - Custom formula:
=H2<0→ fill red
You can also add a column for Kelly bet sizing. Kelly fraction:
=IF(H2>0, (E2 - (1-E2)/IF(G2>0,G2/100,100/ABS(G2)))/1, 0)
Cap it with =MIN(0.25, ...) unless you enjoy variance.
Pulling Live Odds with Apps Script
Manually entering odds is fine for one or two games. It's useless when you're running through 30 MLB games on a Tuesday. Here's how to wire your sheet to the MoneyLine API so you get live odds on demand.
In Google Sheets: Extensions → Apps Script. Paste this:
const API_KEY = "YOUR_MLAPI_KEY";
const BASE_URL = "https://mlapi.bet";
function fetchOdds(eventId) {
const url = `${BASE_URL}/v1/odds?eventId=${eventId}&markets=h2h`;
const options = {
method: "GET",
headers: {
"Authorization": `Bearer ${API_KEY}`,
"Content-Type": "application/json"
},
muteHttpExceptions: true
};
const response = UrlFetchApp.fetch(url, options);
const data = JSON.parse(response.getContentText());
if (!data || !data.bookmakers || data.bookmakers.length === 0) {
return [["No data", "", ""]];
}
// Pull the sharpest book — first in list is typically pinnacle or best available
const book = data.bookmakers[0];
const outcomes = book.markets[0].outcomes;
return outcomes.map(o => [o.name, o.price, book.title]);
}
function LIVEODDSPAIR(eventId) {
const rows = fetchOdds(eventId);
// Returns a 2-row array: [[teamA, oddsA, book], [teamB, oddsB, book]]
return rows;
}
Save, go back to your sheet. In cell A2, call it as an array formula:
=LIVEODDSPAIR("event_id_here")
This returns a two-row block with team names and their American odds (or decimal — depends on your API params). You can then wire columns C through H to reference A2:B3 for the full no-vig calculation.
To get event IDs, call /v1/events filtered by sport and date. You can build a second tab as a lookup table — event IDs on the left, a button to refresh, odds pulling into named ranges. That second tab feeds your main calculator.
For more on connecting API data to analytical workflows, the MoneyLine API docs walk through authentication, credit usage, and the full endpoint index.
One practical note: Apps Script has a 6-minute execution limit and a 20,000 URL fetch quota per day. For 30 games pulled twice each, you're nowhere near the limit. Free tier on the MoneyLine API gives you 1,000 credits/month — enough to run a daily no-vig scan across a full MLB slate without hitting a paywall.
Handling Three-Way Markets
Soccer and some other sports have three outcomes: home win, draw, away win. The formula adjusts slightly because you're normalizing across three implied probabilities instead of two.
Set up rows for Home, Draw, Away. G1 becomes:
=SUM(D2:D4)
No-vig for each:
=D2/$G$1
=D3/$G$1
=D4/$G$1
They should sum to 1.00. The fair odds conversion formula is the same. This matters a lot for World Cup group stage betting where books shade draw prices heavily — removing vig frequently shows draws are priced at 2–3% worse than the fair line implies.
FAQ
What is a no-vig calculator used for?
A no-vig calculator removes the sportsbook's margin from a two-sided (or three-sided) market to find the true implied probability each side. You use that fair probability to calculate expected value against any book's posted line.
How do I find the vig in American odds?
Convert both sides to implied probability (favorites: |odds| / (|odds| + 100), dogs: 100 / (odds + 100)), sum them, and subtract 1. A sum of 1.045 means 4.5% vig.
Can I use this sheet for parlays?
The no-vig probabilities from this sheet are exactly what you want for a parlay correlation or EV analysis. Multiply the no-vig win probabilities together to get a true parlay probability, then compare to the book's payout.
How accurate is the additive no-vig method?
The additive (normalization) method is a good approximation and handles two-sided markets well. For heavy favorites where one side is -300 or more, the multiplicative (power) method is slightly more accurate. You can implement it by solving p^k + q^k = 1 iteratively, but for most betting purposes the normalization method is fine.
What's the difference between this and an odds converter?
An odds converter just changes the format (American to decimal to fractional). A no-vig calculator actually removes the bookmaker margin and gives you a fair-market probability, which is a different and more useful number for value betting.
Wrapping Up
The no-vig fair odds calculator is foundational infrastructure. Everything downstream — EV calculations, Kelly sizing, arbitrage identification — depends on having an accurate fair probability. Building it in Google Sheets means you can update it in ten seconds when a line moves, add new sports without rewriting code, and share it with a co-bettor without any setup friction.
The Apps Script integration is what separates a toy spreadsheet from a real tool. Pulling live odds from the MoneyLine API directly into your cells means you're not copying numbers by hand and introducing fat-finger errors at the worst possible moment. Set it up once, and the math runs itself.