Fantasy leagues are competitive group chats
Fantasy football is the thing that kept sixteen friends talking after everyone began to scatter across the country, and it is now, besides weddings, the only reliable way to get everyone in the same room.
The problem is that a fantasy platform is built around the season you are currently in. It is not built to be a filing cabinet or to keep a group chat active year-round. Once a season ends, group chat activity dies down as we return to the mundanity of adult life. Records, rivalries, the trade everybody still argues about, all of it survives in the memory of whoever tells the story loudest and least accurately.
Optimized for Being Shared
I optimized for things worth screenshotting. Every feature had to survive one test before I built it: Would somebody paste this into the group chat to make fun of a friend?
Feedback from the league shaped nearly every feature: what people wanted to see, how they expected it to work, and what was not worth keeping. That process turned the site into a frequently used league repository, visited not only by league members but by their friends and families.
- 3
- leagues on one codebase
- 5
- seasons of history
- 16
- people, across 8 states
- 100+
- trades, filterable
Act one
The record
A full ledger of the entire league history, somewhere it can be found and argued about.
Money, in the language they already speak
Most of the league members work in finance. So instead of another standings table, everyone got a ticker. The earnings page is modeled after an exchange, a scrolling tape of the most recent year's results, a lifetime graph showing earnings, and a detailed ledger of every financial transaction for full transparency.
The ledger runs back to 2021 and nets every buy-in ever paid, which is the number most of them would rather not look at. Mine is $WILL, and you'll notice it's at the top.
Every Trade, Easily Findable
Every time a trade goes down, the whole league calls it a fleece, regardless of what it contains. Down the road, I want to add a Fleece Score so every trade carries a rating for just how lopsided it was.
Trades are the best content a league produces and the hardest thing to pull up in an instant. Every trade argument in our group chat starts the same way, with somebody reconstructing a deal from memory and getting the details horribly wrong.
Initially, I pulled in all trades, from most recent to oldest, separated by year, and figured folks could ctrl+F to find the trade they were looking for. Despite using it myself to locate a few trades, it didn't see much use until I got feedback from a few users and added the filter bar.
What people wanted this tool to solve was not seeing a list of every trade, but answering the important questions, like "how many times have I fleeced Adam?"
Ammunition
Head to head gets screenshotted more than anything else on the site. It was also the first and least sophisticated thing I built. Unsurprisingly, I built it to settle an argument.
What people came for is discovering the interesting matchups. Finding out you're undefeated in a rivalry going back six years, or that you've only beaten someone once, is a delight. It also surfaces the closest game the two of them have ever played, and a stat I called Certified Hater: the player on the other roster who has personally scored the most points against you. I built it to prove Kyren Williams had a grudge against me, and instead found out, embarrassingly, that Justin Fields is my true archenemy.
Now you can ensure pre-game trash talk is backed by verified data, which makes it all the more delicious.
Act two
The engine
Driving engagement through product design, one checked out member at a time.
Manufacturing an event
College football has a ritual. The AP Poll drops, and for the next 24 hours everyone argues about it. Fantasy has no equivalent. That is especially true in dynasty leagues, where roster construction can make some managers' seasons feel decided before Week 1. We used to rely on automated power rankings. They had their merits, but the real breakthrough was letting the league vote.
Every manager ranks all fourteen teams, ballots close, and the poll publishes with movement arrows against the previous one. Ranking fourteen teams is genuinely tedious, though, and a ritual nobody finishes is not a ritual. Three things fixed completion.
- The ballot uses drag-to-rank and works smoothly with a thumb, because it usually gets filled out on a couch or on the toilet.
- Selecting or hovering a team opens a quick preview beside the ballot, so ranking stays painless instead of forcing a trip off the page to check a roster and lose focus.
- An open poll announces itself across every page, showing how many ballots are in and linking directly to the ballot.
None of that was right the first time. Before the poll went to the league I put the build in front of a handful of the die-hards, the people who would use it every week, and let them pull it apart.
Too much on screen at once, came back one reply, and why not publish a top seven the way college football does. Someone else caught that the ballot counter read 1 of 14 when the league has fourteen teams but sixteen people, because two franchises are co-owned. Both went in. The published poll is a top seven now, sitting under the full chart rather than replacing it, and the counter reads out of sixteen.
The bar is dismissible and remembers that you dismissed it. Showing the count rather than the deadline is what moved the needle, because nobody wants to be the last one in.
Reengaging the people who tuned out
Every league contains members with varying levels of fantasy enthusiasm. Our leagues are no different: in keeper, we had several managers who went four years without ever setting their keepers before the draft.
The easy read would be that they did not care, but the real reason was simpler and more fixable. The keeper rules are eight accumulated bylaws covering cost basis, consecutive year limits, undrafted players priced off end-of-season ADP, and what happens when you do not hold the pick you need. Working out whether you were even allowed to keep someone took twenty minutes, and there was still a decent chance of being wrong.
The Keeper Assistant reads your roster and answers the question. Pick your team and it shows every player you own with their cost basis, the round they would cost next year, how many consecutive years they have already been kept, and a plain yes or no for keeper eligibility.
Every manager set full keepers for the first time in league history the year it rolled out. It's the only feature I've shipped where I could name who it was for before I wrote a line of it.
Act three
The Evolution
How the site went from a blog nobody opened to something we can't imagine playing without.
The mark
The Bev Fantasy wordmark was designed by Peter Coluntino, a graphic designer, friend, and league mate. The brief I gave him was a mockup I had thrown together myself, pictured here: our old high school panther, the word FANTASY in a typeface I would rather not defend, and an offer, or really a plea, to ignore all of it.
When I work with artists, I prefer to let them cook, then respond to the work in front of me with clear, actionable feedback. I usually begin with a strong vision, but visions are never brought to life alone. The more people who bring their passion and ideas to a project, even when those differ from my original vision, the stronger the result. The most effective way to deliver quality results is through friendly, passionate collaboration with talented people.
How far it's come
Before Bev Fantasy, we had several other fantasy leagues throughout our childhood on various platforms but no dedicated site. I started the keeper league in 2021, moved to Sleeper, and built the original site that same year using a free hosting service. In 2023 (after winning and wanting to use some of the pot to invest back in the league with an official domain), I built the first version of BevFantasy.com and have been iterating on it ever since.
The site now refreshes from Sleeper's API every night, so its history and transaction log stay current without anyone maintaining them. Three leagues share one codebase, and adding a fourth takes one config file.
The blogs were fun to write, but the time and energy to write them evaporated as I got older. Automated stat tracking, convenient tooling, and visually interesting and useful graphs have done a much better job of keeping engagement high without giving me arthritis.
What's next
There's a running list of future feature ideas from the league and me. The leading candidate is a legacy section: pulling in as much league history as I can recover from old platforms and past seasons to fill out our metrics even further. I've also thought about open-sourcing a templated version of the site, with walkthroughs for other leagues to run their own.
We're also experimenting with a new guillotine league side pot this year, so I'll be adding some special features for that once it gets going. My paramount priority this year, however, is defending my title 😤