A box league app built for how Billingshurst actually plays
Billingshurst Tennis Club outgrew off-the-shelf league tools. So I built their own: players check their box and put scores in from the court, and admins run the whole season from one place.

160+
Club members with an account
5
Competitions: singles, doubles and mixed
2
Views: one for players, one for admins
Live
In use at the club and still growing
Box leagues are simple on paper. Put players in small groups, everyone plays everyone, then the top of each box moves up and the bottom moves down. Keeping that running for a whole club on spreadsheets, email chains and someone else's software is the hard part.
Billingshurst Tennis Club had tried the off-the-shelf route and kept hitting its limits. I designed and built them a web app of their own, shaped around how the club runs its seasons, and it is still growing as the club asks for more.
The screens on this page are from the latest version, running on a demo club with made-up players. No real member data is on show.
01 · The problem
Off-the-shelf tools ran out of road
A box league only works if the standings are current and everyone knows who they still have to play. The platforms the club tried could hold a table, but they locked Billingshurst into someone else's way of running a season.
From the court to the table in one form
Most scores go in on a phone straight after the match, so the player side is short and obvious. Here is a player's week.



Player profiles
Every player gets a record worth checking
Tap any name to see how they are doing this round, built from the results already on record.

03 · For club admins
The whole season from one sidebar
Admins get a Manage section that members never see. It opens on what needs attention this round, and every tool a season needs is one click away.

Boxes and players
Drag a player, and their record follows
Moving someone between boxes is a drag and drop. Their results move with them, so the tables stay honest. Members not in a box yet wait in their own searchable column.

Score manager
Fix a result without breaking the table
Editing a score takes the old result off both players first, then applies the new one, so points, sets and net games are always worked out from scratch rather than patched.

Build a box in six plain steps
Ladder position, promotion, format, players, dates, confirm. Adding a box never shuffles the others unless you say so.
Close a round in two steps
Finish the round to store it and move players up and down, then start the next with fresh fixtures.
Players fix their own results
With a clear before and after of what the edit changes, so admins aren't the bottleneck.
04 · History
Every round remembered
Finished rounds save themselves. Round history keeps the last ten tables, and the champions board keeps every box winner for good, so there is always an answer to who won Box 1 last spring.



05 · Make it yours
Each competition can wear its own colours
Admins pick from tested light and dark themes or set custom colours. Every text and background pair is checked against WCAG AA contrast before it can be saved, so the standings stay readable whatever the club chooses.
Baseline BlueMen's Singles
ClayLadies Singles
06 · Outcomes
One place for the whole club
Ready for other clubs
Same product. Your club's colours.
This is a finished product, not a redesign from scratch for every enquiry. It can be rolled out for other tennis clubs with their own colours, logo and competitions.
Under the hood
Technical notes
A React front end with signed-in player and admin roles, hosted on Netlify. It is built phone-first for score entry after a match and roomy enough on desktop for running a season. Auth, roles and league state are treated as first-class, because those are the parts that usually break a quick spreadsheet replacement. Result edits recalculate from scratch, and finished rounds are stored automatically, so the numbers never drift.
Need an app that fits how you work?
Web and mobile apps from £450 at the 2026 rate. Fixed quote in writing, reply within one business day.
