Exactly how every number on this site is produced — no hidden weighting, no fabricated data.
FPL Template builds every squad template from the public Fantasy Premier League API at request time. Nothing here is a black box: the weight tables below are rendered directly from src/lib/templates/weights.ts — the same module the scoring code imports — so this page can never drift from what actually runs.
How each of the 7 templates is built.
The 15 players the crowd already owns, ranked by overall selection percentage.
Every player's score is simply their overall selection percentage, clamped to 0–100. No fixtures, form, or value factors — this template exists purely to answer "what does the crowd already own?". The 15-man squad is then assembled from those scores by the same optimiser every template uses (see Optimiser behaviour).
Scores players by ownership within a live-sampled cohort of the top 100 (or top 10,000) overall-rank managers, with a small bonus for captaincy share within that sample: the sample-ownership percentage plus min(10, captainPct × 0.2), capped at 100. A player never observed in the sample scores 0 with an explicit reason — it is never inferred as "0% owned" from missing data. See Elite-manager sampling for how that cohort is built.
Players whose clubs have the kindest run of fixtures over the chosen horizon. Default horizon: 5 gameweeks (user-selectable to 3 or 8 on the Fixtures page and via the template's horizon parameter).
| Factor | Weight |
|---|---|
| Fixture difficulty — lower average opponent FDR over the horizon scores higher | 30% |
| Recent form (FPL's rolling average) | 20% |
| Expected minutes — chance of playing blended with season minutes share | 15% |
| Involvement — clean-sheet potential (GKP/DEF) or xGI (MID/FWD) | 15% |
| Fixture count — bonus for extra fixtures (double gameweeks) in range | 10% |
| Home/away split — small bonus for a home-heavy run | 5% |
| Value — points banked per £m, rescaled against the player pool | 5% |
| Total | 100% |
Players in the best recent scoring form, sanity-checked against underlying stats.
| Factor | Weight |
|---|---|
| Recent form (FPL's rolling average) — the primary signal by design | 40% |
| Underlying attacking output (xGI), to avoid chasing bonus-point noise | 25% |
| FPL's own next-fixture points projection | 20% |
| Minutes reliability — a hot streak from a rotation risk is worth less | 15% |
| Total | 100% |
Filters to players owned by fewer than 10% of managers (a hard filter, not a scoring penalty — anyone at or above the threshold is excluded outright), then ranks the survivors on:
| Factor | Weight |
|---|---|
| Recent form — still matters, this shouldn't be a pure punt | 30% |
| Fixture run over the horizon (default 5 gameweeks) | 30% |
| Underlying attacking output (xGI), since low-owned players often lack a large sample | 25% |
| Minutes reliability | 15% |
| Total | 100% |
A medium-term blend intended for wildcard/free-hit planning across the full 15, not just the XI.
| Factor | Weight |
|---|---|
| Medium-term form | 25% |
| Fixture run over the next 5 (a wildcard is a medium-term commitment) | 25% |
| Minutes reliability — you're stuck with the squad for weeks | 20% |
| Budget efficiency, since a wildcard has to fund 15 players at once | 15% |
| FPL's own next-fixture points projection | 15% |
| Total | 100% |
Every weighted score is a 0–100 weighted average of its factors (weights normalised by their sum, so they don't strictly need to total 100% — we keep them at 100% by convention so the numbers double as "share of the final score"). Unavailable or doubtful players are scaled down by an availability multiplier rather than excluded outright, except for Differentials' ownership filter, which is a hard cut.
Enforced in code, validated, never silently bent.
Greedy fill → budget repair swaps → cheapest-legal fallback. Never silently illegal.
Every squad is run through the same structured validator afterwards (squad size, no duplicates, exact position counts, club cap, budget, and a legal XI formation). A squad is only ever marked valid: true when it passes every check — the UI always reads that flag and the warnings list rather than assuming a build succeeded cleanly.
How Top 100 / Top 10k ownership is measured — and what happens when it can't be.
validEntries count against the attempted sampleSize, never silently excluded from the denominator.validEntries, not the requested sample size.Live sampling is only possible for the current gameweek— a season in progress has one true "top 100 right now". Historical top-manager ownership for a past gameweek requires a stored snapshot; if none exists, it is reported unavailable rather than recomputed from today's standings (which would misrepresent who was actually in the top ranks at the time).
Sample ownership is never the same thing as overall ownership — the two are always labelled separately wherever both appear, and a failed or unavailable sample retrieval is always reported with its reason, never masked by falling back to overall ownership.
{ ok: false, reason } honestly wherever they're used (the Compare page shows this inline) until standings populate.Public FPL API, proxied and cached server-side.
What's stored, and what is deliberately never recomputed.
A template snapshot records, for one season/gameweek/template combination: the formation, total cost, budget, confidence score, methodology text, and every player's role (XI or bench), bench order, captaincy, price, and ownership at that point in time.
History is never recomputed.A past gameweek's "current form" or "current ownership" is meaningless once that gameweek has been played — so a historical view only ever reads a previously saved snapshot. If none was saved, it is reported unavailable with an explicit reason, not silently regenerated from today's live data.
How the /analyse xPts model works, and what its keep/monitor/sell verdicts mean.
Every player gets a per-match expected-points estimate blended from three independent anchors, each already expressed in FPL point units (not the 0-100 scores the template models above use):
| Factor | Weight |
|---|---|
| Recent form (FPL's rolling average) — substituted pre-season with the player's most recent past-season points-per-match, when known | 35% |
| Our own bottom-up build: minutes-adjusted appearance points plus position-appropriate attacking/defensive involvement | 35% |
| FPL's own next-fixture points projection (epNext) | 30% |
| Total | 100% |
Any anchor FPL hasn't published for a player (no epNext yet, or — pre-season — no form and no past-season data) is omitted and its weight redistributed across the remaining anchors, so the blend always sums to 100% of whatever signal is actually available; the bottom-up anchor never goes to zero purely because the other two are thin, which is what keeps the model from collapsing pre-season.
The blended per-match estimate is scaled by an availability multiplier (status / chance of playing), then by a fixture-difficulty multiplier ranging 0.75×–1.25× (hardest fixtures at the low end, easiest at the high end), and multiplied by the actual fixture count over the selected horizon (1, 3 or 5 gameweeks) — so a blank gameweek projects to 0 points and a double gameweek projects higher, with no special-casing needed for either.
Pre-season mode:before a player has any minutes this season (form pinned at 0 by FPL), the form anchor is substituted with their most recent past season's points-per-match when available, and every projection built this way is labelled "provisional" in its basis string.
Each player accumulates a severity score from every triggered signal (unavailable/doubtful status, a low chance of playing, a poor fixture run, a low xPts projection, heavy outward transfer momentum, or an already-falling price). A total severity of 3+ is verdicted sell; 1+ is monitor; anything below that is keep.
Squad-level structure warnings fire independently of individual player verdicts:
Transfer affordability on the Analyse your team page is computed from each replacement's current listed price, not a true post-sell-on-fee selling price — the public FPL API doesn't expose a manager's original purchase price or accrued profit (FPL sells a long-held riser at a blend of buy/sell price, not the full current price). Suggested transfers are therefore directionally correct, not exact-to-the-penny; real in-game affordability may be slightly more generous than what's shown. Points-hit maths assumes -4 per transfer beyond the free transfers you select — the public API doesn't reliably expose a manager's actual banked free transfers, so that number is user-selectable rather than assumed.
Questions about a specific number on the site? Every template page links back to its relevant section here. See also Aboutfor the project's independence disclaimer and data-source credit.