/stats
Inspect supported team-match statistics and administer tracked matches.
Who can use it: League members; import and reclassification require an Organizer.
In-game team-match statistics for Mordhau and Chivalry: Medieval Warfare — kills, deaths, score, and available mode-specific measurements, recorded per round, per game, per match. Mordhau offers Skirmish (SKM) and Hardpoint (HPT); Chivalry offers Last Team Standing (LTS) and Team Objective (TO). The command lists all four modes, but a League accepts only modes for its configured game. Duel and opt-in Deathmatch combat are covered separately in tracking profiles.
Stats come in three buckets:
- Competitive — officially scheduled league matches
- Casual — scrims (team vs team, unscheduled) and pugs (mixed teams)
- Overall — everything combined
Players need the Identity for their League’s game: PlayFab ID for Mordhau, or a verified Steam account for Chivalry. Use /identity link for the appropriate linking flow. Eligible stats recorded before linking are backfilled once the Identity is connected.
/stats player
Your (or another player's) tracked stats, shown as Competitive / Casual / Overall.
userUser(optional)modeString(optional) — Skirmish (SKM), Hardpoint (HPT), Last Team Standing (LTS), or Team Objective (TO); must match the League’s game
/stats match
One tracked match's breakdown: per-game mode, map, final score, winner, and top performer.
idString— the stat match id shown on stat embeds and imports
The plan can limit access to old match details (Free defaults to 30 days; Pro to 180 days; Ultimate and Enterprise are unlimited, with entitlement overrides possible). A match outside that browsing window is rejected with an upgrade message; the stored match and its aggregates are retained. Player aggregates and ratings are not windowed by this display limit.
/stats leaderboard
Tracked players sorted by the chosen stat. Visible depth depends on the League’s plan.
statString(optional) — K/D (default), Kills, Score, Time on point, Clutches (1vX won), Rounds played, or Round Impact (WP swing)typeString(optional) — Overall (default), Competitive, or CasualmodeString(optional) — Skirmish (SKM), Hardpoint (HPT), Last Team Standing (LTS), or Team Objective (TO); must match the League’s game
Ranking uses the League’s configured minimum (50 by default). The board always renders: while nobody meets the minimum it shows all players marked provisional, and with no data at all it says so instead of erroring.
Persistent leaderboards
Besides the on-demand command, a channel can host always-current leaderboard embeds — one message per bucket, edited in place (never reposted, so message links stay stable):
- Top row: Kills, Score, K/D — top 5 each
- Second row: Clutches, Time on Point, Rounds Played, and Round Impact — top 3 each
- Distinct colors per bucket (🏆 Competitive red, 🎮 Casual blue, 🌐 Overall gold)
Set it up with /config stats-leaderboard-channel: and pick buckets with
/config stats-leaderboard-buckets: (default: competitive + overall). The embeds
refresh automatically whenever approved stats change: a tracked match finishes,
an organizer approves/voids/restores anything, or a match is imported or
reclassified. The League’s configured ranking floor applies per bucket, with a provisional fallback.
The channel may be the team elo leaderboard channel — the stat messages are tracked and survive its repost cycle — or any other channel you prefer.
/admin tracking import
/stats import: organizer-only stat tools now live under /admin tracking so /stats is purely a player command.Import a stat match from a JSON file. Imports are idempotent — re-importing the
same externalId updates instead of duplicating. Validation errors name the exact
field (games[0].players[2].score: expected a number). The attachment must be a
Discord CDN file smaller than 5 MB. Importing queues normalization and rating
projection after the command acknowledges.
fileAttachment— a StatMatch payload:
{
"contractVersion": 1,
"externalId": "comp-1-2026-08-03-2100",
"matchType": "competitive",
"server": "comp-1",
"startedAt": 1754250000000,
"games": [{
"mode": "SKM",
"map": "Moshpit",
"winnerSide": 0,
"finalScore": {"side0": 7, "side1": 4},
"players": [{"playfabId": "77A5DDC1BC678308", "name": "ore023", "side": 0,
"kills": 12, "deaths": 8, "teamKills": 0, "suicides": 0, "score": 1450}],
"rounds": [{"index": 0, "winnerSide": 0,
"players": [{"playfabId": "77A5DDC1BC678308", "kills": 2, "deaths": 0, "score": 220}]}]
}]
}This is a minimal illustrative legacy contract-v1 example. It does not provide complete measured participation or enhanced-mod coverage. Do not use it as proof that an import qualifies for current player ratings. See tracking contracts and coverage.
HPT games use "segments": [{"side": 0, "seconds": 42, "points": 42}] instead of
rounds, plus per-player timeOnPoint.
/admin tracking reclassify
Move a match between buckets (e.g. a scheduled match that was detected as a scrim). Only stat bucketing changes — league match results and Elo are never touched. Player ratings are rebuilt asynchronously, and the action is audited.
idStringtypeString— competitive / scrim / pug
Clutches (1vX) — one-life rounds
Because Skirmish and Last Team Standing are one life per round, the collector tracks the full alive pool
and detects clutch situations: the moment a player becomes their team's last
one standing against 2 or more living enemies. If their team then wins the
round, that's a 1vX clutch won — announced live in the stats channel
(🔥 CLUTCH — name won the 1v3!), shown on /stats player
(🔥 3 clutches (best 1v3)), and rankable via
/stats leaderboard stat:clutchWins (shown in Discord as Clutches). Failed attempts are recorded too.
- X is fixed at the moment the clutch begins — killing two of three enemies and finishing 1v1 still counts as the 1v3 it started as.
- A mid-round disconnect counts as an elimination for the alive pool (but not as a death for the leaver), so clutch detection can't be cheated by rage-quits.
- 1v1 games never produce clutches — X must be ≥ 2.
- Hardpoint and Team Objective have no one-life clutches: these modes allow respawns. Clutch data applies to recorded SKM/LTS rounds with the required alive-pool evidence.
Conventions
- Suicides count as deaths; team kills are tracked separately and never count toward kills or K/D.
- Voided rounds/games/matches are excluded from all aggregates.
- Games below the league's minimum match format do not qualify as team matches. Duel and presence profiles have separate recording rules.
- Stat matches are recorded automatically by the collector on servers registered
via
/server add(the League’s supported SKM/HPT or LTS/TO team modes), or entered manually via/admin tracking import.