Skip to content

League setup walkthrough

Set up your water polo league, step by step.

A guided walkthrough from an empty admin panel to a live spectator page, with Google Sheets write-back that syncs itself. Designed for a first-time league admin. Read top to bottom. It takes about 30 minutes to complete.

  • 10 steps, about 30 minutes
  • Auto-schedule a season
  • Google Sheets write-back

Subscribe and open

Pick a league plan, then open the Leagues tab in the admin panel. It is your launchpad for the whole season.

1Subscribe to the league plan

Open admin.eggbeater.app and sign in with the account that owns your club: Google, Apple or an emailed sign-in link. Click Purchases in the sidebar (under Club) and pick the right plan for your league:

  • Club League, $99/season. Every team belongs to your club. Run an internal or rec league.
  • Multi-Club League, $249/season. Teams from multiple clubs (regional leagues, cross-club competitions). Unlocks every Club League feature plus visiting-club spectator access and cross-club standings.
  • Both live under “Add more”. Hit Upgrade and Stripe Checkout opens in a new tab. Cancel anytime. The subscription is per season, not annual. Once payment clears, the plan moves up into the Active card with a green badge.
If you are unsure which league plan to buy, start with Club League. You can upgrade to Multi-Club in the middle of a season without losing data. Eggbeater promotes the same league package to the higher tier.

2Open the Leagues tab

In the admin sidebar, click Leagues. With no league yet, the tab offers one primary action and one fallback:

  • Create a league: opens the four-step wizard. This is the path for a brand-new season.
  • Already have one? Paste a share code and hit Restore to adopt an existing league onto this club.
  • Once a league exists, the setup actions add Import from Sheet (pull a schedule from Google Sheets), Import league JSON (a complete config, used for migrations and seed scripts), Edit league, Build Playoff Bracket and Generate Next Round.
  • Live Dashboard, Live Game Console, Standings, Player Stats and Past Leagues fill in as you complete the next steps.
Heads up: the Director tab in the sidebar is for tournaments. When this club has a league configured, Director shows a banner pointing back here. Do not try to manage a league from the Director tab.

The wizard and rosters

Create a league takes four steps in one modal. Teams go in as you create. Rosters come afterwards.

3Run the wizard

Click Create a league. Four steps, and you can go back at any point. It is a modal, not a saved draft, so finish it in one sitting.

  • Step 1, League: the name (for example “Bay Area Adult Water Polo League”), a season label (for example “Spring 2026”), and the tier. Multi-Club is what lets a visiting club import your share code.
  • Step 2, Divisions & teams: at least one division, teams one per line. A running count under each box tells you how many it has read.
  • Step 3, Format & schedule: pick from six formats, then give the season dates, times and courts (see step 5 below).
  • Step 4, Rules & publish: points, tiebreakers, when standings appear, and the director scoring password. It opens with the real game and week count so you know what you are committing to.
  • The league ID is derived from the name. The share code is minted for you. It is not something you choose.
There is no separate “publish” click at the end. Create & publish league writes the season and puts it live in one action. Publish / Refresh League afterwards is how you push later changes.

4Add rosters

