Section 1
Competition Lifecycle & Statuses
Every competition moves through these states. Each state changes what the admin sees and can do. Playtomic has a simpler model — Field needs more states to support Draft mode, check-in, and post-event flows.
DRAFT
→
REGISTRATION_OPEN
→
REGISTRATION_CLOSED
→
CHECK_IN
→
IN_PROGRESS
→
COMPLETED
CANCELLED
(can be triggered from any state except COMPLETED)
| Status | Trigger | Admin Can Do | Player Can Do | Playtomic Equivalent |
| DRAFT |
Admin saves as Draft in wizard |
Edit everything, Open Registration, Delete |
Nothing — invisible to players |
N/A — Playtomic has no Draft |
| REGISTRATION_OPEN |
Admin opens registration or wizard publishes directly |
Edit details, Add/remove players manually, View registrations, Close registration early |
Register, pay, view landing page, cancel registration |
Session created (enrollment period) |
| REGISTRATION_CLOSED |
Deadline passes (relative or fixed) OR admin closes manually |
Add walk-in players, Remove players, Start check-in, Generate first round |
View details, cannot register (waitlist if enabled) |
"Enrollment ends" countdown reaches zero |
| CHECK_IN |
Admin clicks "Start Check-In" (event day only) |
Check in players (QR or manual), Add walk-ins, View check-in progress, Close check-in & start |
Scan QR to check in, self-check-in in app |
N/A — Playtomic has no check-in |
| IN_PROGRESS |
Admin clicks "Close Check-In & Start" or "Generate First Round" |
Generate rounds, enter scores, manage matchups, view leaderboard, share matchups, fullscreen TV mode |
View matchups, enter scores (if player-side entry enabled), view leaderboard |
"Create matchups" → active tournament |
| COMPLETED |
Admin clicks "Finish Competition" after last round |
View final standings, export results, view analytics, repeat/clone competition |
View final standings, see recap card, share results, view rating change |
"Finish competition" → podium + leaderboard |
i
Playtomic difference: Playtomic effectively only has 3 states (enrollment open → matchups created → finished). No Draft, no Check-In. The CHECK_IN state is a Field-only innovation that solves the "who actually showed up?" problem clubs deal with every event.
Section 2
Creation Wizard — Step-by-Step
Field's 8-step wizard vs Playtomic's 6-step. Detailed breakdown of what each step does, what needs changing, and how it maps to Playtomic.
Playtomic (6 steps)
1 General Info
name, sport, enrollment type, visibility, organizers
2 Date
start/end, recurrence, reg/cancel policies
3 Courts
select courts to block
4 Participants
gender, min/max, skill level restriction
5 Price
per player + benefit group pricing
6 Additional Info
poster, description, prizes (text)
→
Field (8 steps — with changes)
1 Format & Sport
club, sport, players/team, format cards
2 Details CHANGE
+ recurrence + relative deadline + visibility
3 Courts & Participants
auto/manual + courts + min/max + odd support
4 Competition Rules CHANGE
NEW scoring model (see Section 3)
5 Match Rules
sets/games/tiebreak/golden point
6 Pricing CHANGE
ship member/non-member pricing
7 Landing Page
description, prizes, sponsors
8 Review & Create
summary + Draft / Open Registration
A) Add Recurrence section:
- Options: None (default), Weekly, Biweekly, Custom (every N days/weeks)
- When set, auto-generate future competition instances as children of a "series" parent
- New field:
competitionSeriesId on competition doc. Series config stored separately
- On list page: show series icon. On detail: "Part of: Friday Night Americano"
- Edit actions: "Edit this instance" vs "Edit all future" (Google Calendar pattern)
B) Fix Registration Deadline:
CURRENT (drop this as default)
Registration Deadline: DD/MM/YYYY
PROPOSED (default to this)
Relative
Fixed date
- Store as
registrationDeadlineMode: 'relative' | 'fixed' + registrationDeadlineValue
- Default: Relative, 2 hours before start
- Backend: compute actual deadline = event start minus offset
- Dropdown units: minutes, hours, days
C) Add Visibility Toggle:
- Public = shows in discovery, landing page is indexed
- Private = only accessible via direct link,
noindex on landing page
- Playtomic tooltip says: "Private = visible only for players with whom you share the link"
- Remove the even-number constraint on Min/Max Participants
- When participant count is odd, show a warning (not an error): "Odd number — some players will rest each round"
- This is how Playtomic handles it — warning, not blocker
- The resting logic is handled in round generation (Section 6)
- Remove the "Coming soon" tag from the third radio option
- When selected, show:
Member Price (EUR) + Non-Member Price (EUR)
- Backend: check player's membership status against club's member list at registration time
- Playtomic goes further with "benefit groups" (multiple tiers) — for V1, member/non-member is enough
PAID (TIERED) ← BUILD THIS
Section 3
Competition Rules — New Scoring Model
Drop Field's current "Win/Loss points" vs "Cumulative game points" ranking modes. Adopt Playtomic's simpler, more intuitive model: configurable points-per-game and leaderboard sort order.
!
Breaking change: This replaces the current Step 4 (Competition Rules) entirely. The current model with "Ranking Mode: Win/Loss points | Cumulative game points" is confusing for club organizers. Playtomic's model is what they already understand.
CURRENT FIELD (drop this)
Pairing ModeRandom | Balanced (snake-draft)
Ranking ModeWin/Loss points | Cumulative game points
If Win/Loss:Win points (configurable) + Loss points (configurable)
Problems:
- "Ranking Mode" is abstract — organizers don't think in these terms
- No points-per-game config (12/24/32 etc.)
- No leaderboard sort order control
- No Individual/Team toggle
- Only 2 pairing options
PROPOSED (adopt Playtomic model)
ModeIndividual | Team
Points per Game12 | 24 | 32 | Custom
Leaderboard SortTotal points, then wins | Total wins, then points
Pairing ModeRandom | Balanced | Skill-matched | Strongest first
Why this is better:
- Organizers know "12-point Americano" — it's the language they use
- Sort order is concrete: "do points or wins matter more?"
- Individual/Team toggle covers singles + doubles cleanly
- 4 pairing options including Glicko-2 skill-matched (Field advantage)
Step 4 of 8 — Competition Rules
Mode
Individual
Team
Individual: each player plays with different partners each round. Team: fixed pairs throughout.
Points per Game
Total points played per game. In a 12-point game, if Team A scores 7, Team B gets 5.
Leaderboard Sort
✓
Total points first, then wins
Players ranked by accumulated points. Wins break ties. Best for Americano.
Total wins first, then points
Players ranked by number of wins. Points break ties. Better for Mexicano.
Initial Pairing
Random
Fully random teams
Balanced (snake)
Alternating pick by rank
Skill-matched
Glicko-2 balanced teams
Field only
Strongest first
Top players on Court 1
This sets the first round. Subsequent rounds use format-specific logic (Americano = random rotation, Mexicano = standings-based).
Replace current fields:
// OLD (remove)
rankingMode: 'win_loss_points' | 'cumulative_game_points'
winPoints: number
lossPoints: number
pairingMode: 'random' | 'balanced'
// NEW (adopt)
competitionMode: 'individual' | 'team'
pointsPerGame: 12 | 24 | 32 | number // custom
leaderboardSort: 'points_then_wins' | 'wins_then_points'
pairingMode: 'random' | 'balanced' | 'skill_matched' | 'strongest_first'
competitionMode: Individual = new partner each round (Americano). Team = fixed pairs (Mexicano team variant).
pointsPerGame: Total points in each game. When entering scores, Team A + Team B must equal this. Enables auto-sum.
leaderboardSort: Primary sort key for standings. Secondary is always the other metric.
pairingMode: Only applies to round 1 (initial draw). Subsequent rounds follow format-specific rules.
- Migration: Map existing
rankingMode: 'win_loss_points' to leaderboardSort: 'wins_then_points' and 'cumulative_game_points' to 'points_then_wins'. Default pointsPerGame: 12 for all existing competitions.
Section 5
Player Management
How players get into a competition — self-registration, admin-added, walk-in — and how the admin tracks payment status. Playtomic has a basic version of this. Field needs to go deeper.
| # | Player | Gender | Price | Payment | Enrolled |
| 1 | 👤 Maria Silva | F | EUR 10 | Credit card | May 12 |
| 2 | 👤 Joao Santos | M | EUR 10 | Cash | May 13 |
| 3 | 👤 Pedro Costa | M | EUR 10 | Unpaid | May 14 |
Add player: Search existing customers OR "Create new customer" button. Payment tracked manually (Unpaid / Cash / Credit card toggle per player).
How players enter a competition:
1. Self-Registration
Player finds competition on landing page or app, clicks Register, pays (if applicable). Appears automatically in admin's player list.
Built
2. Admin Adds Player
Club Admin or Field Admin searches by name/email/phone. Selects from existing users. Sets payment status manually.
Needs work
3. Walk-In (Event Day)
Quick-add with name + phone number. If phone matches existing Field user, auto-link. If not, create provisional player. Available during CHECK_IN and REGISTRATION_CLOSED states.
Not built
Admin "Add Player" drawer:
🔍 Search by name, email, or phone...
Search results show: name, avatar, phone, membership status (Member/Non-member badge), Glicko-2 rating if available
Maria Silva
+351 912 345 678 · Member · Rating: 1250
+ Add
Payment Status:
Unpaid
Cash
Card
MB WAY
Walk-in shortcut: If player not found, show "Create walk-in player" — just name + phone. No account creation needed.
Player list table columns:
| # | Player | Membership | Rating | Price | Payment | Source | Check-in | Actions |
| 1 |
👤 Maria Silva +351 912 345 678 |
Member |
1250 |
EUR 8 |
Card |
Self |
✓ |
⋮ |
| 2 |
👤 Joao Santos +351 917 654 321 |
Non-member |
1180 |
EUR 12 |
Cash |
Admin |
— |
⋮ |
| 3 |
👤 Pedro Costa +351 926 111 222 |
Non-member |
— |
EUR 12 |
Unpaid |
Walk-in |
✓ |
⋮ |
Actions menu (⋮): Change payment status, Remove player, View profile. During CHECK_IN: manual check-in toggle.
Source column: Self = self-registered via app/landing page. Admin = added by club/field admin. Walk-in = added on event day.
Check-in column: Only visible when status = CHECK_IN or later. Shows green check or dash.
Field Admin vs Club Admin: Both can add players. Field Admin sees all clubs' competitions. Club Admin sees only their club's.
- When max participants is reached, registration button changes to "Join Waitlist"
- Admin sees a separate "Waitlist" section below the player list
- If a player cancels, first waitlisted player gets a push notification + 2-hour window to confirm
- If they don't confirm, auto-promote next waitlisted player
- Playtomic has NO visible waitlist management
Section 6
Round Generation & Matchups
How the admin creates rounds, how players are paired, and how courts get assigned. This is the core of the competition engine runtime.
STEP 1: Select Game Type
Drawer with 3 options: Americano, Mexicano, KoC. Each with Details tooltip.
STEP 2: Format Config
Individual/Team, Scoring (12/24/32/custom), Leaderboard sort order.
STEP 3: Initial Draw
Manual drag OR "Fill automatically" with pairing options (strongest/even/random).
STEP 4: Summary
Matchup count, active teams, resting teams, left-out players.
Key issue: Playtomic does format + scoring config at matchup time, NOT during creation. This is backwards. Field already solved this by putting it in the creation wizard (Step 4). But Playtomic's matchup generation UX (draw step + summary) is good — we should adopt that.
Trigger: Admin clicks "Generate Round" button on active competition view
ROUND 1 (Initial Draw)
Uses the Pairing Mode set in wizard Step 4:
- Random: Shuffle all players, assign to courts randomly
- Balanced (snake): Sort by rating (or seed), snake-draft pairs across courts
- Skill-matched: Use Glicko-2 to create evenly balanced teams per court
- Strongest first: Highest-rated players on Court 1, descending
If odd number of players: system selects who rests (lowest-rated for strongest-first, random for random mode).
ROUND 2+ (Format-Specific)
Pairing depends on the format:
- Americano: Random rotation — new partner each round. Avoid repeat pairings (Swiss-system logic).
- Mexicano: Standings-based — #1 pairs with #2 vs #3 with #4, etc. Leaderboard drives matchups.
- KoC: Winners stay on court, challengers rotate in from queue.
Resting players rotate fairly — track rest count, prioritize players who've rested least.
After generation — review before confirming:
Generate Round 3 — Preview
Maria + Pedro
1250 | 1180 avg
VS
Joao + Ana
1220 | 1190 avg
Rui + Sara
1100 | 1150 avg
VS
Tiago + Ines
1090 | 1140 avg
Bruno Costa
Rested 0 times so far
Drag players between courts to manually adjust. Or:
🔄 Re-shuffle
✓ Confirm & Start Round
Key features: (a) Preview before confirming — admin can drag players between courts to manually override. (b) Re-shuffle button to regenerate. (c) Resting players shown explicitly with rest count. (d) Average rating per team shown (Field advantage over Playtomic). (e) "Confirm & Start Round" locks the matchups and allows score entry.
Section 7
Active Competition View
What the admin sees when the competition is IN_PROGRESS. This is the main screen during an event — round navigation, court cards, leaderboard, and action buttons.
Friday Night Americano · Americano · 12 pts · 9 players
←
Round 3 of 5
→
In progress
💬 Share Matchups
📋 Duplicate Round
📺 TV Mode
+ Generate Next Round
Resting this round: Bruno Costa (rested 1x)
Next round: will play
Leaderboard (live)
→ Full leaderboard details in Section 9
i
Playtomic comparison: Playtomic has a similar layout (round nav + court cards + leaderboard). Key differences: (a) Playtomic shows no per-court status badges (score entered vs awaiting). (b) No resting player info next to rounds. (c) No "Generate Next Round" button — they use "+ Add round" which is less intuitive. (d) No "Share Matchups" or "TV Mode" buttons in the same toolbar. Field should combine the best of both into this unified view.
What happens when admin clicks "Share Matchups":
- Option 1: Share to competition chat — formatted message: "Round 3 — Court 1: Maria + Pedro vs Joao + Ana | Court 2: Rui + Sara vs Tiago + Ines | Resting: Bruno"
- Option 2: Copy to clipboard — same text, for pasting in WhatsApp. Most Portuguese clubs still use WhatsApp groups
- Option 3: Push notification — send to all registered players' phones
Section 8
Result Entry
Two flows: admin enters scores from the backoffice, or players enter from their phones. Playtomic only supports admin entry. Field should support both.
Admin Score Entry (backoffice)
of 12
Joao + Ana
5
auto-calculated
Save Result
Auto-sum: Admin enters one score, other is auto-calculated (12 - 7 = 5). Copied from Playtomic — prevents entry errors. Admin clicks court card to open this modal.
Player Score Entry (mobile app) Field only
Your match — Court 1
Submit Score
Confirmation flow:
- Player A submits 7-5
- Player B (opponent) gets push notification: "Maria submitted 7-5. Confirm?"
- If confirmed → score is final, leaderboard updates
- If disputed → flagged for admin to resolve
- If no response in 15 min → auto-confirmed
Playtomic has NONE of this. All score entry is organizer-only. Player-side entry is a massive UX win for events with many courts.
Section 9
Leaderboard & Standings
What columns the leaderboard shows, how it sorts, and how it handles ties. Playtomic's leaderboard is basic (rank, name, matches, wins, points). Field should go deeper.
Playtomic Leaderboard
| # | Player | M | W | Pts |
| 1 | Maria Silva | 4 | 3 | 38 |
| 2 | Joao Santos | 4 | 3 | 35 |
| 3 | Pedro Costa | 4 | 2 | 31 |
M = Matches, W = Wins, Pts = Total points. That's it — no differential, no form, no rating.
Field Leaderboard (build this)
| # | Player | M | W | L | Pts | +/- | Form |
| 1 | Maria Silva ↑2 | 4 | 3 | 1 | 38 | +14 | W W W L |
| 2 | Joao Santos | 4 | 3 | 1 | 35 | +10 | W L W W |
| 3 | Pedro Costa ↓1 | 4 | 2 | 2 | 31 | +2 | W W L L |
+/- = point differential. Form = last 4 results. Arrows = position change since last round.
| Column | What it shows | Sort behavior | Playtomic has? |
| # | Rank position | Derived from primary sort | Yes |
| Player | Name + avatar + position change arrow (↑2, ↓1, —) | — | Name + avatar only |
| M (Matches) | Total matches played | — | Yes |
| W (Wins) | Total wins | Primary sort if wins_then_points | Yes |
| L (Losses) | Total losses | — | No |
| Pts (Points) | Total accumulated points across all games | Primary sort if points_then_wins | Yes |
| +/- (Differential) | Points scored minus points conceded | Tiebreaker #2 | No |
| Form | Last 4 results as W/L indicators | — (visual only) | No |
Tiebreaker order:
- Primary sort metric (points or wins, per
leaderboardSort config)
- Secondary sort metric (the other one)
- Point differential (+/-)
- Head-to-head result between tied players
- If still tied: same rank, alphabetical
Live updates: Leaderboard recalculates after every score entry. Uses Firestore onSnapshot for real-time on both admin and player views.
Section 10
Post-Competition
What happens after admin clicks "Finish Competition." Playtomic shows a basic podium. Field should do more.
Playtomic (what they show)
- Completion summary: status, rounds, players, matchups
- Podium: 1st/2nd/3rd with avatars and points
- Full leaderboard table
- That's it — no analytics, no rating changes, no recap cards, no share, no "repeat"
Field (what to build — phased)
Phase 1 (ship with V2):
- Podium visualization (1st/2nd/3rd, same as Playtomic)
- Final leaderboard with all columns from Section 9
- Summary stats: rounds, total matches, total players
- "Repeat Competition" button (clone with new date)
Phase 2 (post-V2):
- Recap card per player: position, points, rating change (Δμ), intensity
- Glicko-2 rating update display: "Your rating: 1250 → 1268 (+18)"
- Share CTA — shareable image card for Instagram/WhatsApp
- Badges earned during competition
Phase 3 (later):
- Monthly/seasonal wrapped recaps
- Competition analytics tab for admins
Section 11
Priority Actions — Summary
All changes organized by priority. Each references the section where the full spec lives.
Critical (ship blockers)
Drop "Win/Loss points vs Cumulative" ranking modes. Adopt: Individual/Team toggle, Points per Game (12/24/32/custom), Leaderboard Sort (points-first vs wins-first), 4 pairing modes including Glicko-2 skill-matched. Full UI mockup and data model in Section 3.
Three changes to Step 2: (a) Recurrence: none/weekly/biweekly/custom. (b) Registration deadline: relative mode default (N hours/days before start). (c) Public/Private visibility toggle. Full spec and mockups in Section 2.
Remove even-number constraint. Warning (not error) when odd. Resting player logic in round generation — track rest count, rotate fairly. Resting callout on active view.
Remove "Coming soon." Show Member Price + Non-Member Price when tiered pricing selected. Backend checks membership at registration time. Mockup in Section 2.
High Priority (competitive parity)
Enter one team's score, other auto-calculates (pointsPerGame - entered = other). Works because we now have a fixed pointsPerGame value. Mockup in Section 8.
Generate round → preview court cards with team assignments → allow drag to manually adjust → re-shuffle button → confirm. Show resting players with rest count. Full mockup in Section 6.
Add columns: Losses, Point Differential (+/-), Form (last 4 W/L), Position Change arrows. Implement tiebreaker chain. Live updates via Firestore. Column spec in Section 9.
Button on round toolbar: share to competition chat, copy to clipboard (WhatsApp), or push notification. Pre-formatted with court assignments + resting players.
Name + phone minimum. If phone matches existing user, auto-link. Available during CHECK_IN and REGISTRATION_CLOSED. Add Player drawer mockup in Section 5.
Already spec'd. "Save as Template" on Review step. Template cards at top of creation screen. "Repeat" action on completed competitions. Quick Create: single-page form with smart defaults for Americano/Mexicano.
Medium Priority (differentiation)
Players enter scores from phone, opponent confirms via push. Dispute → admin resolves. Auto-confirm after 15 min. Full flow in Section 8.
CHECK_IN state with QR display, progress counter ("12/16 checked in"), manual check-in toggles, "Close Check-In & Start" button. Playtomic has nothing like this.
Third most popular casual format. Playtomic has it, Field doesn't yet. Ship next after getting Americano/Mexicano flows solid.
Podium visualization (1st/2nd/3rd). "Repeat Competition" button to clone with new date. Summary stats. Phase 1 of post-competition per Section 10.
Dark theme, large fonts, auto-rotating screens (matchups → leaderboard → sponsors). QR overlay. Real-time via Firestore. For clubs with TVs near courts.
Nice to Have (polish)
Configurable: "Cancel up to X hours/days before start for full refund." Copy from Playtomic.
Total competitions, unique participants, revenue, participation rate, repeat rate. Bar + line charts. Already spec'd.
Competition blocks on BookingCalendar (purple color). Click → navigate to competition. Auto-blocks courts.
Built-in chat per competition (Playtomic has this at session level). Separate from WhatsApp. Needed for "Share Matchups" feature.
When max reached: "Join Waitlist." Auto-promote when cancellation happens. 2-hour confirmation window. Playtomic has no waitlist.
Section 12
Full Feature Matrix
Every feature compared across Playtomic and Field.
| Feature | Playtomic | Field (Current / Proposed) | Priority |
| Creation Wizard |
| Format in wizard | No (at matchup time) | Yes Step 1 | Ahead |
| Recurrence | Yes | No → Build | Critical |
| Relative deadline | Yes | No → Build | Critical |
| Visibility toggle | Yes | No → Build | Critical |
| Odd participants | Yes | No → Fix | Critical |
| Member pricing | Yes | Coming soon → Ship | Critical |
| Scoring model | 12/24/32/custom + sort | Confusing model → Replace | Critical |
| Court auto/manual | Manual only | Both | Ahead |
| Landing page | No | Yes | Ahead |
| Draft mode | No | Yes | Ahead |
| Review step | No | Yes | Ahead |
| Templates | No | Spec'd | High |
| Player Management |
| Self-registration | Yes | Yes | Parity |
| Admin add player | Yes (search or create) | Basic → Enhance | High |
| Walk-in quick-add | No | No → Build | High |
| Payment tracking | Yes (Unpaid/Cash/Card) | Basic → Match | High |
| Waitlist | No | No → Build | Low |
| Round Generation |
| Auto-generate matchups | Yes | Yes | Parity |
| Pairing options | 3 (strongest/even/random) | 2 → Expand to 4 | Critical |
| Manual drag override | Yes | No → Build | High |
| Preview before confirm | Yes (summary step) | No → Build | High |
| Resting player logic | Yes | No → Build | Critical |
| Duplicate round | Yes | No → Build | Low |
| Score Entry |
| Admin score entry | Yes | Yes | Parity |
| Auto-sum | Yes | No → Build | High |
| Player-side entry | No | Spec'd | Medium |
| Result confirmation | No | Spec'd | Medium |
| Leaderboard |
| Basic (rank, name, M, W, Pts) | Yes | Yes | Parity |
| Losses column | No | → Build | High |
| Point differential | No | → Build | High |
| Form indicators | No | → Build | High |
| Position change arrows | No | → Build | High |
| Live updates (Firestore) | Unknown | Yes | Ahead |
| Post-Competition |
| Podium | Yes | No → Build | Medium |
| Repeat/clone | No | → Build | Medium |
| Recap cards | No | Spec'd | Later |
| Rating change display | No | Spec'd | Later |
| Infrastructure |
| Check-in (QR) | No | Spec'd | Medium |
| TV mode | Basic fullscreen | Spec'd (advanced) | Medium |
| Share matchups | Yes | No → Build | High |
| Competition chat | Yes | No | Low |
| Multi-club | No | Yes | Ahead |
| Glicko-2 rating | No | Spec'd | Key diff. |
Field Competition Engine — Full Operational Spec v2
May 2026 · Guilherme Fontes · Procimo
Based on Playtomic backoffice analysis + Field Manager current build + competition engine spec