Methodology

How SPIN ranks players.

Production over potential. What goes in, what stays out, what we tested, and what we cannot see.

What these rankings measure. Our boards measure player production. We show which players are producing the most on the field, which is the given task of any football player and a measure we think is pretty important.

We don't measure potential. We leave that to the recruiting sites.

No recruiting rank, star rating, offer list or college destination is an input here. Our build process checks that on every board before it can publish.

Who is evaluated, and where. These boards cover one classification at a time. The first set is Utah 6A for the 2025 season, built from 184 games with usable statistics and roughly 4,900 individual player game lines. More classifications follow. We do not rank players across classifications against each other, and we will say so if that ever changes.

Inside a classification, every player who meets a minimum participation threshold is evaluated. That threshold is currently five games with a recorded line.

We start from the whole population we have statistics for, rather than a watch list. That distinction is the point. A ranking built from a watch list can only re-rank players somebody already found. The player at the program nobody covers is invisible to it before the first calculation runs. Where our statistics have holes, and they do, we name the holes at the bottom of this page instead of letting them pass as a complete picture.

Where the data comes from. The best publicly available verified statistics we can find, our own records from games we cover, and confirmed corrections from coaches and programs. Every board is built from a data snapshot on a stated date, so anyone checking our work knows which version of the record we were looking at. The 2025 Utah 6A boards were built from a snapshot taken on August 10, 2026.

How a score is built. Five steps, in this order, for every player on every board. One rule inside step four works differently at quarterback, and that is flagged where it happens.

One. Pull each individual game line rather than a season total. A season total flattens fourteen very different nights into one number.

Two. Convert each game into a single production figure by valuing the events in it on a common scale, measured in yards equivalent. Yards count as yards. Scores, turnovers gained and given up, sacks, tackles for loss and defensive scores are each worth a defined amount of yardage, set by how much they actually move a football game. A defensive touchdown is worth significantly more than an offensive one, because it takes away a scoring chance and produces points on the same play. A thrown interception carries a heavy cost. An assisted tackle is a half share, because that's how the play actually happened.

Three. Weight each game by how hard it was to produce in, which is a function of who he played and what was at stake.

Four. Divide by games played, so a player is measured by what he did per outing rather than by how many outings he got.

Five. Apply verified corrections. A correction always fixes the input rather than the ranking, so it flows through everywhere that number appears. What it must never do is get quietly overwritten on the way, so a correction is layered on after the season is totalled rather than dropped into the pile beforehand. The effect is that a confirmed fact stays confirmed even when the source it came from is still missing the game it came from.

Volume and efficiency, and why we chose volume per game. This is one of the most consequential decisions in any production model. A SPIN score is production per game, not production per touch.

A running back with 1,100 yards on 180 carries outranks one with 400 yards on 45 carries, even though the second man averaged more per carry. We think that's right at this level. A back carrying the ball twelve times a night is doing a materially different job from one carrying it four times, and rate statistics on small workloads swing wildly on two long runs.

There's a second reason and it carries more weight. Any denominator a coach enters by hand, whether carries, attempts or receptions, can be edited afterward. Games played cannot. It's on the public schedule.

We want to be careful about what that buys, because it would be easy to oversell. Building the score on games closes the cheapest and least visible way to move a player, which is shrinking the number of chances he is recorded as having had. It does not make the rest of the sheet honest. Offensive yardage is loosely tied to team totals and a final score. Defensive counting stats are tied to nothing at all. Anybody who tells you their high school numbers are tamper proof is selling you something.

What actually protects the boards is slower and less impressive: a corrections process that logs who told us what, our own presence at games we cover, and a willingness to say out loud when a number cannot be stood behind.

What counts as a game he played, because the denominator decides everything. If a player was on the field, that game is graded. A quiet night against a good defense is a result, and a production model that quietly dropped it would be flattering everybody.

