League Settings Reference
2026-05-11
League Settings Reference
Every per-league rule, limit, and toggle lives on the LeagueSettings row for your league and is editable from /admin/league-settings. This article is the field-by-field map — what each setting does, where the default comes from, and which tab it lives under.
How settings are organized
The /admin/league-settings page is split into tabs that match the categories below. Every field is editable in place; saving writes back to LeagueSettings for your league and takes effect immediately for any new transaction. When new settings ship in future phases, their defaults preserve current behavior — your existing league does not change unless you actively flip a toggle.
Roster rules (Roster tab)
| Field | What it does | Default |
|---|---|---|
salaryCap | Sum of every active+reserve cap hit must fit under this | 95.5M USD |
maxForwards | Max active forwards on a roster | 12 |
maxDefense | Max active defensemen on a roster | 6 |
maxGoalies | Max active goaltenders on a roster | 2 |
maxMonthlyChanges | Roster moves allowed per calendar month per team | 5 |
unlimitedChangeDays | Comma-separated days of the month when monthly limit doesn't apply | "1,15" |
maxNhlTeamsPerTeam | Max NHL teams a fantasy team can draft (NHL Team Points feature) | 1 |
See Salary Cap and Position Limits and Monthly Roster Changes for the rules in practice.
Scheduling (Scheduling tab)
| Field | What it does | Default |
|---|---|---|
tradeDeadline | Date after which new trade proposals are blocked | unset (open all season) |
rosterFreezeDate | Date after which roster moves are blocked entering the playoffs | unset |
freeAgentWindowStart | Date the free agent period opens | unset |
freeAgentWindowEnd | Date the free agent period closes | unset |
See Trade Deadline Rules for how the trade deadline check fires.
Free agent period
The free agent window limits when a free agent pick can be spent. Outside the window, a GM cannot claim a free agent or use a pick; the controls are disabled and the server rejects the request. Nothing else is affected — trades, drops, and moving players between active and reserve all continue to work normally.
Both dates are optional and independent:
- Both unset — free agent picks can be spent at any time. This is the default and matches how leagues behaved before the setting existed.
- Opens only — picks cannot be spent until that date, then stay available for the rest of the season.
- Closes only — picks can be spent from the start of the season until that date.
Both dates are included in full: a window of October 1 to October 15 is open from the first moment of October 1 through the last moment of October 15.
Commissioners and system admins are not restricted by the window, so a commissioner can still process a pickup for a GM after the period closes.
Scoring (Scoring tab)
The scoring rules live in a separate ScoringConfig model (per-position weights for goals, assists, plus-minus, etc.), but two top-level settings on LeagueSettings control the overall scoring shape:
| Field | What it does | Default |
|---|---|---|
scoringFormat | roto (accumulating totals) or h2h (weekly head-to-head matchups) | roto |
h2hWeeksPerSeason | Weeks in the H2H regular season | 18 |
h2hPlayoffWeeks | Playoff weeks (0 = no playoffs) | 3 |
h2hPlayoffTeams | Teams making H2H playoffs (4, 6, or 8) | 4 |
topXForwards / topXDefense / topXGoalies | Best-ball top-X scoring counts | 9 / 4 / 1 |
See Scoring Rules and Position-Based Scoring for how the points engine reads these.
Draft (Draft tab)
| Field | What it does | Default |
|---|---|---|
draftType | Default draft type for new drafts (snake / linear / lottery / auction) | snake |
draftRounds | Number of rounds in the default draft | 20 |
draftPicksPerSeason | Pick allotment per team per season | 4 |
freeAgentSlotsPerSeason | Free-agent picks per team per season | 2 |
auctionBudget | Starting budget for auction-draft teams | 200 |
auctionTimerSeconds | Bidding clock window | 30 |
auctionMinBid | Minimum bid increment | 1 |
See the Drafts Overview article for what each draft type does on the room side.
Trades (Features tab)
| Field | What it does | Default |
|---|---|---|
tradesEnabled | Master switch for the trade system | on |
tradeApprovalRequired | Whether accepted trades wait in a commissioner queue | on |
tradeApprovalThreshold | Number of assets that triggers the approval requirement | 1 |
See Trade Approval Workflow for the cycle this controls.
Free agents (Features tab)
| Field | What it does | Default |
|---|---|---|
freeAgentApprovalRequired | Whether FA pickups queue for commissioner approval | off |
faDropOnPickupDefault | Whether the drop selector is open by default on a pickup | off |
freeAgentDropRequired | Whether every claim must name a player to drop | off |
freeAgentValidationEnforced | Cap+position checks at FA submit and inside the approve transaction | off |
freeAgentDropRequired makes pickups roster-neutral: the claim form will not submit until a drop is chosen, and the server rejects a claim without one. It needs freeAgentApprovalRequired to be on, because the claim form is the only pickup path that carries a drop. Commissioners are not exempt — to add a player without a drop, use the direct-add button on the player list, which skips the free-agent flow entirely. When it is on, faDropOnPickupDefault has no effect: the selector is always open.
Feature toggles (Features tab)
| Field | What it does | Default |
|---|---|---|
salaryCapEnforced | Cap is hard-blocked at transaction time (off = advisory only) | on |
positionLimitsEnforced | Position limits hard-block (off = advisory only) | on |
monthlyChangeLimitEnabled | Monthly roster change limit is enforced | on |
gameDeadlineEnabled | NHL game-day roster deadline is enforced | on |
rosterMoveCutoffMinutes | Minutes before first NHL game to lock roster moves | 0 |
undoEnabled | The undo-roster-changes feature is available | on |
undoWindowMinutes | How long after a move you can undo it | 15 |
rosterChangePermission | Who can make roster changes: owner or commissioner | owner |
picksEnabled | Whether draft picks and FA picks are shown anywhere in the UI | on |
scheduledDropsEnabled | The scheduled-drop compliance system is active | off |
achievementsEnabled | Whether the achievements system is active | on |
nhlTeamPointsEnabled | NHL standings points contribute to fantasy team scoring | off |
Keeper settings (Keeper tab)
| Field | What it does | Default |
|---|---|---|
keeperSlots | Number of players each team can retain across seasons | 5 |
keeperDeadlineStart | When keeper selection opens (unset = not open) | unset |
keeperDeadlineEnd | When keeper selection closes (unset = no deadline) | unset |
Integrations (Discord tab)
| Field | What it does | Default |
|---|---|---|
discordWebhookUrl | Webhook URL for posting league events into a Discord channel | unset |
leagueType | dynasty (multi-season) or redraft (annual) — drives keeper/draft behavior | dynasty |
Privacy
The League.isPublic field (one level up from LeagueSettings) controls whether the slug-addressable /public/{slug} standings and team pages are visible to non-members. Public leagues appear in the global league list; private leagues are invitation-only.
Defaults are designed to mirror a standard dynasty-style fantasy hockey league. You can change every value — there is no setting that's "FanPoolHQ-wide" or unchangeable per league. When new settings ship in future FanPoolHQ releases, their defaults preserve current behavior so your league is never silently changed underneath you.
See also
- Commissioner Tools — the broader admin surface
- League Setup Wizard — initial configuration walkthrough
- Salary Cap and Position Limits, Monthly Roster Changes, Trade Deadline Rules, Scoring Rules, Pool Scoring and Deadlines — settings in context