Skip to content

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.5

So:

  • 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

PageWhat for
XP rulesConfigure message/voice gain, cooldowns, multipliers, blacklists, announcements.
Level rolesMap XP thresholds to Discord roles.
LeaderboardPublic leaderboard view + reset options.
XP blacklistChannels 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 announcement
  • channel — a specific channel
  • current — the channel where they last messaged
  • dm — 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 roles
  • levelling.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
  • Economy — independent system but often paired
  • Casino — uses Economy (not XP), but conceptually overlaps

Phantom is a product of Hydra Labs. The bot is run as a managed service; you do not need to host it yourself.