Skip to main content

Overview

Leveling tracks XP per member with a curve and cooldown you control, not a fixed formula. Every !level subcommand below requires Manage Guild.
chu writes in #general and Petto replies that chu just leveled up to 15, with a card showing the avatar, level 15 and rank 4

In Discord: a message makes a member level up, and Petto answers it with the level-up message and the level card.

The dashboard’s Leveling pages pick the rank card (you design cards in Image cards) with a preview of it, and set the rules and the XP events.
The Leveling settings page with XP rates, the announcement channel and a preview of the level-up message

Dashboard → Leveling → Leveling: XP per message and per voice minute, the cooldown, the reward roles mode and the level-up announcement with its preview.

Turning it on and setting the rate

liam types !level enable true and Petto answers that leveling is enabled

In Discord: leveling is turned on.

liam types !level xp 15 25 and Petto confirms 15 to 25 XP per message

In Discord: the XP of each message is set between 15 and 25.

liam types !level voice-xp 5 and Petto confirms 5 XP per minute in voice

In Discord: 5 XP for each minute in voice.

liam types !level cooldown 60 and Petto confirms a cooldown of 60 seconds

In Discord: a member earns message XP once a minute at most.

XP per message is a random amount between min and max, on a per-member cooldown. voice-xp is a flat amount per minute in voice, no cooldown.

The XP curve

Total XP per level is (a·L³ + b·L² + c·L) × difficulty, rounded. Existing members’ levels are recalculated against the new curve when you change it, only touch this if you know what you’re doing.
liam types !level curve 1 50 100 3 100 and Petto answers that the curve was updated, with the XP of levels 10, 25 and 50

In Discord: a new curve, with the total XP it asks for levels 10, 25 and 50.

liam types !level max-level 200 and Petto confirms the max level of 200

In Discord: the highest level is now 200.

Defaults: a=1, b=50, c=100, difficulty=2.5, rounding=50.

Notifications

liam types !level notify channel #level-ups --every 5 and Petto confirms the channel mode

In Discord: level-ups go to #level-ups, every 5 levels.

liam sets a reply announcement with its own message and Petto confirms the reply mode

In Discord: the announcement answers in the same channel, with its own text.

liam types !level notify reply --delete_after 30 and Petto confirms the reply mode

In Discord: the announcement deletes itself after 30 seconds.

liam gives level 50 its own message and Petto answers that level 50 has a message of its own

In Discord: level 50 gets a message of its own.

liam types !level voice-notify channel #level-ups and Petto confirms the voice announcements in channel mode

In Discord: voice level-ups are announced in #level-ups.

mode is off, reply (in the channel they leveled up in), channel (fixed), or dm. Voice level-ups can also be reply: they go to the chat of the voice channel the member is in. every limits announcements to every N levels instead of every single one. message supports {user}, {level}, {level_xp}, {level_rank}, {level_role} (the reward role they just earned) and every embed variable. Like every DM from Petto, this one starts with a grey From <server> line and has info, delete and report buttons: see DMs from Petto.
Use --message, --every and the other names for anything after the channel. The options are read in order (mode, channel, embed, embed_template, every, message…), so !level notify reply "{user} hit level {level}!" would save your text as the name of a saved embed.
The dashboard has all of this in the Leveling page: a switch for the reply and the ping, the time to delete, and one line for each level with its own message, like 10: {user} is now level {level}!.

Examples

Command
Result
chu writes in #general and Petto replies: GG @chu, you just reached level 12

In Discord: chu levels up and Petto answers the message with the classic text.

Variables

The whole list, with {level_xp_current} and {level_xp_needed}, is in Variables. Variables are found whatever their case and with spaces inside the braces, so {user.mention}, { User.Mention } and {USER_MENTION} all work, and so do the names other bots use ({mention}, {member}, {level.xp}, {level.rank}…). A variable Petto does not know stays as you wrote it, so a typo is easy to see.

Rank and rankings

