Skip to main content

Projections and VORP

VORP measures a player's projected value above a replacement player. Use this page to predict how weekly inputs change lineup, waiver and draft values.

When does the refresh run?​

SettingBehavior
ScheduleDaily at 18:00 America/Chicago
SeasonCURRENT_YEAR
HorizonUpcoming week through min(week + 3, 18)
Week budget600 seconds shared across three stages
Target-week failureStop; fail the Job
Future-week failureSkip that week's remaining stages; try other weeks; fail the Job
Completed workKeep committed weeks; no automatic whole-run retry

The resolver chooses the earliest regular-season week with an unfinished game. A finished Thursday game does not advance the week.

Week resolution and ingestion edge cases
ConditionResult
Schedule download failsSix attempts; backoff 5, 10, 20, 30, 30 seconds; then fail
Missing schedule or stale season configurationFail rather than guess
Current regular season completeNo upcoming week; scheduled jobs exit successfully
Explicit API weekUse the requested week; trade horizons stop at the league's regular-season end
Sleeper scoring field missing/nullStore 0 for a known player
Player absent from response or unknown locallyDo not create a projection row

sync_projections reads regular-season pts_ppr for QB/RB/WR/TE and upserts only projected_points, preserving advanced metrics. sync_kicker_dst supplies ESPN K/D-ST projections.

How is VORP calculated?​

coefficient = clamp(1 + 0.06 × market_z + 0.03 × signal_z, 0.85, 1.15)
adjusted_projected_points = projected_points × coefficient
vorp_base = adjusted_projected_points − replacement_baseline[position]
expected_depth = max(1, round(0.5 × league_starting_demand[position]))
ratio = clamp(positive_VORP_free_agent_count / expected_depth, 0, 1)
scarcity_multiplier = 1 + 0.35 × (1 − ratio)
vorp_score = vorp_base × applicable_scarcity_multiplier
InputRule
market_zStandardize distinct NFL team implied totals within season/week
signal_z: QBStandardize negative pressure rate allowed
signal_z: WR/TEStandardize separation
signal_z: RBStandardize depth-chart improvement
Signal groupsPosition/season/week; clamp z to ±2
Missing/degenerate signalContribute 0 for null, fewer than two observations or zero standard deviation
Usage sharesExcluded because projections already include usage
Scarcity eligibilityOnly unrostered players with positive base VORP; everyone else uses 1.0
Predict the result

12 adjusted points minus an 8-point baseline gives 4 VORP, or 5.4 at maximum scarcity. A 6-point player stays at −2, even when the position is thin.

Where is the replacement line?​

Roster stateBaseline
Populated rostersHighest adjusted projection among non-starters/free agents at the position
Pre-draftFirst player beyond structural starter demand: rank N+1
Pool shorter than demandPool minimum
Empty position poolQB 10; RB/WR 8; TE 5; K/D-ST 7
Starter demand, FLEX allocation and default league shape

Starter demand is positional slots × team count plus allocated FLEX slots.

Allocation inputRule
FLEX typesRB/WR/TE, RB/WR, WR/TE; restrict positions to the slot
At least ten observed eligible FLEX rowsUse observed position shares
Fewer than ten rowsRB 0.5, WR 0.4, TE 0.1; restrict and normalize
Integer roundingLargest remainder; allocations sum to total FLEX demand
Missing league settingsTen teams; QB 1, RB 2, WR 2, TE 1, RB/WR/TE 1

What happens with missing data?​

The pipeline updates existing exact-week rows with the coefficient, adjusted points, base VORP, scarcity, final VORP and defense multiplier. An empty week returns zero updates.

Refresh coverage is not guaranteed

A four-week refresh attempt does not guarantee four scored weeks. Trade scoring requires exact-week metrics; lineup and waiver reads have separate fallback rules.

Defense adjustmentBehavior
MATCHUP_WEIGHTING_ENABLED=true, week 1clamp(1 + 0.05 × opponent_defense_strength_z, 0.9, 1.1)
Missing strengthNeutral 1.0
Disabled or another weekPersist null; lineup consumes it as 1.0
EffectLineup objective only; canonical VORP stays unchanged

Positive defense strength means a weaker defense.