BBotnexio

Buy now!

← All guides

Discord Reaction Roles and Button Roles: Let Members Pick Their Roles (2026)

Deutsche Version

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?

ButtonsReactions
ClarityLabelled, obviousEmoji need a legend
FeedbackEphemeral "role added" replyNone by default
FamiliarityNewerLong-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, /rank and /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.