/stats
In-game stat tracking for Mordhau — kills, deaths, score, and (Hardpoint) time-on-point, recorded per round, per game, per match. Tracked modes: Skirmish (SKM) and Hardpoint (HPT) only.
Stats come in three buckets:
- Competitive — officially scheduled league matches
- Casual — scrims (team vs team, unscheduled) and pugs (mixed teams)
- Overall — everything combined
Players are identified by their linked PlayFab ID — run
/identity link or your stats can't be
credited to you. Stats recorded before you link are backfilled automatically once
you do.
/stats player
Your (or another player's) tracked stats, shown as Competitive / Casual / Overall.
userUser(optional)modeString(optional) — filter to SKM or HPT
/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
/stats leaderboard
Top 10 tracked players, sorted by the chosen stat (ties broken by total score).
statString(optional) — K/D (default), Kills, Score, Time on point, Clutches, or Rounds playedtypeString(optional) — Overall (default), Competitive, or CasualmodeString(optional) — filter to SKM or HPT
Ranking normally requires 10+ tracked rounds in the chosen bucket. 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 — 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 same 10-round ranking floor applies per bucket, with the same
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.
/stats import (Organizer)
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).
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}]}]
}]
}HPT games use "segments": [{"side": 0, "seconds": 42, "points": 42}] instead of
rounds, plus per-player timeOnPoint.
/stats reclassify (Organizer)
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. Audited.
idStringtypeString— competitive / scrim / pug
Clutches (1vX) — Skirmish only
Because Skirmish is 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: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 has no clutches: respawns are enabled there, so "last alive" is meaningless. Clutch data only exists on SKM rounds.
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.
- Stat matches are recorded automatically by the collector on servers registered
via
/server add(Skirmish and Hardpoint sessions only), or entered manually via/stats import.