!rank answers with a card (a picture with the avatar, name, level, position and a progress bar), the embed, or both, depending on !level rank-style. The embed shows the level, the position out of all ranked members, the XP of this level so far and the XP it needs, the progress bar and the total XP, plus the time in voice for a voice rank. card names the image card to use; a server without one gets a default card, with its own color for voice.
chu types !rank and Petto answers with a card: chu, level 15, rank 4, 2,050 of 5,950 XP with the bar

In Discord: the default rank card.

chu types !rank @shi voice and Petto answers with the voice card of shi: voice level 18, rank 2

In Discord: the voice rank of another member, on the teal card.

chu types !rank and Petto answers with an embed: level 15, server rank 4 out of 312, 2,050 of 5,950 XP, progress 34% with the bar and the total experience

In Discord: the rank as an embed, with rank-style embed.

chu types !rank and Petto answers with the embed of the rank and the card as its picture

In Discord: the embed with the card inside it, with rank-style both.

liam types !level rank-style both myrank and Petto confirms a card and an embed using the card myrank

In Discord: !rank now answers with the card and the embed, using the card myrank.

!top shows the leaderboard for messages or voice. period is all (default), week or month, and the weekly and monthly rankings start empty by themselves each week and month.
chu types !top and Petto answers with the Petto Land leaderboard: Chillet level 31, kira 27, mia.draws 24, chu 15 and more, page 1 of 32

In Discord: the leaderboard of the server, 10 members per page with buttons.

chu types !top 1 messages week and Petto lists the XP of this week: kira 4,120, zoe_plays 3,610, chu 2,985 and more

In Discord: the ranking of this week, by the XP earned in the week.

chu types !top 1 voice and Petto answers with the voice leaderboard: Chillet voice level 22, shi 18, zoe_plays 14 and more

In Discord: the voice leaderboard.

The embed is laid out like the ones of other level bots: the member on top with the avatar at the side, then one field under another (Level, Server Rank, Experience and Progress with the bar), and the total experience with the time at the bottom. It has no color. The default card, when a server has not designed one, has the avatar on the left, the level and the bar next to it, in Petto’s peach (teal for voice), over a picture that comes with Petto.
The Rank card page with Card picked, the default rank card, the level card for level-ups, the card preview for liam at level 12 and the embed preview

Dashboard → Leveling → Rank card: card, embed or both, the cards of the rank and of the level-up, and the previews.

Public leaderboard page

A server can show its ranking on the website. It is off until you turn it on in the dashboard (Leveling, then Leaderboard, Public page).
The Leaderboard page with the public page on, the name pettoland, the invite discord.gg/pettoland, the link petto.sbs/lb/pettoland and the top members by XP

