Updated 4 November 2026
If your bot is online but its slash commands don't show up, one of four things is almost always wrong: the commands were never registered (your code must send them to Discord), the bot was added without the applications.commands scope, your Discord app is showing an old list (restart it with Ctrl+R), or you lack the permission the command requires. Work through the checks below in order; most fixes take a minute.
Checked on 29 October 2026 against Discord's developer documentation (Application Commands and Receiving and Responding).
1. Did your code register the commands?
A slash command only exists after your bot sends it to Discord. Writing the handler is not enough.
- discord.py: call
await tree.sync()(orawait bot.tree.sync()), for example inon_readyorsetup_hook. It returns the list of synced commands; print it to be sure:print(await tree.sync()). - discord.js: register them with
client.application.commands.set(commands)in the ready event, or with a separate deploy script that uses the REST API. A deploy script only runs when you run it: after adding a command, run it again.
Look in the console: an error during registration (often an invalid name, see step 5) means none of the commands in that request were saved.
2. Global or guild commands?
Discord has two kinds of slash commands:
- Guild commands belong to one server and are available instantly. Use them while testing.
- Global commands work in every server that has your bot, and in DMs with the bot. After an update, a client that still has the old version is told to reload that command when someone uses it.
Testing in discord.py on one server, with MY_GUILD = discord.Object(id=123456789012345678) (your server ID):
tree.copy_global_to(guild=MY_GUILD)
await tree.sync(guild=MY_GUILD)
In discord.js: await client.guilds.cache.get('123456789012345678').commands.set(commands).
tree.clear_commands(guild=MY_GUILD) followed by await tree.sync(guild=MY_GUILD), or commands.set([]) on the guild in discord.js.3. Restart your Discord app
The desktop app caches the command list. Press Ctrl+R (Cmd+R on a Mac) to reload it, or close and reopen the app on your phone. Then type / again.
4. Was the bot invited with applications.commands?
To create commands in a server, your app must be authorized there with the applications.commands scope. Discord now includes it automatically with the bot scope, but bots invited long ago with only bot may miss it. Fix: in the Developer Portal, go to OAuth2 → URL Generator, tick bot and applications.commands, open the link and add the bot to the same server again. Nothing is lost by re-inviting.
5. Check the name and the limits
- Slash command and option names are 1 to 32 characters, lowercase, without spaces.
/Pingor/my commandis rejected. - A description is required for slash commands.
- An app can have at most 100 global slash commands, and 100 per server.
- You can create at most 200 commands per day per server. Code that deletes and re-creates all commands on every start can hit this. Use a bulk overwrite (
tree.sync()orcommands.set()) instead of creating them one by one.
6. Do you have permission to see it?
If a command has default_member_permissions (discord.py: @app_commands.default_permissions(...), discord.js: .setDefaultMemberPermissions(...)), members without that permission don't see it in the command list. With the value "0", only administrators see it. Server admins can also change who may use a command in Server Settings → Integrations. Test with an admin account to rule this out.
7. The command shows, but says "The application did not respond"
Now the command exists, but your bot didn't answer in time. Discord wants a first response within 3 seconds. For slow work (a database query, an API call, an image), acknowledge first and answer later; you then have 15 minutes:
# discord.py
await interaction.response.defer()
# ... slow work ...
await interaction.followup.send("Done!")
// discord.js
await interaction.deferReply();
// ... slow work ...
await interaction.editReply('Done!');
This error also appears when the bot is offline or has crashed; check its console. See Discord bot offline? 8 causes.
Running it 24/7
New bot servers at ServerSpark come with a working /ping bot that already registers its command: put your token in .env, press Start and build on it. Bot hosting costs €0.69 per month paid per quarter (€0.79 monthly billing, 512 MB RAM). See Discord bot hosting, or start from scratch with Python or JavaScript.
Frequently asked questions
Why are my Discord bot's slash commands not showing up? Usually the commands were never registered (tree.sync() in discord.py, commands.set() or a deploy script in discord.js), the bot lacks the applications.commands scope in that server, your Discord app shows a cached list (press Ctrl+R), or you don't have the permission the command requires.
How long do new slash commands take to appear? Guild commands are available instantly. Global commands are available in all servers once registered; if they don't show, reload Discord with Ctrl+R. While testing, register commands for one server.
Why do my slash commands show up twice? They are registered both globally and as guild commands for that server. Clear the guild commands and sync again.
What does "The application did not respond" mean? The bot did not reply within 3 seconds. Defer the response first (interaction.response.defer() or deferReply()) and send the answer afterwards, or check whether the bot is online.
Can slash command names have capital letters or spaces? No. Slash command names are 1 to 32 characters, lowercase, without spaces. Dashes and underscores are allowed.