Build a No-Vig Fair Odds Calculator in Google Sheets
If you've ever looked at a -110 / -110 line and wondered what the book actually thinks the true probability is — versus what they're charging you — you need a no-vig fair odds calculator in Google Sheets. This is the single most useful spreadsheet a serious bettor can build. It strips the margin out of a two-sided market, gives you the implied true probability for each side, converts that back to fair American odds, and flags when a line at another book is offering genuine positive expected value.
This post walks you through every formula, from raw moneyline conversion to the devig math, plus an optional Google Apps Script snippet that pulls live odds directly from the MoneyLine API so your sheet refreshes automatically instead of requiring manual data entry.
Why Removing Vig Matters Before You Bet Anything
Sportsbooks don't offer 50/50 odds on 50/50 markets. They offer -110 on both sides of a coin flip. That's a 4.55% house edge baked into every line. If you're evaluating whether a +130 price at Book B is "good," the only honest benchmark is the fair probability implied by the sharpest market — not the displayed line at any single book.
The process:
- Take the best available two-sided market (usually a sharp book like Pinnacle or a no-vig exchange)
- Strip the margin to get true implied probabilities
- Convert those true probabilities back to American odds
- Compare your target book's line against those fair odds
- If the target line exceeds fair value → positive EV
This is exactly what our EV betting guide covers in theory. This post makes it operational in a spreadsheet anyone can open and use in under ten minutes.
Sheet Structure: What You're Building
Open a new Google Sheet. Set up columns like this:
| Col | Label | What Goes Here | |-----|-------|---------------| | A | Team / Side | Text label | | B | Book Line (American) | e.g. -110, +130 | | C | Implied Prob (raw) | Formula | | D | Sum of Raw Probs | Shared cell | | E | Fair Prob (devigged) | Formula | | F | Fair American Odds | Formula | | G | Target Book Line | Manual or API-fed | | H | Target Implied Prob | Formula | | I | EV % | Formula | | J | Kelly % | Formula |
Rows 2 and 3 are Side 1 and Side 2. Row 5 can be a summary row.
The Core Formulas
Step 1 — American Odds to Implied Probability
Paste these in C2 and C3. They handle both positive and negative American odds:
=IF(B2<0, ABS(B2)/(ABS(B2)+100), 100/(B2+100))
This is the standard conversion. For -110: 110/(110+100) = 52.38%. For +130: 100/(130+100) = 43.48%.
Step 2 — Sum of Raw Probabilities (the overround)
In D2 (and reference this cell throughout):
=C2+C3
A -110/-110 market gives you 1.0476 — that 4.76% is the book's margin. A sharp two-sided market might be 1.02 or lower.
Step 3 — Devigged Fair Probability (Multiplicative Method)
The multiplicative devig method is the most defensible for two-outcome markets. It normalizes each side's implied prob by the total overround:
In E2:
=C2/D2
In E3:
=C3/D2
These will now sum to exactly 1.0. That's the book's margin removed. E2 and E3 are your fair probabilities.
Step 4 — Fair American Odds
Convert fair prob back to American odds. If fair prob ≥ 0.5, the fair line is negative; if < 0.5, it's positive.
In F2:
=IF(E2>=0.5, -(E2/(1-E2))*100, ((1-E2)/E2)*100)
Round it if you want cleaner output:
=ROUND(IF(E2>=0.5, -(E2/(1-E2))*100, ((1-E2)/E2)*100), 0)
Step 5 — Target Book Implied Probability
Your target book's line goes in G2. The implied prob formula in H2 is identical to C2:
=IF(G2<0, ABS(G2)/(ABS(G2)+100), 100/(G2+100))
Step 6 — Expected Value Percentage
EV % tells you how much you expect to make per dollar wagered, relative to the fair probability. In I2:
=IF(G2<0, (E2*(100/ABS(G2)) - (1-E2))*100, (E2*(G2/100) - (1-E2))*100)
Broken down: (fair_win_prob × payout_per_unit) - (fair_lose_prob × 1 unit risked), expressed as a percentage.
Positive I2 → the target book's line beats fair value → bet has positive EV. See the arbitrage and EV tools comparison for how this stacks up against exchange-based approaches.
Step 7 — Full Kelly Criterion Sizing
Kelly tells you what fraction of your bankroll to wager. In J2:
=IF(I2<=0, 0, (E2 - (1-E2)/IF(G2<0, 100/ABS(G2), G2/100))/1)
Cleaner version that handles both positive and negative lines:
=IF(I2<=0, 0,
IF(G2>0,
(E2*(G2/100+1) - 1) / (G2/100),
(E2*(100/ABS(G2)+1) - 1) / (100/ABS(G2))
)
)
Most bettors use quarter-Kelly or half-Kelly. Multiply J2 by 0.25 for a conservative sizing recommendation. The math behind this is detailed in our EV betting reference.
Automating Live Odds with Google Apps Script
Manually entering lines is fine for occasional checks. For live monitoring, you want Apps Script pulling directly from the odds API. Here's a script that hits the MoneyLine API /v1/odds endpoint and writes the top two-sided market for a given event into your sheet.
// Tools > Script Editor — paste this in full
const API_KEY = "YOUR_MLAPI_KEY"; // get one free at moneylineapp.com
const BASE_URL = "https://mlapi.bet";
function fetchFairOdds() {
const sport = "baseball_mlb"; // change per sport
const market = "h2h"; // head-to-head / moneyline
const url = `${BASE_URL}/v1/odds?sport=${sport}&markets=${market}&bookmakers=pinnacle,fanduel,draftkings`;
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.data || data.data.length === 0) {
Logger.log("No events returned.");
return;
}
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("LiveOdds");
sheet.clearContents();
sheet.appendRow(["Event", "Side", "Pinnacle Line", "FanDuel Line", "DraftKings Line"]);
data.data.forEach(event => {
const eventName = event.home_team + " vs " + event.away_team;
const outcomes = event.bookmakers?.[0]?.markets?.[0]?.outcomes || [];
outcomes.forEach(outcome => {
const pinnacleLine = getLine(event, "pinnacle", market, outcome.name);
const fanDuelLine = getLine(event, "fanduel", market, outcome.name);
const dkLine = getLine(event, "draftkings", market, outcome.name);
sheet.appendRow([eventName, outcome.name, pinnacleLine, fanDuelLine, dkLine]);
});
});
Logger.log("Odds updated: " + new Date());
}
function getLine(event, bookmaker, market, teamName) {
const bk = (event.bookmakers || []).find(b => b.key === bookmaker);
if (!bk) return "N/A";
const mk = (bk.markets || []).find(m => m.key === market);
if (!mk) return "N/A";
const outcome = (mk.outcomes || []).find(o => o.name === teamName);
return outcome ? outcome.price : "N/A";
}
After running fetchFairOdds(), your LiveOdds sheet has raw lines from three books. Your calculator sheet (with the formulas above) can reference those cells directly using =LiveOdds!C2 etc., so the no-vig math updates every time you trigger the script.
Set a time-based trigger (Edit > Current project's triggers) to run every 5 or 10 minutes during a slate and your sheet becomes a live fair-odds dashboard.
Conditional Formatting to Flag +EV Lines
Select column I (EV %). Go to Format > Conditional formatting:
- Rule 1:
=I2>5→ Green fill. Lines with >5% EV are actionable. - Rule 2:
=AND(I2>0, I2<=5)→ Yellow fill. Marginal edge, worth watching. - Rule 3:
=I2<=0→ Red fill. No edge at this book.
Now you can scan a full day's slate at a glance. Anything green deserves a closer look before the line moves.
Limitations and What This Sheet Won't Tell You
The devig math assumes the two-sided market you're using as a reference is itself efficient. If you're devigginng a book that also has margin, you're not getting a clean fair probability — you're getting a noisy estimate. Always use the sharpest available source as your input: Pinnacle, a prediction market line, or the consensus from the MoneyLine API's /v1/edge endpoint which does this comparison server-side across 40+ books.
Also: Kelly sizing assumes you trust your probability estimate. If your fair prob comes from a book line that moved two hours ago, your Kelly output is only as good as that stale data. Use live API pulls whenever possible.
Frequently Asked Questions
What is a no-vig fair odds calculator? It's a tool that removes a sportsbook's built-in margin (the "vig" or "juice") from a two-sided betting market to reveal the true implied probability each side wins. You compare that true probability against a target book's offered odds to determine whether the bet has positive expected value.
Which devig method should I use — multiplicative or additive? For standard two-outcome markets (moneyline, spread), the multiplicative method (dividing each raw probability by the sum of all raw probabilities) is the most common and defensible. The additive method subtracts equal vig from each side, which can produce distorted fair odds when lines are lopsided.
Can I use this sheet for parlays or totals? For totals (Over/Under), yes — same exact formulas apply since it's a two-outcome market. Parlays are more complex because correlation between legs changes the fair parlay probability significantly. The no-vig calc handles each leg independently; a correlation adjustment is a separate step.
How do I get a MoneyLine API key for the Apps Script? Sign up for the free tier at moneylineapp.com. Free accounts get 1,000 API credits per month — enough for several sessions of live odds pulling per day during a typical slate.
Why is my Kelly output showing a very large percentage? Large Kelly outputs (say, >20% of bankroll) usually mean one of two things: your fair probability estimate is too high, or the target line is so far off the fair value that Kelly is telling you to go large on what looks like free money. In practice, cap any Kelly recommendation at 2-5% per bet and use quarter-Kelly as a sanity check. If a number looks absurd, verify your input lines are correct before acting.