Desk Guide
LEAGUEOS OPERATIONS REFERENCE โ ROLE-BASED WORKFLOWS & FUNCTION SOPs
If current_season_id is missing or wrong, ALL WooCommerce webhook records will silently fail โ no errors shown.
Age cutoff drives division eligibility โ verify this before any registration goes live.
- 1Go to Admin โ League Settings. Create or select the current Season record and mark it "Active."
- 2Set the current_season_id in League Settings โ this is the single most important config value. All webhooks file records here.
- 3Confirm the Age Cutoff Date (default: August 1). This drives division eligibility calculation for all players.
- 4Create or verify Division records exist: 8U, 10U, 12U, 14U, HS.
- 5Create or verify Team records in the Teams section โ teams must exist before players can be rostered.
- 6Set League branding: upload logo, set primary/secondary colors โ this propagates everywhere including badges and TV scoreboard.
- 7Configure any Format Records (7v7, 5v5, Girls Flag, Linemen Showcase) you plan to use this season.
- 8Set up SportsPress URLs in League Settings if you use external standings/schedules.
Only one season should be marked "active" at a time.
You can create next season in advance โ just don't mark it active until rollover.
sport_format is mapped from the WooCommerce product name โ if a new product is added, verify the mapping or records will be miscategorized.
Forminator and WooCommerce webhooks are separate โ a player may have payment but no form (or vice versa). Check both.
- 1Parent completes payment on the league website (WooCommerce). When order is marked "completed," a webhook fires automatically.
- 2The WooCommerce webhook creates a Player record and a Registration record in the system โ no manual entry needed.
- 3Parent then fills out the Forminator intake form โ uploading birth certificate, player photo, and secondary ID if out-of-state.
- 4Forminator webhook fires on form submission โ attaches documents and updates the Registration record.
- 5Open the Intake Command Center to see new registrations queued for review.
- 6Check the Batch Import Log for any "needs_review" or "failed" flags โ fix these manually.
- 7Review the Duplicate Records page weekly to catch cases where a parent submitted twice.
- 8Once documents are verified, move to Certification (next workflow).
Duplicate detection runs automatically on name + birth date. If a duplicate is flagged, merge via the Duplicate Management page.
Out-of-state players require a state ID or school ID in addition to birth certificate and photo.
Never certify a player with an unverified birth certificate โ this is a compliance violation.
Denial is permanent and logged. Use it only when a document is fraudulent or the player is ineligible.
- 1Open Certification Dashboard. Filter by "Pending Review" to see the queue.
- 2Click a player card to open the Slab Detail Viewer (full record).
- 3Verify each document is present and valid:
- โBirth Certificate: must be government-issued, legible, DOB matches registration.
- โPlayer Photo: must be recent, clear face, appropriate.
- โSecondary ID (out-of-state only): state ID, school ID, or school demographics form.
- โPayment: woo_paid must be true and woo_status = "completed."
- 4If ALL documents are valid โ click Certify. System sets status = "certified", access_granted = true, certified_at = now.
- 5The parent automatically receives a confirmation email with their player's QR badge.
- 6If documents are missing or invalid โ leave status as "pending_review." Send a message via Inbox requesting the missing items.
- 7If denying: click Deny, enter a written reason. This is logged permanently in the ActivityLog.
Certification is per-registration (per season + format). A player may need re-certification for a new season.
If a parent says they didn't receive the email, re-trigger the badge email from the Certification Detail page.
A coach WITHOUT a valid badge cannot be on the sideline โ enforce this strictly.
admin_override = "force_suspended" overrides all other status checks. Use carefully.
- 1Staff or coach submits the Forminator credential form. An Access Ledger record is created automatically.
- 2WooCommerce payment (if required) sets payment_status = "completed" on the ledger record.
- 3Open the Access Console โ filter by "pending_review" to see staff awaiting approval.
- 4Open the staff record and verify:
- โBackground Check on file (has_background_check = true)
- โCPR/First Aid Certification on file (has_cpr_cert = true)
- โRole selected matches what was approved (Coach_Full, Coach_Limited, Team_Manager, etc.)
- โBadge photo uploaded and appropriate.
- 5Set the badge_expires_at date (typically 1 year from approval).
- 6Click Approve โ certification_status = "active", access_granted = true.
- 7A staff badge email is sent automatically with their QR code.
- 8To suspend immediately: set admin_override = "force_suspended." Access is revoked instantly.
- 9To reinstate: set admin_override = "none" and certification_status = "active."
Badge expiration warning emails fire automatically 14 days before badge_expires_at.
Revoking a badge (badge_revoked = true) is different from suspending โ revoked badges cannot be reinstated without admin action.
Role levels: Admin_Full > Coach_Full > Coach_Limited > Team_Manager > Staff_Limited > Media_Limited.
Never manually roster a player who is still "pending_review" โ they are not cleared to play.
Play-down is prohibited by league policy. The system enforces this, but double-check manually for edge cases.
- 1A player must be CERTIFIED before they can be added to a roster.
- 2Open Team Rosters โ select a team and division.
- 3Click "Add Player" โ choose from the Free Agent Board (certified, unassigned players).
- 4Assign a division_code that matches the player's native_division, OR check play_up_approved if they are playing up.
- 5Playing DOWN is NEVER permitted โ the system blocks this.
- 6To transfer a player: open their RosterMember record โ click Release. Set release_reason. Player goes to Free Agent Board.
- โAfter release, game_eligible_at is set 24 hours forward โ they cannot play during this window.
- โTransfer count increments. League rules may cap total transfers per season.
- 7To mark a player as a Free Agent temporarily (not a transfer): use is_free_agent = true.
- 8At end of season, bulk update all RosterMember records to status = "season_ended."
Each player can only have ONE active RosterMember per season + sport_format.
Free Agent Board shows all certified players not assigned to any active roster.
Do not publish if the Validation Panel shows red "Invalid" flags โ games may conflict.
Adding or removing a team after publishing requires re-generating and re-publishing the bracket.
- 1Create a TournamentEvent record: set name, date, venue, and which divisions are participating.
- 2Add Event Teams: link registered teams (or custom tournament teams) to the event with their division and pool assignments.
- 3Open Bracket Builder V2 โ select the event and division.
- 4Choose bracket format: single elimination, double elimination, round-robin, or pool-to-bracket.
- 5Seed the teams by dragging in the Seeding Board โ top seed = best team.
- 6Click Generate Schedule โ the engine builds all game slots respecting field count, time windows, and rest rules.
- 7Review the Validation Panel โ fix any "Invalid" flags before publishing.
- 8Click Publish โ bracket_data and schedule_data are saved, publish_state = "published."
- 9The published bracket and schedule are visible to coaches and parents on the Public Scoreboard.
Fields & Zones must be configured before schedule generation.
Game slots link to actual field assignments โ use the Gameday Field Map to verify placement.
A game should NOT be marked "completed" until BOTH teams confirm the score.
Any ejection during a game must be filed as an Incident Report immediately.
- 1Morning of event: open Gameday Command Center โ set the event to "active."
- 2Print or display the Field Map โ give a copy to each field marshal.
- 3Staff and coaches check in at the admin tent โ verify their QR badge.
- 4Open Gameday Check-In โ confirm player attendance per team.
- โBoth teams must have minimum players checked in before a game can begin.
- 5As games start: update GameSlot status โ "in_progress." Assign a scorekeeper per field.
- 6Scorekeepers enter scores in Live Scoring โ scores publish to Public Scoreboard in real time.
- 7If a delay: set game status to "delayed" + add a delay_reason note. Alert other fields if needed.
- 8After each game: set GameSlot to "completed." Verify both teams confirm the final score.
- 9After all games: update TournamentEvent status to "completed."
- 10Run the Standings calculation to finalize brackets and advance teams.
The TV Scoreboard page auto-cycles through live games โ put it on a large screen at the venue.
GameDay Command Center shows a snapshot of all fields, scores, and alerts in one view.
All ejections MUST be documented โ failure to report is a league policy violation.
Never discuss ejection decisions on the field โ document first, communicate via official channels.
- 1Open Incident Reporting โ click "New Incident."
- 2Select the incident type: ejection, conduct violation, injury, equipment concern, other.
- 3Fill in: event, game slot, involved player(s) or coach(es), description of what occurred.
- 4If an ejection: set ejection = true and note the ejected person's role (player/coach/staff).
- 5Submit โ record is saved with timestamp and your user email as the reporter.
- 6Admin must review all ejections within 24 hours and determine suspension length.
- 7Suspension is tracked in the SuspensionTracker โ it blocks the player/coach from future game eligibility.
- 8Notify the ejected party via Inbox with the official decision.
Incident reports are admin-only visible.
A pattern of incidents (3+ in a season) may trigger a league review of that team or individual.
Only admin officials should operate the Live Scoring screen โ coaches may not self-score.
- 1Open Lineman Showcase from the Tournament section in the sidebar.
- 2Click "New Matchup" โ enter Team A (OL side) and Team B (DL side).
- 3Select the division, number of active lanes (1โ5), and toggle Top Dawg Mode if applicable.
- 4Set status to "Scheduled" to queue it, or click "Go Live โก" to launch immediately.
- 5On the Live Scoring screen, the official taps the winning team button after each rep.
- 6Penalties: False Start awards the point to DL. Offsides awards the point to OL.
- 7Use Reset (no count) if the rep must be redone for a non-penalty reason.
- 8The timer tracks each rep duration โ a yellow/red indicator shows if the rep exceeds the division limit.
- 9Top Dawg Mode: the player with the longest current win streak is highlighted automatically.
- 10End Matchup โ confirm the final score. The matchup moves to "Completed."
- 11View standings and player stats in the Leaderboard tab.
Division rep timing limits: 8U/10U = 4โ5s, 12U = 3โ5s, 14U = 3โ4s, HS = 2โ3s.
The LinemanTVScoreboard page can be displayed on a venue screen for spectators.
Undo Last Rep is available if an incorrect tap was made.
- 1Open System Audit Dashboard weekly to review activity logs and catch anomalies.
- 2Review the Access Console for any staff with expired badges or suspended status.
- 3Run the Duplicate Management check before each event to merge any double-registered players.
- 4Use the Validation Checklist before publishing brackets or going live with an event.
- 5Use Role Testing Dashboard to simulate what a coach or parent sees โ catch permission gaps.
- 6For production events, complete the Production Readiness Checklist โ it covers all pre-event verifications.
ActivityLog records every create/update/delete action with the user email and timestamp.
System Audit is admin-only and does not expose PII to other roles.