Chat Leveling
Members earn levels from chatting, with optional role rewards at level thresholds.
How leveling actually works
Members earn 15-25 XP for an eligible message, on a 60-second cooldown
per member - so it's driven by genuine activity spread over time, not by however fast someone can type.
Each level needs more XP than the last (the curve is 5×level² + 50×level + 100), so
early levels come quickly and later ones take a while - this is why role rewards are usually set on a
handful of milestone levels rather than every single one.
The commands you'll actually use
This feature has a lot of knobs, but almost every server only ever touches these six:
$xp toggle
$xp [@member]
$xplb [week|month]
$xp addreward <level> <@role>
$xp rewardremove <@role>
$xp overview
Also $xp enable/disable as direct shortcuts to toggle, $rank
as an alias for bare $xp, and /xp for all of these.
$xp overview is the one to reach for if you just want to see every reward you've set up
at a glance, without hunting through addreward calls you remember typing.
Setting up your first reward
Say you want members to get a @Level 10 role once they reach level 10:
- Turn Chat Leveling on, if you haven't already:
$xp toggle. - Create the role in Discord's own role settings (or reuse an existing one) - Pixie doesn't create roles for you.
- Link it to a level:
$xp addreward 10 @Level 10.
That's it - Pixie checks a member's level automatically every time they gain XP and hands out the role
the moment they cross 10, no further action needed. Add as many addreward calls as you want
for different levels. This check re-runs on every message, so it works in both directions - if a
member's level is ever manually lowered below a threshold (via removexp/setxp
below), the matching role reward is automatically taken back next time they talk, not just granted going
forward. To stop giving out a specific reward entirely: $xp rewardremove @Level 10 (this
only removes the reward rule itself - it doesn't retroactively strip the role from members who already
have it).
Creating a full set of level roles fast
Doing this one level at a time - create a role, position it in the hierarchy, addreward it,
repeat - gets old fast if you want a real progression of milestones. autocreateroles does
all of it in one command:
$xp autocreateroles <anchor role>
Give it one role to act as the anchor (wherever in your hierarchy you want the level roles to sit), and
it creates Level 1, 5, 10, 20, 25, 30, 40, 50, 60, 70, 75, 80, 90, and 100 - each one
positioned directly under that anchor, in the correct order (highest level closest to the anchor,
lowest at the bottom) - and registers every one of them as a reward automatically, same as running
autodetectlevelroles right after. Already have some of these roles? It skips creating a
duplicate for any level that already has a matching Level <n> role and just registers
the existing one instead - safe to run more than once. Requires Pixie's own role to be positioned above
the anchor role you pick, same reason booster roles has this requirement - it'll tell you plainly if
that's not the case yet, rather than creating roles it then can't position correctly.
Everything else
The rest of this feature, for servers that want to go further. Every command below needs Manage Guild unless noted.
Every setup command on this page (rewards, roles, message, notify channel) works even while Chat
Leveling itself is off, so you can get everything ready ahead of time - each one just adds a reminder
to its confirmation if the system isn't actually turned on yet ($xp toggle), since it's easy
to set all this up and not realize nothing's live until that's flipped on.
| Command | Does |
|---|---|
$xp setnotify [#channel] | Where level-up messages post (omit to reset to the same channel a level-up happened in) |
$xp excludechannel #channel / removeexcludechannel / listexcludedchannels | Stop a channel's messages from counting toward chat XP/levels at all - e.g. a bot-commands or spam channel |
$xp setmsg [message] | Customize the level-up message (<user>/<levelnum>, or a full script) - omit to just view the current one, reset to go back to the default |
$xp previewlevelup [level] | Shows what the level-up message would look like, without posting anywhere real - defaults to your current level |
$xp testlevelup [level] | Sends the real level-up message to the current channel, end-to-end, as if you just leveled up. (/xp testlevelup [level] [send] combines both - send:false, the default, previews privately; send:true sends for real) |
$xp levelupmsgmode | Toggle between "every level-up" and "only levels that grant a role" (default: role-only) |
$xp boosterxpboost | Toggle +20% XP for server boosters |
$xp autocreateroles <@role> | Creates a full Level 1-100 milestone role set positioned under an anchor role, and registers them all as rewards - see above |
$xp autodetectlevelroles | Auto-register any existing roles named Level <n> as rewards |
$xp purgerewards | Remove every configured reward at once |
$xp toplbpanel | UI for giving a role to whoever currently leads the week/month/alltime leaderboard, live - role picker plus a separate Shoutout Settings screen (channel + message) if you want an announcement when the lead changes. Off by default - most servers won't want one here since a live lead can flip often. (addtoplbreward/removetoplbreward both still work as aliases straight into this panel) |
$xp lasttoplbpanel | UI for giving a role to last week's/month's #1 chatter once that period fully ends, held for the whole next period - decided once, unlike the live version above. Role, a re-earn cooldown (e.g. 30d/1mo, so the same person can't win every single period), and its own separate Shoutout Settings screen. (leaderpanel/setlastperiodleader/removelastperiodleader all still work as aliases straight into this panel) |
$xp reset | Administrator - wipes all chat XP data for the entire server |
$xp addxp/removexp/setxp <@member> <amount> | Directly adjust one member's XP |
$xp autolb <#channel> [period] / autolbremove | A leaderboard message that refreshes itself every 10 minutes |
$xp lbhistory [week|month] | Browse a past week/month's leaderboard (last 12 kept) |
The level-up message can be a full script instead of the plain
<user>/<levelnum> template - see the Scripting page's
extra variables section for {level}/
{level.reward_role} and how the automatic "Earned <role>!" line works in script mode.