That rule has exactly one exception and we would rather state it here than have you find it. Some games are not football. When two programs are separated by an enormous distance in the national rankings, one team's varsity is playing another team's scrimmage, the starters are in ball caps by the fourth quarter, and nothing that happens tells you anything about anybody. We leave those out of a player's record entirely rather than trying to price them.

The bar is deliberately high. A game only comes out when the opponent sits roughly twenty times further down the national list. In the 2025 Utah 6A season that was nine games out of 184. Every one of them was won by at least 34 points and five by fifty or more. Nothing competitive is ever removed, and if you can find a close game we deleted, we want to hear about it.

We use the distance between the two teams before kickoff, not the final score, and the difference is the whole thing. We built the scoreboard version first and threw it away, because it deleted a team's best nights against real opponents for the crime of being dominant. A ranking gap describes two rosters. A margin describes what happened. Only one of those is a fair reason to ignore a Friday.

One consequence worth stating plainly: a player's eligibility is judged on the games he played, not on the games we scored. A kid who dressed eleven times played eleven times, and ruling him out of a ranking because his athletic director scheduled two mismatches would be absurd.

The reverse is just as important. A player is never averaged against games he wasn't available for. His record runs from his first appearance to his last, so a player who arrives midway through a season is measured on the season he actually played, and a player who misses an extended stretch isn't charged for the weeks he was hurt.

Quarterback is the exception, and it is the one position where the exception is necessary. Only one quarterback plays at a time, so a quarterback who doesn't appear did not play. He wasn't ineffective. Splitting the job is common enough at this level that treating those two situations as the same thing would misrepresent both men.

We should be square about the cost of that. A receiver who dressed and caught nothing takes the quiet night on his average. A backup quarterback who dressed and threw nothing does not. We think that asymmetry is the lesser error, because at every other position a player on the roster had a chance to produce and at quarterback he demonstrably did not. It is still an asymmetry and you are entitled to know it is there.

We publish games played beside every score so this is checkable. If our count of a player's season doesn't match yours, you can see it at a glance and tell us.

A SPIN score is an unbounded number, not a grade out of a hundred. It is that player's average production per game in yards equivalent, after adjustment. Compare it to the other scores on the same board and nothing else.

Where we adjust for competition. We adjust for the level of opponent a player faced. How long it took us to get there is part of the answer, so here is that too.

For two seasons we tested for it and found nothing. Seven separate tests, across every position board, produced no relationship we could measure between schedule strength and individual production. We said so, and we declined to apply an adjustment we couldn't defend.

Those tests were built wrong. Every one of them compared different players to each other using a season average schedule. That design cannot work. The best players are concentrated at the best programs, and the best programs play the hardest schedules. Talent and difficulty move together, so they cancel, and the measurement comes back empty while the effect is sitting right there.

Rebuilding it around individual game lines let us ask the question properly, by comparing each player against himself. Same player, same scheme, same teammates, same coaching, sorted by the class of opponent he happened to be facing that night. Across several thousand player games the average moved in one direction the whole way: the better the opponent, the less production, with no reversal between any two classes of opponent, and odds against chance of less than one in a hundred thousand.

That is a statement about the average, not about any individual, and the difference is large. Roughly one player in three produced more against the top of his schedule than against the rest of it, and some did it by a wide margin. Those are frequently the most interesting players on the board, and a few of them are the best players in the state.

The adjustment doesn't dispute them. It's the reason their best nights count for what they were worth. Production against elite opposition is scaled up, so a player who saves his biggest games for the best teams he faced is rewarded by this system rather than smoothed out by it. What the adjustment corrects is the opposite case, the player whose numbers came against the softest part of a schedule and would otherwise read the same as numbers earned in November.

So we adjust. A game against elite opposition is scaled up, a game against the weakest opposition is scaled down, and games in the broad middle sit close to neutral. We publish the schedule a player faced and a single figure for how heavy it was, where 1.00 is a neutral slate, so you can see the size of what we applied to him without us handing over the scale itself.

The seven failed tests are in this page deliberately. An evaluation system that never reports finding nothing isn't testing anything.

