Discord Reaction Roles and Button Roles: Let Members Pick Their Roles (2026)
Self-roles let members choose what they care about – games, languages, notification pings – without asking a moderator. This guide shows how to plan role menus and run them with your own bot, using buttons or reactions.
1. Buttons or reactions?
| Buttons | Reactions | |
|---|---|---|
| Clarity | Labelled, obvious | Emoji need a legend |
| Feedback | Ephemeral "role added" reply | None by default |
| Familiarity | Newer | Long-standing pattern |
For new menus, buttons are usually clearer. Reactions still work well for small, emoji-friendly choices.
2. Plan your role menus
Group roles by purpose, one message per group:
- Pings: Announcements, Events, Giveaways
- Interests: e.g. game titles or topics
- Language: Deutsch, English
Keep each menu under ~10 options and decide whether a menu allows one or several roles.
3. Permissions
- The bot needs Manage Roles.
- The bot's role must sit above every self-role.
- Never put roles with moderator permissions in a self-role menu.
4. How button roles work (discord.js v14)
A simplified sketch:
const row = new ActionRowBuilder().addComponents(
new ButtonBuilder().setCustomId('role:EVENTS_ROLE_ID').setLabel('Events').setStyle(ButtonStyle.Secondary),
);
await channel.send({ content: 'Pick your pings:', components: [row] });
client.on(Events.InteractionCreate, async (i) => {
if (!i.isButton() || !i.customId.startsWith('role:')) return;
const roleId = i.customId.slice(5);
const has = i.member.roles.cache.has(roleId);
await (has ? i.member.roles.remove(roleId) : i.member.roles.add(roleId));
await i.reply({ content: has ? 'Role removed.' : 'Role added.', ephemeral: true });
});Clicking toggles the role and gives the member a private confirmation.
5. Combine with auto-roles
An auto-role on join (e.g. "Member") plus a self-role menu in your welcome channel gives every newcomer a clear first step.
Shortcut: the Aramac Community Bot + Dashboard Starter
The Aramac Community Bot + Dashboard Starter for Discord includes, according to its product page:
- Self-roles via buttons (default) or reactions (reactions must be switched on with
REACTION_ROLES=on), posted with/selfroles, auto-roles - Welcome and goodbye messages with templates
- Leveling with level roles,
/rankand/leaderboard, plus/xp optout//xp optin(only an opt-out record is kept, also after a member leaves, so the objection still applies on rejoin) - A Next.js dashboard with Discord OAuth2 login (identify, guilds) for settings on welcome, roles, leveling and privacy – the dashboard never needs the bot token
- DE/EN messages per server, Docker Compose (bot + dashboard), automated tests
Requirements: Node.js 22.13 or newer (or Docker), your own Discord application with bot token and OAuth2 client, and your own hosting. It contains no AI. For private and community servers only – not for shops, businesses or servers with paid memberships/roles. For consumers only. The bot processes member data (e.g. Discord IDs, XP): you run it and are responsible for that data, for informing your members and for youth protection on your server.
29,00 € – Sold by Aramac GmbH · Price incl. VAT
Personal, non-commercial use only, for consumers only – see the licence.
FAQ
Why can't the bot give a role? The bot's role is below that role, or it lacks Manage Roles.
Can I limit a menu to one choice? Yes – remove the other roles of the group when a new one is picked.
Do reaction roles survive a bot restart? Only if the bot stores the message and role mapping and listens for reactions on that message after restarting.
Should moderator roles be self-assignable? No. Only give out roles without special permissions.
Can I sell roles through a menu? Not with this starter: no paid memberships or roles.
Related guides
Not affiliated with Discord Inc. "Discord" is a trademark of Discord Inc.