A Discord economy bot pays members in coins for taking part and gives them a shop to spend them in, and a leveling bot turns activity into XP, levels and roles. Ready-made bots cover both. As of September 2026, Arcane's free plan has message XP and up to 15 level roles, Tatsu's free tier gives 10 leveled roles and a server store, and UnbelievaBoat's free store holds 25 items. MEE6's plan comparison lists XP and Levels and its Economy plugin as Premium features ($11.99 a month).
A custom bot is worth paying for when the rules are yours: XP from match results or your own game's data, seasons on your calendar, shop items that grant perks you define, and a leaderboard on your own website. I build those on your own Discord application. I don't build casino games or anything that turns coins into money.
What the bot does
For members
- They chat as usual. The bot awards XP at most once a minute, so a burst of 10 messages counts once.
- At level 5 they get the Regular role and a short note in the level-up channel. At level 20 a role opens the channel for event hosts.
/dailypays coins with a streak bonus, and/shopsells perks: a name color for 30 days, access to a channel, a spot in the next custom game.- The leaderboard shows the top 10 in Discord and everyone on a page on your site, where members sign in with Discord to see their own history.
For admins
- XP rules per channel. No XP in bot-command channels, extra in event channels, voice XP with its own rules.
- A logged
/xp givefor event winners and a matching remove, so every manual change has a name and a reason. - Seasons. End a season with one command: the leaderboard is archived, top finishers get a season role, and XP and coins reset.
- An economy view. Coins created and spent per week, so you spot inflation early.
The sign-in works like the Discord login I built for the Rivals League website.
XP rules that spam can't farm
Most leveling bots count messages, so the design question is what shouldn't count.
- A cooldown per member. One award per minute, however fast someone types. With the rules below, level 5 takes about an hour of steady chat (58 counted minutes on average in my tests).
- Channel weights. Zero in bot commands and memes, 1.5 in the channel you want busier.
- Voice XP with conditions. Count a minute only when two or more people who aren't bots are in the channel, it isn't the AFK channel and the member isn't deafened, which Discord's voice state events report.
- Text-based filters, if you want them. Skipping one-word messages or repeated text needs the privileged Message Content intent. Apps seen by fewer than 10,000 users switch it on in the Developer Portal; above that, Discord reviews the request.
- Alt accounts. No XP until an account has been in the server for a set time, and limits on coin transfers between members, so a farm of alts can't feed one main account.
The rules live in their own file, so they can be tested and tuned without touching Discord:
// xp.js: the XP rules, kept apart from Discord so they're easy to test and tune.
const COOLDOWN_MS = 60_000; // one award per member per minute, however fast they type
const CHANNEL_WEIGHTS = new Map([
['BOT_COMMANDS_CHANNEL_ID', 0], // no XP here
['EVENTS_CHANNEL_ID', 1.5], // bonus channel
]);
// XP needed to get from `level` to the next one. It grows with the square of the level.
const xpToNext = (level) => 5 * level ** 2 + 50 * level + 100;
function levelFor(totalXp) {
let level = 0;
let left = totalXp;
while (left >= xpToNext(level)) {
left -= xpToNext(level);
level += 1;
}
return level;
}
// member: { xp, level, lastXpAt }. Returns null when nothing was awarded.
function awardMessageXp(member, channelId, now = Date.now()) {
if (now - member.lastXpAt < COOLDOWN_MS) return null;
const weight = CHANNEL_WEIGHTS.get(channelId) ?? 1;
if (weight === 0) return null;
const gained = Math.round((15 + Math.floor(Math.random() * 11)) * weight); // 15 to 25, weighted
member.xp += gained;
member.lastXpAt = now;
const before = member.level;
member.level = levelFor(member.xp);
return { gained, level: member.level, leveledUp: member.level > before };
}
module.exports = { awardMessageXp, levelFor, xpToNext };And the bot that uses them. Note the intents: Guilds and GuildMessages only.
const { Client, Events, GatewayIntentBits } = require('discord.js');
const { awardMessageXp } = require('./xp');
// Level -> role ID. The bot's own role must sit above these in Server Settings > Roles.
const LEVEL_ROLES = new Map([
[5, 'LEVEL_5_ROLE_ID'],
[10, 'LEVEL_10_ROLE_ID'],
]);
const members = new Map(); // swap for a database before launch
// No Message Content intent: XP only needs to know that a message was sent.
const client = new Client({
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],
});
client.on(Events.MessageCreate, async (message) => {
if (message.author.bot || !message.inGuild()) return;
const key = `${message.guildId}:${message.author.id}`;
const member = members.get(key) ?? { xp: 0, level: 0, lastXpAt: 0 };
members.set(key, member);
const result = awardMessageXp(member, message.channelId);
const roleId = result?.leveledUp && LEVEL_ROLES.get(result.level);
if (roleId) {
await message.member.roles.add(roleId, `Reached level ${result.level}`).catch(console.error);
}
});
client.login(process.env.DISCORD_TOKEN);Tested with discord.js 14.27.0 on Node 24.15.0 without logging in: spam inside the cooldown earns nothing, a zero-weight channel earns nothing, bots and DMs are ignored, the level 5 role is added once, and a role the bot isn't allowed to assign is logged instead of crashing it. A production build keeps members in a database and backfills roles when an admin grant skips a level.
Designing the economy
An economy is a set of sources, where coins come from, and sinks, where they go. Sources are chat, /daily, event prizes and staff grants. Sinks are shop items, timed perks that expire and fees on transfers between members.
If sources outgrow sinks, coins pile up, prices stop meaning anything and the shop empties. The fixes are dull and they work: timed items instead of permanent ones, a few expensive long-term goals, a cap on daily earnings and a season reset every few months. I set the numbers with you and check them after the first month.
Shop items that work well are the ones members can't get otherwise: a role that opens a channel, a name color, a vote on the next event, early access to a build. Real-world rewards such as merch discount codes can be shop items too, as long as members earn them rather than win them by chance.
Game and league data is where custom pays off. XP can come from match wins in your league database, tournament placements or your game's API instead of chat. The bot reads results on a schedule or from a webhook, writes each award to the audit log with its reason, and the leaderboard updates without anyone typing a command.
What I won't build
No casino games, no buying coins with real money, no cashing out and no paid loot boxes. My pricing page lists gambling and casino bots among the things I decline.
Discord's Gambling Policy is broken when four things are true at once: a payment or wager of real-world value, a prize of real-world value, an outcome decided mostly by chance, and a law that prohibits the activity. It counts virtual currency as real-world value when it has a market value or can be exchanged for money or goods. The Developer Policy bans using the API to facilitate illegal online gambling, and the Monetization Policy forbids monetizing gambling-adjacent content such as "simulated casinos and their games" through Server Subscriptions, App Subscriptions or the Server Shop.
Laws differ by country and by US state. The UK government decided in July 2022 not to bring loot boxes under gambling law, calling the ability to cash out an important distinction, and the same response cited Belgium and the Netherlands as places where loot boxes had fallen under gambling rules. That's why coins in the bots I build can't be bought, sold or cashed out. If you want to sell perks, sell a supporter role through a paid membership bot and give it bonus XP, which MEE6's Monetize plugin also lets servers do.
MEE6, Arcane, Tatsu or a custom Discord economy bot?
Prices and limits are from each vendor's own pages as of September 2026.
| Option | Price | Leveling | Economy | Pick it when |
|---|---|---|---|---|
| Arcane, free | $0 | Message and reaction XP, 15 level roles (1 per level), weekly leaderboards | Not listed on its plan comparison | Chat XP and a handful of roles |
| Arcane Premium | $7/mo or $75/yr | Adds voice XP, custom XP values, unlimited level roles | Same | You need voice XP |
| Tatsu | Free; Server Plus $4.99/mo, Server Premium $8.99/mo | 10 leveled roles free, 20 or 40 on paid plans | Server store for roles and items, plus Tatsu's global economy | You like a ready-made pets-and-profiles economy |
| UnbelievaBoat | Free; Premium $5.99/mo or $47.88/yr | No leveling category in its command list | 25 store items free; Premium adds unlimited items and custom income commands | An economy with a store is the main feature |
| MEE6 Premium | $11.99/mo, $49.99/yr after the first year, $89.99 lifetime (list prices) | 15 to 25 XP per message, text channels only; role rewards | /daily pays 50 to 120 coins, amounts admins can't change; up to 300 store items |
You already pay for MEE6 |
| Custom bot | From $590, plus optional Care from $49/mo | Your XP rules, voice rules, seasons | Your sources, sinks and shop | The rules or data are yours |
Arcane or Tatsu's free tier is enough for chat XP, a few level roles and a leaderboard. If that's your server, don't pay for a build. BotGhost's free plan also includes leveling and economy modules; BotGhost alternatives compares the builders.
Custom is worth it when XP comes from your own data, when seasons and resets follow your calendar, when shop items need to do things a dashboard can't express, when you want the leaderboard on your own site, or when levels are one part of a bot you already run.
What a custom leveling or economy bot costs
A leveling bot, or a simple economy with /daily and a few shop items, is Starter work: from $590, 1 to 2 weeks, with up to about five slash commands, source code, setup docs, 30 days of fixes and the first month of Care.
Levels and an economy with a shop, seasons, a web leaderboard or XP from outside data is Community, from $1,490, because the systems share a database and one integration. An admin dashboard, several servers or deep game integration is Platform, from $3,500. Tiers are on the pricing page, and what a custom Discord bot costs puts them next to market rates.
- Up: importing old XP, voice XP, seasons with archives, a web leaderboard, game APIs.
- Down: chat XP only, level roles, a leaderboard inside Discord.
How the build works
- Brief. Send the brief: what should earn XP, the roles, the shop and any data source. I reply within one business day.
- Spec. We agree on the numbers, which become the acceptance checklist. The Bot Blueprint ($249) does this as a call and written spec, credited if you order within 30 days.
- Build and test in a private server, with simulated activity so we can check the level curve and shop prices before launch.
- Launch on your own Discord application. You pay 50% to book the slot and 50% on acceptance.
- Care from $49 a month keeps it hosted and updated; hosting and Care plans has the details.
Technical notes
- Intents. Guilds and GuildMessages for chat XP, GuildVoiceStates for voice XP; none of them privileged. Message Content only for text filters, and Server Members only to handle members who leave.
- Permissions. Manage Roles, and the bot's role must sit above every level role, because Discord only lets a bot assign roles below its own highest role. A server can have 250 roles, so long level ladders use fewer roles with bigger steps. The permissions calculator builds the invite link.
- Data. XP, coins, inventory, season archives and the audit log sit in a database you own, and nothing leaves it unless you ask for a web leaderboard or an export.