Why the stage of the season carries weight of its own. A state semifinal and a state final carry additional weight above whatever the opponent adjustment has already paid for. A national championship carries more. The early playoff rounds carry nothing extra at all, and that is deliberate.

The reason the early rounds sit at neutral is structural. In a bracket that takes the whole classification, a top seed's opening game is a mismatch by design and is no harder than a normal Friday. A lower seed's opening game is the hardest night of his year. One weight cannot serve both, and any weight above neutral would hand the best teams extra credit for beating the worst ones. The opponent adjustment already handles both cases correctly on its own, because it looks at who they actually played rather than what round it was.

The deep rounds are different, and we measured how different rather than assuming. First we compensate every game for the opponent, so that whatever is left cannot be explained by the other team being good. Then we compare each player's semifinal and final against his own compensated regular season rate. What remains is production running at roughly six tenths of his normal level. That gap is what the stage weight closes.

We should be careful about the word difficulty here. What the measurement establishes is that the same player produces less on that night. It does not prove why. A December final is played in different weather, with different game management, against a defense that has had a week to prepare for one opponent instead of sharing a week with a scout team. All of that is real and none of it is separable from a box score.

The one alternative explanation we could test, we did. The obvious objection is that players simply get fewer chances in tight elimination games, which would mean the weight is paying them for low usage rather than for difficulty. Opportunities, meaning the touches and snaps a player's own statistics show him being given, do not fall in the deepest rounds. They rise about ten percent, while production per opportunity falls by more than a third, and that drop is statistically significant. Players get more chances and do less with them. Whatever is happening in those games, it is not a shortage of football.

We also set the weight below what the measurement implies. That is a choice and not an oversight. The deep round samples are small, an unmeasured share of that gap is game management rather than difficulty, and an error here compounds with the opponent adjustment rather than sitting beside it. When a measurement and caution disagree at the edges, we take caution.

What we deliberately don't do. We don't rank offensive linemen. There's no box score for the position and no honest way to build one from public data, so we say that rather than shipping a board we couldn't defend to a line coach.

We don't currently separate cornerbacks from safeties, or edge rushers from off ball linebackers. High school rosters aren't labeled consistently enough between schools to do it without introducing a worse bias than the one it fixes. We're working on it and we'll say so when it changes.

Blanks are not zeros, and we tell you where they are. A category a school never recorded is a blank. It is not a zero, and the two are different facts. We don't fill those in, because inventing production is worse than missing it, and we name the gap rather than let a player quietly carry the mark of his athletic department's paperwork. Two 2025 Utah 6A programs did not record pass deflections, so their defenders are measured on everything else. They are named below.

A note on the tackle numbers you'll see. The stat lines on our boards show total tackles, solo plus assisted, because that's the convention every outlet prints and the number a coach will check us against. The score credits an assisted tackle as a half share. Those are two different numbers, and the difference is deliberate.

What the box score can't see. A cornerback who erases his side of the field can finish a night with no targets, no tackles and no interceptions. In a production model he registers nothing, while a safety making twelve tackles on a defense that's being moved on registers a great deal.

There's a bigger version of that problem, and it applies to everyone doing this work. A box score is a record of things that went right. There is no debit column. Nobody at this level tracks missed tackles, touchdowns allowed, dropped passes, throws behind a receiver, a receiver running the wrong route, or a defender blowing his assignment. Those plays happened. Some of them decided games. They leave no trace in any statistic we or anybody else can get hold of.

In one case it's worse than absence. A cornerback beaten for a forty yard completion who makes the tackle afterward is credited with a tackle. The record shows production on a play he lost. We know that, we can't fix it from a box score, and neither can anyone else working from one.

The only negatives the record does contain are the ones with a turnover attached, a thrown interception or a lost fumble, and we charge those heavily. Everything else on that side of the ledger is invisible to us.

So take these boards for what they are. They measure production, they measure it more carefully than a raw stat sheet does, and they still only see half the game. It's one reason these are a measurement and not a verdict, and one reason our film work and our rankings are separate products.