Dashboard → Leveling → Leaderboard: the Public page switch, the name in the address, the Join button link and the ranking.

  • The page is at petto.sbs/lb/<name>. The name is the one you choose (2 to 32 letters, numbers or dashes), or the server ID if you leave it empty. It also exists as /es/lb/<name> and /pt-br/lb/<name>.
  • It shows the top 500 by messages or by voice, 25 per page: name, picture, level and XP of each member. Nothing else of a member is shown, and a member who left appears as a former member.
  • An optional Join button takes people to an invite of your choice (it has to start with https://).
  • Turning the switch off makes the page answer “not public” at once.
The public leaderboard page of Petto Land with Messages and Voice tabs, Join the server and Copy link buttons, and the members with their level, XP and messages

On the website: petto.sbs/lb/pettoland, the public ranking of Petto Land with the Join button.

The voice leaderboard of the dashboard: Chillet voice level 22, shi 18, zoe_plays 14, kira 12 and more, with voice XP and minutes

Dashboard → Leveling → Voice leaderboard: the members by voice XP, with their minutes in voice.

Anti-abuse rules

liam types !level rules and Petto lists the minimum length, repeated text, voice needs, chat limit, daily and streak bonus, members who leave and multipliers

In Discord: with no options, the rules of the server now.

liam types !level rules min_chars 5 and Petto answers Updated with the rules, now a minimum length of 5 characters

In Discord: messages under 5 characters stop earning XP.

liam types !level rules anti_repeat on and Petto answers Updated with Ignore repeated text on

In Discord: repeated text earns no XP again.

liam types !level rules voice_min_members 50 and Petto answers that voice_min_members takes a whole number from 1 to 20

In Discord: a value out of range is refused and Petto says what the rule takes.

With no options it shows the current values. The settings are: New servers start with 3 characters, repeat protection on, and 1 person needed in voice.
The Start from a profile card with Relaxed, Balanced and Strict, the Chat card with the minimum length and the daily XP limit, and the Voice card with the people needed and the XP while alone

Dashboard → Leveling → Rules and events: the profiles, and the rules of chat and of voice.

XP events

liam types !level event add weekend 2 2d all and Petto confirms weekend, number 3: x2 XP for 2 days, starting now

In Discord: a double XP weekend that starts now.

liam types !level event add voicenight 1.5 6h voice 1d and Petto confirms x1.5 voice XP for 6 hours, starting tomorrow

In Discord: a voice event that starts tomorrow.

liam types !level event list and Petto lists weekend x2 all XP ending in 2 days, and voicenight x1.5 voice XP starting in 24 hours

In Discord: the events running and coming.

liam types !level event remove 4 and Petto answers XP event removed

In Discord: an event cancelled by its number.

An event multiplies the XP earned for a number of hours or days. applies_to is all, text or voice, and starts_in schedules it for later instead of starting it now. The multiplier goes from 1.1 to 20, an event lasts from 1 minute to 60 days, and a server can have 25 events running or coming at once.
The XP events card with weekend at x2 for all XP and voicenight at x1.5 for voice, and the fields name, multiplier, applies to, lasts and starts in

Dashboard → Leveling → Rules and events: the XP events, and the form to add one.

Daily bonus and streaks

Set daily_bonus and streak_bonus with !level rules to give extra XP for the first activity of the day, plus an extra amount for each earlier day in a row, up to streak_max_days. The streak is {level_streak} in the level-up messages.
liam types !level rules daily_bonus 50 and Petto answers Updated with Daily bonus 50 XP and the streak bonus of 10 XP per day, up to 7 days

In Discord: 50 XP for the first activity of each day.

The Daily bonus and streak card with 50 XP a day, 10 XP per earlier day and the streak bonus stopping after 7 days

Dashboard → Leveling → Rules and events: the daily bonus and the streak.

Voice leveling

Voice time has its own settings, so voice and message levels can follow different rules.
liam types !level voice-enable true and Petto answers that voice leveling is enabled

In Discord: voice leveling is turned on.

liam types !level voice-curve 1 50 100 3 100 and Petto answers Voice XP curve updated with the XP of levels 10, 25 and 50

In Discord: a new voice curve with its preview.

liam types !level voice-max-level 300 and Petto confirms the max voice level of 300

In Discord: the highest voice level is now 300.

liam types !level voice-role-mode all and Petto confirms the voice reward role mode: all earned

In Discord: members keep every voice reward role.

liam types !level voice-ignore #AFK and Petto answers that AFK was added to the ignored voice channels

In Discord: the AFK channel stops giving voice XP.

  • voice-enable turns leveling by voice time on or off (the amount per minute is !level voice-xp).
  • voice-curve is the same formula as the XP curve, applied to voice, and its defaults are the same too (a=1, b=50, c=100, difficulty=2.5).
  • voice-max-level is the highest voice level (default 1000).
  • voice-role-mode says if members keep every voice reward role (all) or only the highest (highest, the default).
  • voice-ignore toggles a voice channel, or a whole category, in or out of voice XP, like !level ignore does for text channels. Run it again to undo it.
  • Voice levels have reward roles of their own: !level reward add 10 @Talker --type voice. See Level Rewards.
The Voice leveling page, on, with 5 XP per voice minute, only the highest reward role, the announcement off, its message and preview, and the AFK channel ignored

Dashboard → Leveling → Voice leveling: the switch, the XP per minute, the reward roles, the announcement with its preview and the ignored channels.

Who earns XP

liam types !level ignore #bot-commands and Petto answers that it was added to the ignored channels

In Discord: a channel that earns no XP.

liam types !level ignore #STAFF and Petto answers that STAFF was added to the ignored categories

In Discord: a whole category that earns no XP.

liam types !level ignore --role @Muted and Petto answers that @Muted earns no XP now

In Discord: a role whose members earn no XP.

liam types !level ignore --only_role @Members and Petto answers that @Members was added to the roles allowed to earn XP

In Discord: only the members with this role earn XP.

Running it again on the same one toggles it back. The options that are not the first one go with --, like --role @Muted. All of these can also be set in the dashboard, in Leveling and in Rules and events.
  • channel can be a channel or a category. Channels on the list, and every channel of a category on the list, grant no XP.
  • role is a role whose members earn no XP.
  • only_role picks the roles that are the only ones allowed to earn XP. With none picked, everyone can earn XP.
The Who earns XP card with Muted in the roles that earn no XP and nothing in the only roles that earn XP

Dashboard → Leveling → Rules and events: the roles that earn no XP and the only roles that earn it.

Members who leave and come back

liam types !level rules restore_roles on and Petto answers Updated: their XP is kept, reward roles given back when they return

In Discord: members who come back get their reward roles back.

liam types !level rules reset_on_leave on and Petto answers Updated: their XP is wiped, reward roles given back when they return

In Discord: the XP of a member who leaves is wiped.

liam types !level manage sync and Petto answers that it checked 12 members with a level and gave the missing reward roles

In Discord: the members with a level get the reward roles they were missing.

  • restore_roles (on by default): a member who returns gets back the reward roles their levels earned.
  • reset_on_leave (off by default): the XP and level of a member who leaves are wiped. Off keeps them.
  • manage sync checks every member who has a level and gives the reward roles they earned and do not have yet, for message and voice levels. It is for after adding rewards to a server that already has levels. It checks up to 2000 members each time, with a short pause, so run it again for the rest of a big server.
The Members who leave and come back card with Give the reward roles back on and Wipe the XP and level off

Dashboard → Leveling → Rules and events: what happens to the XP and the reward roles of a member who leaves.

Join bonus

liam types !level join 0 5 and Petto answers that new members will now start with level 5

In Discord: new members start at level 5.

liam types !level sync-join and Petto answers Sync complete, 3 members affected

In Discord: the bonus is given to the members who are still at zero.

Grants new members a starting XP/level. level takes priority if both are set. sync-join retroactively applies the current bonus to every member who’s still at zero.

Manual XP/level management

liam types !level manage xp add @nico 500 and Petto answers Added 500 XP for @nico

In Discord: 500 XP added to a member.

liam types !level manage xp transfer @mia.draws 200 @zoe_plays and Petto answers Transferred 200 XP for @mia.draws to @zoe_plays

In Discord: 200 XP moved from one member to another.

liam types !level manage level set @nico 12 and Petto answers that nico is now level 12

In Discord: a member set at level 12 (the XP follows).

liam types !level reset @maxwell and Petto answers that maxwell's XP and level were reset and the reward roles removed

In Discord: the XP, the level and the reward roles of a member are wiped.

action is add, set, remove, or (XP only) transfer to another member. reset wipes a member’s XP/level and removes their reward roles.

Status

Shows the full current configuration in one place.
liam types !level status and Petto lists every setting: XP, voice, curves, max levels, role mode, announcements, rank style, rules, join bonus, ignored channels and roles, rewards and multipliers

In Discord: the whole configuration in one card.

!levelconfig (short name !xpconfig, needs Manage Server) answers with a card of what this server has stored for leveling, and every !level command to change it.
liam types !levelconfig and Petto answers with the Levels config card: every stored setting, then the commands to change it and more commands, and a Documentation button

In Discord: the settings card of the module, with every command to change it.

Level Rewards

Role rewards and XP multipliers.