
An NBA betting model is a spreadsheet that projects how many possessions a game will have and how many points each team scores per possession. It turns those two numbers into a projected score, then compares your spread and total with the sportsbook's line. You bet only when the gap is big enough to matter, and only after you have checked who is actually playing that night.
The framework has six parts: pace, efficiency, home court, rest, a probability, and a rule for when to bet. All of it runs in Google Sheets on free stats. You do not need to code and you do not need paid data.
Below is each part in order, with the formulas and a worked example you can copy.
Why does an NBA model start with possessions and not points per game?
Because points per game mixes two different things: how fast a team plays and how well it scores.
A team that scores 118 a game can be a great offense. It can also be an average offense that plays fast. Those two teams should be priced differently, and points per game cannot tell them apart.
So you split it into three numbers:
- Pace: possessions per 48 minutes
- Offensive rating: points scored per 100 possessions
- Defensive rating: points allowed per 100 possessions
This is the main difference from football. In How to Build a Simple NFL Betting Model in Google Sheets the model runs on points scored and points allowed. In basketball each team gets about 100 possessions a game, so the speed of the game changes the total a lot, and you have to model it.
What data do you need, and where do you get it for free?
Three numbers per team, plus the league average for each: pace, offensive rating and defensive rating.
Basketball Reference publishes all of them for free. Open the season page, find the advanced stats table, and you have every team in one place with a league average row at the bottom. My own NBA sheet takes its stats from Basketball Reference, and the update is a copy and paste by hand. In your sheet, paste the table into a tab called Data and let every other tab read from there.
Keep last season's table in a second tab. You will need it in October and November.
How do you project the score of an NBA game?
In three steps.
- Game pace = home pace + away pace - league average pace
- Each team's efficiency = its offensive rating + the opponent's defensive rating - league average rating
- Points = efficiency x game pace / 100, then adjust for home court
Home court in the NBA used to be worth more than 3 points. It has shrunk, and most modelers now use between 2 and 2.5. Start with 2: add 1 point to the home team and take 1 point from the away team.
Here is an example with two made-up teams:
| Team | Pace | Offensive rating | Defensive rating |
|---|---|---|---|
| Home team | 101.0 | 117.0 | 112.0 |
| Away team | 98.0 | 113.0 | 116.0 |
| League average | 99.0 | 115.0 | 115.0 |
The working:
- Game pace: 101.0 + 98.0 - 99.0 = 100.0 possessions
- Home efficiency: 117.0 + 116.0 - 115.0 = 118.0
- Away efficiency: 113.0 + 112.0 - 115.0 = 110.0
- Home points: 118.0 x 100.0 / 100 + 1.0 = 119.0
- Away points: 110.0 x 100.0 / 100 - 1.0 = 109.0
Projected score: 119.0 to 109.0. That makes your spread home -10.0 and your total 228.0.
In Google Sheets, with the table above in columns A to D and the league average in row 4, the home formula is =(C2+D3-C4)*(B2+B3-B4)/100+1 and the away formula is =(C3+D2-C4)*(B2+B3-B4)/100-1. For a full night, give each game its own row, pull each team's three numbers in from the Data tab with a lookup, and copy the same two formulas down.
How do you turn your number into a probability?
Put the sportsbook's spread and total next to yours and subtract.
| Market | Your number | Sportsbook | Gap |
|---|---|---|---|
| Spread | Home -10.0 | Home -6.5 | 3.5 points |
| Total | 228.0 | 231.5 | 3.5 points (under) |
Then turn the gap into a probability, because a probability is what you compare with a price. NBA final margins land around the expected margin with a standard deviation of about 12 points, the figure most modelers work with. So in Google Sheets:
=1-NORM.DIST(6.5, 10, 12, TRUE)
That returns 0.61: a 61% chance the home team wins by more than 6.5. At -110 (1.91 in decimal odds) you need 52.4% to break even. The expected value lesson lets you play with those two numbers and see what the difference is worth.
On paper, that is value. It is not a bet yet, and the next two sections are why.
What does the model not know about tonight's game?
Who is playing. This is the biggest weakness of any NBA model built on season numbers, and you have to cover it by hand.
- Injuries and rest days. A team's ratings are an average of every game it has played, mostly with its best players on the floor. If a star sits tonight, the sheet still prices the team as if he plays. One player can move an NBA line by several points.
- Back-to-backs. A team playing its second game in two nights is tired, and the market prices that in. Published estimates put it at around 1 to 2 points. I would start with 1.5, taken only from the team that played the night before.
- Trades and lineup changes. After a big trade, a team's season numbers describe a roster that no longer exists.
In the example above, if the away team is on the second night of a back-to-back, its 109.0 becomes 107.5. Your spread moves to home -11.5 and your total to 226.5.
The rule is simple. Before you bet any game the sheet flags, read the injury report. If a key player is out, the gap is already explained and the game is a pass.
How big does the gap need to be before you bet?
Bigger than most people expect. A simple model has its own error. It runs on season averages, it knows nothing about tonight's lineup, and a rating built on 10 or 15 games still swings a lot. A 3.5-point gap sits inside that error, so the 61% above is not as solid as it looks.
I would start by flagging only the games where your spread and the sportsbook's spread are 5 points or more apart, and do the same for totals. Move that number only after you have a season of tracked results that tells you to.
A full NBA night can have 10 or more games. Most of them will be a pass. That is the model doing its job.
How do you handle the first weeks of the season?
With last season's numbers. After three or four games a team's ratings tell you it is great or terrible when it is neither.
Start on last season's table. As games are played, blend in this season's numbers and let them take over, until around a quarter of the way through the season you are running on this year's data alone.
The NBA adds one problem football has less of: rosters change a lot over the summer. For a team that traded its best player or signed a new one, last season's numbers describe a different team. In the first weeks I would pass on those teams and let the sheet work on the ones that kept their core.
How do you know if your NBA model is any good?
Track every bet it flags: the line you took, the result, and the closing line.
Basketball helps you here. An NBA regular season has 1,230 games against 272 in the NFL, so a model that flags only a small share of them still gives you a useful number of bets in one season. Even so, win rate over a few dozen bets tells you very little. The sample size lesson shows how much a good bettor's results can swing by luck alone.
What tells you more, sooner, is whether you beat the closing line. If the line keeps moving toward your number after you bet, the model is finding real value. Closing Line Value Explained shows how to measure it.
For a sense of what a simple sheet can do when it is used with discipline: my NFL model, built on the same principle of averages, a projected number and a big-gap rule, has gone 146-112 (56.59%) over the last five seasons.
FAQ
Do I need to know how to code to build an NBA betting model?
No. Everything in this framework is basic Google Sheets: addition, subtraction, a lookup to pull in each team's numbers, and one built-in function for probability. If you can copy a table from a website and write a formula with a plus sign, you can build it. Most people get a working version done in one evening. The hard part is not the formulas. It is following the rule about when to bet, on a night when ten games are on and every one of them looks like an opportunity.
Where can I find NBA pace and offensive rating for free?
Basketball Reference publishes pace, offensive rating and defensive rating for every team for free, for the current season and for past seasons. Open the season page and look for the advanced stats table. It has all 30 teams and a league average row, which is everything this model needs. Copy the table and paste it straight into your sheet. You do not need a paid data feed or an API for a model like this.
What is a good home court advantage number for the NBA?
Start with 2 points. Home court in the NBA used to be worth more than 3 points, and it has shrunk over the years, so most modelers now use between 2 and 2.5. In the sheet you add half of it to the home team's score and take half from the away team's score. Do not spend much time tuning this number. A half point either way matters far less than knowing whether a team's best player is on the floor tonight.
How do injuries and load management affect an NBA model?
They are the main reason a simple NBA model can be wrong by a lot. Season ratings are an average of every game a team has played, so they assume a normal lineup. When a star sits out, the sheet does not know, and one player can move an NBA line by several points. The fix is a habit, not a formula: read the injury report before you bet any flagged game. If a key player is out and your sheet shows a big gap, the market already knows why, and the game is a pass.
Should I use the model for spreads, totals or moneylines?
All three come from the same projected score, so you can price each one. The spread is the difference between the two projected scores and the total is the sum. For the moneyline, use the same probability formula with 0 in place of the spread, which gives you the chance the team wins the game. Treat them as separate bets, each with its own big-gap rule, and record them separately. After a season you will see which market your model handles better.
How often do I need to update an NBA model?
Update the team stats at least twice a week, and every day if you bet every day. NBA teams play three or four games a week, so ratings move faster than in football, where you update once a week. The update itself is short: paste the new table into the Data tab, type in tonight's lines, and the sheet recalculates every game at once. Then you look at the flagged games only and read the injury report on those.
If you would rather start from a finished sheet than build your own, my NBA model and the others are on the models page. If you want the same price-first logic applied to a single game for you, that is what the AI Betting Assistant does.
Where do you start if you have never built a model?
The framework above is the NBA version of something you can build for any sport. If you want to be walked through your first one, from a blank spreadsheet to a number of your own, that is what The Ultimate Modern Bettor's Toolkit is for.
$27, one payment. It includes the +EV betting model spreadsheet, a 45-minute video training that builds your first model with you, and the four-bucket staking system. 30-day money-back guarantee.
MB built Underdog Chance around one idea: make your own number first, then bet only when the price beats it. Over the last 20+ years his simple, probability-based Google Sheets models have helped thousands of bettors stop following picks and start pricing bets for themselves.
Last updated: 7 October 2026