Why we publish the structure but not the constants. Every evaluation system rests on how it aggregates. PFF grades the same film anyone can watch. What belongs to PFF is the way it turns that film into a number. The interpretation is the product.

Ours works the same way, on harder ground. The values in our scale come from years of studying football production and how it varies with competition, scheme and coaching, applied to a level of the sport with thinner data, wider talent gaps and far more variance than the professional game. That work is the asset and we protect it, the same as PFF, KenPom and every ratings system before us has protected theirs.

What we owe you instead is the reasoning: what goes in, what's deliberately left out, the order it's processed in, the relative logic of the scale, where the thresholds sit, what we tested and what came back empty, and what we can't see. All of that is above. A reader who disagrees with our conclusions can point to exactly which decision he disagrees with, and that's the part that matters.

When the data is wrong. High school statistics are entered by coaches, volunteers and parents. They're imperfect, and pretending otherwise would be the least credible thing we could do.

Where we can verify a correction, from a coach, from a school, or from our own presence at a game, we correct the input and the correction doesn't expire. We don't adjust a player's final ranking by hand. Correcting an input makes the model right everywhere that input appears. Pinning a rank makes one number right and leaves the model wrong. Every correction is logged with its source, its date and its reason.

We're aware that a correction process rewards the people who use it, and that better resourced programs tend to be the ones who do. We would rather carry that problem in the open than carry wrong numbers quietly, and we go looking for corrections from the programs that never come to us.

Where these rankings fall short. Every ranking has limits. Most publications don't tell you theirs.

We have no usable statistics for Cedar Valley in 2025, so no Cedar Valley player appears on these boards. That's not a judgment on anyone there. It's a gap and you should know it exists.

For a small number of games no statistics were recorded at all, by anyone. We carried the performances we witnessed and verified ourselves, and we did not invent the rest. A handful of players are scored across thirteen games as a result.

Farmington and Weber did not record pass deflections in 2025. Their defensive backs and linebackers are therefore measured without a category the rest of the classification has, which understates them against it. We would rather name that than have it sit quietly inside a number.

Farmington also recorded no return yardage on any of its twelve interceptions. A return of zero yards is ordinary, roughly a third of interceptions and most fumble recoveries go nowhere, so a blank is usually a real zero rather than a missing number. Twelve out of twelve is not. Return yardage is real production, because a long return flips the field and hands an offense a short one, so those players are short credit they earned. We do not fill it in, because inventing a return is worse than missing one.

Our national championship weighting rests on a single game, because a single one exists.

Rankings separated by a fraction of a point aren't meaningfully separated. Read the tiers, not the decimals.

These boards measure production. They don't measure blocking, leadership, assignment discipline, or the corner nobody threw at.

Corrections

If you're a coach, player or parent and a number here is wrong, tell us. Send what you have and we'll check it against the source. If it's wrong we fix it, we log who told us, and the correction carries into every board that number touches.

What changed, and when

A ranking system that revises itself quietly is not one you should trust, so every version of this page and the engine behind it is logged here.

v6, August 10 2026. Began removing games between programs separated by roughly twenty times in the national rankings, and stated that exception next to the rule it qualifies. An earlier version of the same idea used a fixed gap in ranking places rather than a ratio, and it was removing competitive games while keeping genuine mismatches; it never published. Eligibility now counts games played rather than games scored. Corrected an overstatement about missing return yardage after measuring how often a return is genuinely zero.

v5, August 10 2026. Measured the stage weight again, this time after compensating each game for its opponent, and raised the deep round weight when the residual came back larger than the previous version assumed. Corrected a claim that overstated how far a fixed denominator protects against edited statistics. Added games played to every board. Added this log.

v4, August 10 2026. Applied an opponent strength adjustment for the first time, after finding that two seasons of tests had been built in a way that could not detect one. Cut the stage ladder and removed the early playoff rounds from it. Fixed a denominator that had been counting the games a player produced in rather than the games he played.

Earlier versions were internal and never published.