Shoulda Started

Sample report

One real league, one bad Sunday

This is what Shoulda Started makes from a Sleeper league. The league is real: 12 teams, half PPR scoring, the full 2025 regular season of 14 weeks. The player names and every point are real too. Only the managers and team names are replaced (Team 1 to Team 12), so nobody in the league is singled out.

Everything below was worked out by the same code that runs when you enter your own Sleeper username, from the same public data Sleeper shows every league member. Nothing is estimated and no projections are used: only the points players actually scored.

Run it on your league

Team 6

Week 8 Sample league (2025) Sample

LOSS

95.7 - 139.2

Best lineup: 142.3

  1. Unnecessary roughness

    Benched R. Harvey (23.6) for A. Kamara (5.5)

    -18.1

  2. Holding

    Benched A. Rodgers (16.8) for B. Mayfield (4.1)

    -12.7

  3. Illegal formation

    Benched I. Davis (15.4) for I. Pacheco (5.8)

    -9.6

  4. More flags

    2 smaller lineup calls

    -6.2

  • BENCHED THE WIN The win was on your bench the whole time (46.6 pts).
  • BENCH TAX: OVERDUE 46.6 points left on the bench at 67% efficiency.
Bench tax
46.6
Efficiency
67%
All-play
2-9
Shoulda Started Data from Sleeper. Not affiliated.

The costliest bench of the season

Of every lineup set in this league all year, this is the one that left the most points where they could not count. In week 8, Team 6 scored 95.7. The best legal lineup from the same roster would have scored 142.3. The difference, 46.6 points, is the bench tax.

That gap decided the game. Team 6 lost 95.7 - 139.2, and the best lineup would have won it. That is why the receipt carries the stamp it does.

The biggest single call: R. Harvey scored 23.6 on the bench while A. Kamara put up 5.5 in the lineup. Every flag on the receipt is one real swap that would have kept the lineup legal, and the flags add up exactly to the bench tax.

How to read the receipt

  • Result and score are the real head-to-head game, exactly as Sleeper recorded it.
  • Best lineup is the highest score the roster could have posted that week, filling every slot (including FLEX) only with players eligible for it.
  • Flags are the individual start/sit mistakes, biggest first. Smaller ones are rolled into one line so the receipt stays readable.
  • Efficiency is points scored divided by best possible points. All-play is the record this score would have had against every team that week.

Week 8 in flags

Every week page opens with the league's awards. They are worked out from scores alone, so they are the same for everyone in the league and nobody can argue the math.

  • High score Team 2 157.7 points
  • Low score Team 5 80.5 points
  • Biggest blowout Team 2 won by 65.8
  • Closest game Team 11 won by 12.3
  • Robbery of the week Team 11 won with only 108.0 (5 teams scored more)
  • Unluckiest Team 8 lost with 99.8, the #7 score
  • Bench Tax champion Team 6 46.6 points left on the bench

Every team in week 8

The whole league that week, sorted by bench tax. The average team left 13.3 points on its bench. One loss would have been a win with the best lineup. A bench tax of zero is possible but rare: it means every start/sit call was right.

TeamResultPointsBest lineupBench taxEfficiencyAll-play
Team 6Lost*95.7142.346.667%2-9
Team 5Lost80.5117.436.969%0-11
Team 10Won126.9152.525.683%8-3
Team 4Won118.3133.515.289%7-4
Team 11Won108.0119.711.790%6-5
Team 2Won157.7168.911.293%11-0
Team 3Lost95.7101.86.194%3-8
Team 7Lost91.896.34.595%1-10
Team 12Lost97.499.01.698%4-7
Team 8Lost99.899.80.0100%5-6
Team 9Won139.2139.20.0100%9-2
Team 1Won144.4144.40.0100%10-1

* Lost, but the best lineup from the same roster would have won.

The 2025 season, settled

Win-loss record says who won. The season report says how. Across 14 regular season weeks the league left 2424.5 points on its benches, and 21 losses would have been wins with the best lineup.

TeamRecordAll-playExpected winsLuckBench taxEfficiencyLosses benched
Team 412-2113-4110.3+1.7161.491.5%2
Team 1211-3104-509.5+1.6271.786.8%1
Team 99-5107-46-19.8-0.8176.390.9%0
Team 29-590-648.2+0.8219.488.7%1
Team 108-679-757.2+0.8119.693.0%1
Team 37-785-697.7-0.7167.790.5%3
Team 86-886-67-17.9-1.9189.289.5%1
Team 116-867-876.1-0.1242.986.3%3
Team 16-858-965.3+0.7192.588.5%2
Team 75-970-846.4-1.4234.286.8%3
Team 63-1146-1084.2-1.2179.088.6%3
Team 52-1218-1361.6+0.4270.679.4%1

Luckiest

Team 4 went 12-2, but its weekly scores were worth about 10.3 wins against an average schedule. That is +1.7 wins of pure scheduling.

Unluckiest

Team 8 went 6-8 with an all-play record of 86-67-1. Its scores deserved about 7.9 wins.

Best lineup setter

Team 10 started its best possible lineup more often than anyone, scoring 93.0% of its possible points.

Most points benched

Team 5 scored 79.4% of its possible points and left 270.6 on the bench over the season.

How the numbers are worked out

Bench tax compares the lineup a manager set against the best legal lineup from the same roster, after the games are played. It is a hindsight number by design: nobody can start the perfect lineup every week, but over a season it shows who keeps leaving points on the table. More in the guide to lineup efficiency and bench tax.

All-play plays every team against every other team, every week. Over a season that is 154 games per team instead of 14, which makes it a far steadier read on team strength. See the guide to all-play record.

Expected wins and luck turn each week's all-play share into the wins an average schedule would have given. Luck is actual wins minus expected wins: positive means the schedule helped. The guide to schedule luck walks through an example.

Your own league also gets FAAB return (what each waiver dollar bought in started points) and trade receipts (who won each trade by the points both sides actually started). They are left out here because they need the league's full transaction history.

Now do your league

Enter a Sleeper username or league ID and you get this for every week of your season, plus a receipt for each team you can save as an image and drop in the group chat. It is free, needs no account, and reads only public league data.

Get your penalty report