Key takeaways
- Never let it act alone. Mine reads my league and never touches my roster; every add, drop and lineup move is still mine.
- Make it show its work, then make it grade itself. A projection with a reason I can argue with beats a bare number.
- Chase volume in September, confirm with touchdowns in October. Carries plus targets at Week 3 predict future touchdowns better than touchdowns do at Week 6.
I’ve played fantasy football for longer than I’m willing to admit. I’ve won leagues and I’ve lost them. In a standard Yahoo league I’ve been in since the Stone Age, one thing has held up: find the players who keep scoring touchdowns, and you win. The catch is that it takes until about Week 6 before those trends are worth trusting.
This season I tried something new. I built a bot to do the weekly grunt work in my main league, a Yahoo league I started that pays 1 point per yard, including return yards, and uses individual defensive players (IDP). The bot pulls the stats, checks who’s available, projects matchups and flags injuries. I make the calls.
I created that league as a reaction to the standard one. In a point-per-yard league, you see a player’s actual output, unfiltered: every yard counts, whether it’s a catch, a run or a kick return. Adding individual defensive players gives advanced players more to manage.
Here’s what building the bot taught me, including the parts where I overruled it and the one time the data proved me right.
Teaching it my league
A bot that doesn’t know your scoring is useless. Mine is different by design: 1 point per yard, 6 per touchdown, 5 per first down, 15 per solo tackle, 10 per assist. A middling quarterback scores 250 a week.
The bot didn’t have my settings file at first, so it worked the scoring out backward. It took the points in my last report and solved for the rule that produced them. It matched my offensive numbers within about a point and my defensive numbers within about three. That was close enough to work with until it could read the real settings.
Then it needed to know who’s available. Yahoo’s official developer access went nowhere; I signed up and never heard back. Instead, the bot reads the league’s player pages through my own signed-in Chrome browser. It’s read-only by design: it never adds, drops or changes a lineup. One sync pulled all 325 rostered players in a couple of minutes. Everyone else is a free agent.
That list is the backbone of every waiver recommendation. If it’s stale, the bot recommends players who are already gone.
The matchup brain
Next I wanted something I used to get from old matchup columns: each offense set against the defense it’s facing, with a reason behind every projection.
All of it runs on free public NFL data from the nflverse project: weekly player stats, play-by-play, snap counts and Vegas lines. For every game, the bot builds:
- Team vs. team: pass and run efficiency against what the other defense allows, plus pace and pass rate.
- Points allowed by position: adjusted for the offenses each defense has already faced, so a team doesn’t look tough just because it played three bad offenses.
- A projection with its reasons: a recent-weighted scoring average, nudged by the matchup and the team’s Vegas implied total. Each line explains itself: “19% target share, aDOT 12.1, opponent ranks 27th in WR points allowed.”
- Matchup flags: a deep threat against a defense that gives up deep balls, a tackle-machine linebacker against a run-heavy offense, a returner against a team that scores a lot (more kickoffs to return).
Then I made it grade itself. I ran the model on Weeks 3 and 4 as if they hadn’t happened yet and compared it with what actually did. The matchup adjustment barely helped. It improved running back, quarterback and defensive back projections a little and made tight end and kicker projections slightly worse. Three or four games of defensive data are noise.
I kept it anyway. Its value this early isn’t the number; it’s the reasons and the flags. The math should earn its keep as the sample grows.
Where I overruled it
The bot is good at math. It’s not good at football context, so a person still matters.
Four examples from one week:
Injury feeds lag. The free injury data runs days behind the news. It once missed a season-ending ACL tear for about three days. So every name the bot recommends gets a fresh news check before I act. That week it caught a waiver target with a season-ending ankle fracture and a starter who would miss weeks with knee and ankle sprains. Neither was in the feed yet.
It underrated DJ Moore. The model had him at 65.8 points a game, the worst receiver on my roster. I said he was just getting in sync with his quarterback. The game logs showed two games where he got hurt early. In his two full games he averaged about 120 points with nearly a third of the targets. The bot now tracks games cut short and shows a full-game average beside the season average. It doesn’t throw those games out; it makes me look at them.
Kick returners. In a league that pays for return yards, a full-time returner can outscore most wide receivers. I’ve never trusted them. The bot checked last season: the top 12 full-time returners were about as steady week to week as receivers scoring at the same level. They actually had fewer bad weeks. KaVontae Turpin never had a true dud. The real risk is losing the job, not a bad Sunday. I’m starting one returner this week, not two. Trust gets earned.
My defensive rules beat its projections. On defense I grab the top free agent first, and I want players in the top 10 at their position all season, top seven by the playoffs. Defensive players get hurt; it’s a long season. I also weight tackles plus assists over big plays, because tackles show up every week and interceptions don’t. When the bot’s projection liked a cornerback who’d piled up three interceptions, the season rankings and tackle numbers pointed elsewhere. Now the report shows both views side by side.
Testing my touchdown theory
My touchdown theory comes from that standard Yahoo league, not the point-per-yard one, where a touchdown is worth just 6 points next to hundreds of yards. I asked the bot to test it: find the guys who score touchdowns, and wait until about Week 6 to trust it. It ran five seasons (2021-25) of running backs, receivers and tight ends. For each cutoff week, it checked how well early-season numbers predicted touchdowns per game for the rest of the season.
| Through week | Early TDs per game predict rest-of-season TDs | Early touches + targets per game predict rest-of-season TDs |
|---|---|---|
| 3 | 0.38 | 0.61 |
| 5 | 0.45 | 0.60 |
| 6 | 0.47 | 0.59 |
Correlation, 0 to 1; higher means a better predictor. About 200-260 players a season.
The Week 6 instinct holds up. Early touchdown counts get steadily more trustworthy, and by Week 6 they’re about a quarter better at predicting the rest of the season than they were after Week 3.
But there’s a faster signal. Volume (carries plus targets) predicts future touchdowns better at Week 3 than touchdowns themselves do at Week 6. The players who keep scoring are the ones who keep getting the ball. So I’m not changing the theory, just when I act on it: chase volume in September, and confirm with touchdowns in October.
What I’d tell anyone building one
- Never let it act alone. Mine reads my league and never touches my roster. Every add, drop and lineup move is still mine.
- Check the news yourself, every time. Free injury data is days behind. The bot now searches the news on every name before it recommends one.
- Make it show its work. A projection with a reason I can argue with beats a bare number.
- Make it grade itself. Mine admitted its matchup math barely helps yet. I trust it more for saying so.
- Teach it your rules, and keep your gut. It now tracks games cut short, ranks free agents by season standing and tackles, and checks returners’ track records. Each of those came from me disagreeing with it.
Next up: a Sunday-morning email with final injury news before lineups lock. I’ll find out this weekend whether the bot or I had the better week.