Teams are only names at creation time, which is enough to build a schedule and standings. Player rosters load afterwards, on the Leagues tab:

  • League Rosters card: paste a CSV with columns Team, Cap #, First name, Last name (and optionally Division).
  • Google Sheets link: pull directly from a tab in the same sheet that holds your schedule.
  • Roster entries flow into: the Alignments writeback (link to club-cap player photo columns), the cap number to name lookup in the edit modal for each game (so you do not have to remember who #11 is when entering scores), and the player-stat aggregator for W-T-L attribution.
You do not need rosters to start playing. Scores, standings and the public page all work on team names alone. Add players when you want stats for each player.

Schedule and phases

Generate a schedule from a weekly preset or import one from a sheet. Then segment your season into phases.

5Pick a format, then date it

Step 3 of the wizard is format and schedule together. Six formats, all generated for real before you commit:

  • Round-robin: every team plays every other once. The default, and what most leagues want.
  • Weekly pods: small pods each week instead of a full round-robin. Set the pod size and how many weeks.
  • Swiss (round 1): pairs the opening round only. Later rounds come from Generate Next Round, seeded on actual results.
  • Single elimination: a seeded knockout, optionally with a third-place game. Teams seed in the order you typed them.
  • Double elimination: a loss drops you to the lower bracket, not out.
  • Pools to bracket: pool play first, then the top N of each pool into a knockout.
  • Then the dates: a first game day, a first start time, a slot length and your courts. Week N lands 7 days after week N-1, and games fill every court at one time slot before the clock advances. Two pools halve your game day. They do not double the calendar.
Already have a schedule? Skip the generator and use Import from Sheet in the setup actions: paste the sheet link or CSV, map the columns (Eggbeater detects most standard headers), preview, import. The column mapping is saved for next season.

6Phases, once you have more than a regular season

A league created by the wizard is a single regular season, which is all most need. Phases appear when you add a playoff round (Build Playoff Bracket tags its games) or when you import a config that declares them. They exist so standings and stats segment correctly. Each phase has:

  • ID: a slug (regular-season, playoffs)
  • Name: a display label (for example “Regular Season”, “Playoffs”), in your league’s working language
  • Type: regular, playoff, preseason or exhibition
  • Counts toward standings: true for regular and playoff, false for preseason and exhibition
  • Each game has a phase field. Use a game’s Edit button to change which phase it belongs to, or mark a game as exhibition so it does not count toward standings.
What you will see: on the standings card, the phase pills (All phases / Regular Season / Playoffs) let the spectator filter the standings to that phase only. The same applies to the Player Stats card.

Publish and sync

Set your points policy and tiebreakers, publish to spectators, and mirror the whole season to Google Sheets.

7Points, tiebreakers and when standings appear

Step 4 of the wizard. The defaults are sensible (3 for a win, 1 for a tie, 0 for a loss, a shootout win worth 2 and a shootout loss still earning 1), so most leagues read them and move on. Change any of the five boxes if your bylaws differ. Tiebreakers resolve equal points top to bottom. Reorder them with the arrows or switch one off entirely:

  1. Points
  2. Wins
  3. Head-to-head record
  4. Goals against (fewer is better)
  5. Goals for
  6. Goal differential (capped at ±10 per game)
  7. Team name (alphabetical)
Hide standings until week N sits on the same step. Leave it at 0 and the table appears with the first result. Set it to 3 and spectators see nothing until week 3 has a final, which is useful when an early table reads worse than the league actually is. Whatever you choose applies consistently across every standings view.

8Publish to spectators

Creating the league already publishes it. Afterwards, the Publishing card’s Publish / Refresh League pushes any later change: a new result, an edited team name, an imported schedule. Either way Eggbeater:

  • Mints a 6-character share code (for example LWPL26). It is generated for you, not chosen
  • Activates a public spectator address: app.eggbeater.app/?join=league-{code}
  • Generates a search-friendly landing page at /leagues/{your-slug}/
  • Shows your club’s name and logo on the spectator page
  • The spectator page detects the league’s display language and switches the interface to match. French leagues land in French, Spanish leagues land in Spanish.
Publish again anytime. Posting updates to the schedule or roster does not change the share code. Visitors keep using the same link.

9Export to Google Sheets

On the standings card header, click Export to Sheets. The first time, you grant Google Sheets access through Google’s sign-in. After that:

  • Eggbeater creates a new workbook in your Drive (titled with the league name and season)
  • The initial export populates about 7 tabs: League Overview, Master Schedule, Standings (combined and per division), Player Stats and a Game Sheet for each game
  • Additional tabs land on later exports as data accumulates: roster plus stats, player stats per phase, career totals, archives, and one game sheet per played game
  • Auto-sync: every finalized score syncs to Google Sheets within a few seconds, with no manual export needed. Use Re-export to refresh the tabs in place.
For leagues migrating from a spreadsheet: Eggbeater’s workbook is designed to mirror your original league-sheet structure (master schedule, rosters with stats, player stats per phase, career totals, scoresheets for each game) so admins can run Eggbeater alongside their existing sheet during the migration period and verify the numbers match.

Score game 1

Three paths to record a score: live from the desk, final only, or backfilled from a paper scoresheet.

10Score your first game

Three paths to record a score:

  • A. Live scoring during the game. The scorer at the desk opens app.eggbeater.app on a tablet and taps Score this game (no code, no game-picking), then starts the clock. Tapping Goal, Assist, Save and so on logs events with the cap number and timestamp. Button labels render in the league’s display language (English, Spanish or French) automatically. Spectators see updates within 5 seconds, and standings re-rank live.
  • B. Final score only. In the admin’s Live Game Console, type the final score in each team’s input and click Save. The game flips to FINAL and syncs the score to the Google Sheets workbook within 5 seconds.
  • C. Backfill events from a paper scoresheet. Click Log on the game tile, then enter events one at a time (period, time, cap color, team, cap #, action, position). Each submission appends to the game’s action log and refreshes the scoreboard writeback tab for that game. Before flipping a game to FINAL, fill in the two referee names through Edit. Eggbeater warns when the referees are missing on a non-exhibition game.

When you finish step 10, your league is published.

Your dashboard syncs itself, and your spectator page is live. Need the deeper references? Print the one-page Quick Start, or read the full League Builder guide.