Case study

Plainville Indoor Sports Arena: one platform for scores, stats, payments and members

A community hockey arena that has been running leagues since 1991 needed its website, scoring, payments and member communication to work together. I built the public website, the admin panel behind it and the newsletter system, all running on the arena's own live data.

Visit the live site: plainvillearena.com ↗

  • Next.js and React
  • MySQL live data
  • PayPal payments

The challenge

The arena's website and admin tool were built on older technology. Players, parents and staff needed more from one system.

For players and parents

Find schedules, scores, standings and personal stats quickly, on a phone, without calling the front desk.

For the front desk

One admin panel to run seasons, divisions, schedules, scores, members, payments and news, instead of juggling separate tools.

For the business

Take payments online, reach the right people by email and see what is working.

What I built

Everything runs on the arena's live database, so a score entered once shows up everywhere.

Live scores and standings

Schedules, final scores and division standings by season, always current. A live status shows games in progress, and an auto-rotating TV scoreboard runs on the rink screens.

Player and team stats

Searchable player pages, league leaders, team stats and season insights, with stat history loaded from 2009 onward.

Online payments

Members pay team and league fees online through PayPal and see their payment history. Gift certificates are sold online as well.

Member accounts

Adult and minor registration with waiver, member login, profile editing, payment history and a personal player calendar.

Newsletters and campaign analytics

Send to all members, adults, minors (via parents), free agents or specific seasons. Schedule sends, stay within an hourly sending limit and see who opened and clicked.

Admin panel

One secure panel for seasons, divisions, schedules, scores and stats entry, members, free agents, payments, news, gallery, programs, newsletters and site traffic.

Schedule builder

Seasons, divisions, weekly slots, skipped dates and bye weeks combine into one master schedule that feeds the website, scores, rink TV and printed lists.

Scoring on the iPad

Scorers use a simple, restricted login. Update Score takes seconds per game, and a touch-friendly game-by-game screen for goals, assists and penalties is in preview. No paper score sheets to copy out.

The hardest part: building the schedule

Every season is a puzzle of combinations. A season holds nearly twenty divisions, and each division has its own teams, start date, number of weeks, weekly playing slots (day, time and rink) and skipped holiday dates, with bye weeks when teams are uneven. Every game is one combination of season, division, team pairing, date and slot, and the arena runs 6 to 10 sessions and games every day across all divisions. The platform keeps it consistent: each division's schedule is combined into one master schedule per season, sorted correctly around the noon AM/PM edge case, filterable by rink, printable per division or location, and linked to scores and standings.

How a season schedule is builtA season splits into nearly twenty divisions. Each division has teams, a start date, a number of weeks, weekly slots by day, time and rink, skipped dates and byes. These produce games, which are combined into one master schedule that feeds the website, scores, the rink TV and printed lists.SEASONDIVISIONSRULES PER DIVISIONGAMESMASTERSeasone.g. Fall 2026many seasons,kept as historyBRDDRE1RF1F2RPARP+ about 12 morenearly 20 divisionsTeamsseveral per divisionStart date + number of weeksper division, not per seasonWeekly slotsday × time (AM/PM) × rinkSkipped datesholidays and closuresBye weekswhen team counts are unevenWed 7:00 PM · F2RTeam A vs Team BWed 8:00 PM · F1Team C vs Team DThu 6:00 PM · RPTeam E vs Byeseason × division× pairing × date× slot × rinkMasterscheduleall divisionscombined, perseason and rink6 to 10 sessionsand games a dayWebsite schedules + calendarLive scores + standingsRink TV scoreboardPrint by division or rinkOne change in the rules ripples through every game, standing and screen that depends on it.
  • Rules are set per division, so a division can start late, run fewer weeks or skip a holiday without touching the others.
  • Bye weeks and blank rows are handled, so master lists and printouts stay clean.
  • The same data drives the calendar, the scoreboard, the standings and the printed schedules.

Scoring at the rink, on an iPad

Scorers have their own restricted login that shows only three things: the season calendar, Update Score and Game-by-Game Stats Entry. Both tools are designed for an iPad at the scorer’s table: big buttons, one job per screen, and nothing to type that can be tapped. Results are entered once, where the game happens, so there are no paper score sheets to copy out later.

Update Score

In use
  • One button in the top bar of every screen, so a score is never more than a tap away.
  • Shows the day’s games grouped by league. Type the two scores for each game.
  • One Modify button saves the whole night at once.
  • The website, standings and rink TV pick the new scores up within about a minute.

Game-by-Game Stats Entry

iPad preview
  • Pick the day, the division and the game. Each team has big Goal and Penalty buttons.
  • A goal takes a scorer, up to two assists and a power-play, short-handed or empty-net tag. A penalty takes a player and minutes.
  • Shots on goal and goalie shots and goals against are simple steppers. Wins, losses and ties are worked out from the score.
  • Every event goes into a log with Undo, and the draft saves itself on the iPad.

Preview: drafts stay on the iPad. Sending final stats into the system is the next step.

Update ScoreWed, Oct 21 · Fall 2026
Tonight’s games
6:00 PM
F2
Team A
4:3
Team B
7:00 PM
F1
Team C
2:2
Team D
8:00 PM
E1R
Team E
6:1
Team F
9:00 PM
F2
Team G
:
Team H
Modify
Saves the whole night in one tap

Update Score: quick results for every game of the night

Game-by-Game Stats EntryDraft saved 8:42 PM
‹Wed, Oct 21›Today
F2F1E1RRP
7:00 PM · Team C vs Team D2 – 2
Team CTeam DLogDetails
Goal
Penalty
Shots on goal
−14+
Goal · Team C — #12, assists #7 and #9Undo
Penalty · Team D — #4, 2 minUndo

Game-by-Game Stats Entry: tap Goal or Penalty, then the player

Illustration of the scorer’s iPad screens. Team names and scores are examples.

A look inside

Screenshots of the live public pages. The admin panel and member data are private.

Scores page of the Plainville Indoor Sports Arena website with season analytics
Final scores with season analytics, scoring leaders and team rankings
Standings page of the Plainville Indoor Sports Arena website
Division standings by season, with team stats and goals-against average
Monthly game calendar of the Plainville Indoor Sports Arena website
The scheduling calendar: every published game by month, with the number of games each day
Player statistics page with league leaders
Player search and league leaders for points, goals and assists
Arena TV scoreboard showing recent results
The rink TV scoreboard: recent results, up-next games and a live clock
Gift certificate page with PayPal checkout
Online gift certificates with secure PayPal checkout

Built with

A modern stack that is fast, secure and easy to extend.

Next.jsReactTypeScriptNode.jsMySQLTailwind CSSPayPalREST APIsSecure admin login

What the arena gets today

  • One system instead of several separate tools
  • Scorers enter results on an iPad at the rink, with no paper score sheets to copy out later
  • Scores entered once appear on the website, standings and rink TV
  • Members register, pay and update their details themselves
  • Newsletters sent to the right group, on schedule, with open and click reports
  • Fast pages that work on phones
  • A secure admin panel the staff can run without a developer