Levelling overview
Members earn XP for messages and voice activity. XP advances them through levels; levels can grant Discord role rewards. Drives engagement on most communities.
How XP works
Two sources:
- Message XP — 15–25 XP per qualifying message (random in range), with a 60-second cooldown per member. Empty messages, bot messages, system messages don't count.
- Voice XP — 5 XP per minute spent in voice. Optional toggles control whether muted / deafened / alone-in-channel members still earn.
Both are toggleable + tuneable.
The level curve
Closed-form:
total_xp_for_level(L) = 100 * L^1.5So:
- Level 2 = 283 XP
- Level 5 = 1118 XP
- Level 10 = 3163 XP
- Level 50 = 35355 XP
- Level 100 = 100000 XP
- Level 500 = ~1.1M XP
The exponent of 1.5 keeps early levels fast (most members reach level 10 in a couple of weeks) and late levels gated by sustained activity.
Pages
| Page | What for |
|---|---|
| XP rules | Configure message/voice gain, cooldowns, multipliers, blacklists, announcements. |
| Level roles | Map XP thresholds to Discord roles. |
| Leaderboard | Public leaderboard view + reset options. |
| XP blacklist | Channels where XP isn't awarded. |
Where it lives
Dashboard: Levelling.
Slash commands
/plevel rank [user]— current level + XP for self or another user./plevel leaderboard— server leaderboard./plevel rewards— show the level-role ladder.
Staff-only (gated by levelling.edit team permission):
/plevel set <user> <level>— set someone's level outright./plevel give <user> <xp>— grant XP./plevel reset <user>— wipe their XP back to level 1.
Announcements
When a member levels up, Phantom can announce in:
off— no announcementchannel— a specific channelcurrent— the channel where they last messageddm— direct message
Message template supports placeholders:
{user}— display name{user.mention}— @mention{level}— new level{previous_level}— old level{role}— role earned this level-up (empty when not crossing a rung){rank}— current highest rank role they hold{server}— server name{role|fallback}— render role if earned this flush, else fallback text
The seeded default GG {user.mention}, you reached **{role|level {level}}**! renders "you reached Gold" when Gold is freshly earned and "you reached level 7" on a plain level-up between rungs.
When does an announce fire?
Phantom only posts when there's a real milestone:
- Ladder configured (you've defined level roles): announces only on rank crossings. The auto-curve level number between rungs is suppressed — the ranks ARE the levels, so a plain level transition between Bronze II and Bronze III would just read as noise.
{role}renders the rank just earned; bare{role}(no fallback) is always the current rank, never blank. - No ladder (the curve is the only progression): every level-up announces.
{role}is empty in this mode unless a rung is also crossed. - No transition + no rung crossing: never announces.
Permissions
levelling.view— see leaderboard, XP settings, level roleslevelling.edit— change tunables, level-roles, blacklist, run/plevel set/give/reset
Limits
- 50 level roles per guild
- 200 XP-blacklist entries per guild
- Level cap: 500
