Desk Guide

LEAGUEOS OPERATIONS REFERENCE โ€” ROLE-BASED WORKFLOWS & FUNCTION SOPs

๐Ÿ›ก๏ธAdmin
10 SECTIONS

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.

  1. 1Go to Admin โ†’ League Settings. Create or select the current Season record and mark it "Active."
  2. 2Set the current_season_id in League Settings โ€” this is the single most important config value. All webhooks file records here.
  3. 3Confirm the Age Cutoff Date (default: August 1). This drives division eligibility calculation for all players.
  4. 4Create or verify Division records exist: 8U, 10U, 12U, 14U, HS.
  5. 5Create or verify Team records in the Teams section โ€” teams must exist before players can be rostered.
  6. 6Set League branding: upload logo, set primary/secondary colors โ€” this propagates everywhere including badges and TV scoreboard.
  7. 7Configure any Format Records (7v7, 5v5, Girls Flag, Linemen Showcase) you plan to use this season.
  8. 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.

  1. 1Parent completes payment on the league website (WooCommerce). When order is marked "completed," a webhook fires automatically.
  2. 2The WooCommerce webhook creates a Player record and a Registration record in the system โ€” no manual entry needed.
  3. 3Parent then fills out the Forminator intake form โ€” uploading birth certificate, player photo, and secondary ID if out-of-state.
  4. 4Forminator webhook fires on form submission โ€” attaches documents and updates the Registration record.
  5. 5Open the Intake Command Center to see new registrations queued for review.
  6. 6Check the Batch Import Log for any "needs_review" or "failed" flags โ€” fix these manually.
  7. 7Review the Duplicate Records page weekly to catch cases where a parent submitted twice.
  8. 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.

  1. 1Open Certification Dashboard. Filter by "Pending Review" to see the queue.
  2. 2Click a player card to open the Slab Detail Viewer (full record).
  3. 3Verify each document is present and valid:
  4. โ†’Birth Certificate: must be government-issued, legible, DOB matches registration.
  5. โ†’Player Photo: must be recent, clear face, appropriate.
  6. โ†’Secondary ID (out-of-state only): state ID, school ID, or school demographics form.
  7. โ†’Payment: woo_paid must be true and woo_status = "completed."
  8. 4If ALL documents are valid โ†’ click Certify. System sets status = "certified", access_granted = true, certified_at = now.
  9. 5The parent automatically receives a confirmation email with their player's QR badge.
  10. 6If documents are missing or invalid โ†’ leave status as "pending_review." Send a message via Inbox requesting the missing items.
  11. 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.

  1. 1Staff or coach submits the Forminator credential form. An Access Ledger record is created automatically.
  2. 2WooCommerce payment (if required) sets payment_status = "completed" on the ledger record.
  3. 3Open the Access Console โ€” filter by "pending_review" to see staff awaiting approval.
  4. 4Open the staff record and verify:
  5. โ†’Background Check on file (has_background_check = true)
  6. โ†’CPR/First Aid Certification on file (has_cpr_cert = true)
  7. โ†’Role selected matches what was approved (Coach_Full, Coach_Limited, Team_Manager, etc.)
  8. โ†’Badge photo uploaded and appropriate.
  9. 5Set the badge_expires_at date (typically 1 year from approval).
  10. 6Click Approve โ†’ certification_status = "active", access_granted = true.
  11. 7A staff badge email is sent automatically with their QR code.
  12. 8To suspend immediately: set admin_override = "force_suspended." Access is revoked instantly.
  13. 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.

  1. 1A player must be CERTIFIED before they can be added to a roster.
  2. 2Open Team Rosters โ†’ select a team and division.
  3. 3Click "Add Player" โ€” choose from the Free Agent Board (certified, unassigned players).
  4. 4Assign a division_code that matches the player's native_division, OR check play_up_approved if they are playing up.
  5. 5Playing DOWN is NEVER permitted โ€” the system blocks this.
  6. 6To transfer a player: open their RosterMember record โ†’ click Release. Set release_reason. Player goes to Free Agent Board.
  7. โ†’After release, game_eligible_at is set 24 hours forward โ€” they cannot play during this window.
  8. โ†’Transfer count increments. League rules may cap total transfers per season.
  9. 7To mark a player as a Free Agent temporarily (not a transfer): use is_free_agent = true.
  10. 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.

  1. 1Create a TournamentEvent record: set name, date, venue, and which divisions are participating.
  2. 2Add Event Teams: link registered teams (or custom tournament teams) to the event with their division and pool assignments.
  3. 3Open Bracket Builder V2 โ†’ select the event and division.
  4. 4Choose bracket format: single elimination, double elimination, round-robin, or pool-to-bracket.
  5. 5Seed the teams by dragging in the Seeding Board โ€” top seed = best team.
  6. 6Click Generate Schedule โ†’ the engine builds all game slots respecting field count, time windows, and rest rules.
  7. 7Review the Validation Panel โ€” fix any "Invalid" flags before publishing.
  8. 8Click Publish โ†’ bracket_data and schedule_data are saved, publish_state = "published."
  9. 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.

  1. 1Morning of event: open Gameday Command Center โ†’ set the event to "active."
  2. 2Print or display the Field Map โ€” give a copy to each field marshal.
  3. 3Staff and coaches check in at the admin tent โ€” verify their QR badge.
  4. 4Open Gameday Check-In โ†’ confirm player attendance per team.
  5. โ†’Both teams must have minimum players checked in before a game can begin.
  6. 5As games start: update GameSlot status โ†’ "in_progress." Assign a scorekeeper per field.
  7. 6Scorekeepers enter scores in Live Scoring โ†’ scores publish to Public Scoreboard in real time.
  8. 7If a delay: set game status to "delayed" + add a delay_reason note. Alert other fields if needed.
  9. 8After each game: set GameSlot to "completed." Verify both teams confirm the final score.
  10. 9After all games: update TournamentEvent status to "completed."
  11. 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.

  1. 1Open Incident Reporting โ†’ click "New Incident."
  2. 2Select the incident type: ejection, conduct violation, injury, equipment concern, other.
  3. 3Fill in: event, game slot, involved player(s) or coach(es), description of what occurred.
  4. 4If an ejection: set ejection = true and note the ejected person's role (player/coach/staff).
  5. 5Submit โ†’ record is saved with timestamp and your user email as the reporter.
  6. 6Admin must review all ejections within 24 hours and determine suspension length.
  7. 7Suspension is tracked in the SuspensionTracker โ€” it blocks the player/coach from future game eligibility.
  8. 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.

  1. 1Open Lineman Showcase from the Tournament section in the sidebar.
  2. 2Click "New Matchup" โ†’ enter Team A (OL side) and Team B (DL side).
  3. 3Select the division, number of active lanes (1โ€“5), and toggle Top Dawg Mode if applicable.
  4. 4Set status to "Scheduled" to queue it, or click "Go Live โšก" to launch immediately.
  5. 5On the Live Scoring screen, the official taps the winning team button after each rep.
  6. 6Penalties: False Start awards the point to DL. Offsides awards the point to OL.
  7. 7Use Reset (no count) if the rep must be redone for a non-penalty reason.
  8. 8The timer tracks each rep duration โ€” a yellow/red indicator shows if the rep exceeds the division limit.
  9. 9Top Dawg Mode: the player with the longest current win streak is highlighted automatically.
  10. 10End Matchup โ†’ confirm the final score. The matchup moves to "Completed."
  11. 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.

  1. 1Open System Audit Dashboard weekly to review activity logs and catch anomalies.
  2. 2Review the Access Console for any staff with expired badges or suspended status.
  3. 3Run the Duplicate Management check before each event to merge any double-registered players.
  4. 4Use the Validation Checklist before publishing brackets or going live with an event.
  5. 5Use Role Testing Dashboard to simulate what a coach or parent sees โ€” catch permission gaps.
  6. 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.