Creating a Discord Economy Bot: Balance, Shop, and Gambling Systems in 2026
Economy bots are community engagement machines. Users earn currency by participating, spend it in shops, and gamble it for excitement. When designed thoughtfully, they create compelling reasons for members to stay active and return daily.
Database Schema
CREATE TABLE users (
user_id TEXT PRIMARY KEY,
guild_id TEXT NOT NULL,
balance INTEGER DEFAULT 0,
bank INTEGER DEFAULT 0,
last_daily TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE items (
item_id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
description TEXT,
price INTEGER NOT NULL,
role_id TEXT -- Optional: grant a Discord role on purchase
);
CREATE TABLE inventory (
user_id TEXT,
guild_id TEXT,
item_id INTEGER REFERENCES items(item_id),
quantity INTEGER DEFAULT 1,
PRIMARY KEY (user_id, guild_id, item_id)
);
Core Commands
// /daily - Claim daily reward
async function claimDaily(interaction) {
const data = await getUser(interaction.user.id, interaction.guildId);
const now = new Date();
const last = data.last_daily ? new Date(data.last_daily) : null;
if (last && (now - last) < 86400000) { // 24 hours
const remaining = Math.ceil((86400000 - (now - last)) / 3600000);
return interaction.reply(`⏰ Come back in ${remaining} hours for your daily reward.`);
}
const reward = 100 + Math.floor(Math.random() * 50);
await addBalance(interaction.user.id, interaction.guildId, reward);
await updateLastDaily(interaction.user.id, interaction.guildId, now);
interaction.reply(`✅ You claimed your daily reward of **${reward} coins**!`);
}
// /balance - Check balance
async function checkBalance(interaction) {
const data = await getUser(interaction.user.id, interaction.guildId);
interaction.reply(`💰 Wallet: **${data.balance}** | Bank: **${data.bank}**`);
}
Shop Implementation
// /shop - View items
async function viewShop(interaction) {
const items = await db.query('SELECT * FROM items ORDER BY price ASC');
const embed = new EmbedBuilder()
.setTitle('🛒 Server Shop')
.setDescription(items.rows.map(item =>
`**${item.name}** — ${item.price} coins
${item.description}`
).join('
'));
interaction.reply({ embeds: [embed] });
}
Gambling: Responsible Design
Gambling features drive engagement but require responsible limits:
// /flip - Coin flip with house edge
async function coinflip(interaction, amount, choice) {
const user = await getUser(interaction.user.id, interaction.guildId);
if (amount > user.balance) return interaction.reply('Insufficient funds.');
if (amount > 5000) return interaction.reply('Maximum bet is 5,000 coins.'); // Bet cap
const win = Math.random() < 0.48; // 48% win rate = 4% house edge
if (win) {
await addBalance(interaction.user.id, interaction.guildId, amount);
interaction.reply(`✅ You won **${amount} coins**!`);
} else {
await removeBalance(interaction.user.id, interaction.guildId, amount);
interaction.reply(`❌ You lost **${amount} coins**.`);
}
}
House edge directs coins toward sinks (shop purchases, special events), preventing currency hyperinflation.