Bot Shows Online but Ignores Every Command — It's Probably Intents
If your Discord bot deploys cleanly, shows up online in the member list, and then ignores everything you type, the host is doing its job — the problem is almost certainly a missing privileged intent, usually Message Content. Without it your bot receives message events with the text stripped out, so a prefix command like !help arrives as an empty string and matches nothing. The fix has two halves that must agree: toggle the intent on in Discord's Developer Portal, and request it in your code. Doing one without the other is the single most common version of this problem.
First, confirm it isn't the hosting
The signature of an intents problem is specific and easy to distinguish from a deployment problem:
| Symptom | Likely cause |
|---|---|
| Bot appears online, ignores commands | Intents |
| Bot never appears online | Token, network, or the process isn't running |
| Status looks fine but logs show repeated exits | A crash loop — check the exit code |
| Logs are completely empty | Buffered output — set PYTHONUNBUFFERED=1 in your env vars |
| Bot replies twice | Two instances running |
"Online and silent" means the process is running, the token is valid, and the gateway connection succeeded. Everything the host is responsible for is working. That's genuinely useful information — it tells you to stop reading deploy logs.
The three privileged intents
Discord gates three intents behind explicit approval, because each exposes user data:
MESSAGE_CONTENT— the actual text of messages. Without it, message events still arrive but content is empty.GUILD_MEMBERS— member joins, leaves, and updates. Without it,on_member_joinnever fires and your member cache stays thin.GUILD_PRESENCES— online status and activity.
Most "silent bot" reports are the first one, because prefix commands are built entirely on reading message text.
Fix it in both places
In the Developer Portal, open your application → Bot, and switch on the intents you need. This is the half people find, because it's where the searching leads.
In your code, request the same intents when you connect:
intents = discord.Intents.default()
intents.message_content = True # must also be ON in the portal
bot = commands.Bot(command_prefix="!", intents=intents)
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent, // must also be ON in the portal
],
});
The two must match. Enabling in the portal but not requesting in code means you simply don't receive it — a silent failure. Requesting in code without enabling in the portal is worse: the gateway refuses the connection, so your bot won't come online at all and you'll see a disconnect at startup rather than a helpful error.
That asymmetry is a useful diagnostic. Online-and-silent points at the portal being ahead of your code; never-comes-online points at your code being ahead of the portal.
Restart after changing it
Intents are negotiated when the gateway connection is established, so a change doesn't apply to a running bot. Restart the app.
If you changed intents in code, that's a redeploy anyway. If you only flipped the portal toggle, restart so your bot reconnects and negotiates again — and remember that a redeploy replaces the container, so anything outside a volume goes with it.
You may not need Message Content at all
Worth knowing before you request it: slash commands don't need it. Interaction payloads carry their own arguments, so a bot built on /commands receives everything it needs without reading arbitrary message text.
If you're building something new, that's the path of least resistance — no privileged intent, no approval to worry about later, and a better user experience since commands are discoverable. Message Content is for bots that genuinely need to read conversation: moderation, logging, auto-responders.
The approval threshold
Below a certain size you can enable privileged intents yourself. Per Discord's documentation, apps with fewer than 10,000 users can turn them on in the Developer Portal; once an app exceeds 10,000 unique users across all the servers it's in, continued access requires review (Discord developer docs).
That's a good problem to have and a bad surprise to hit unprepared. If your bot is growing and depends on Message Content, start the review before you're near the line — and if you can migrate to slash commands instead, the question stops applying.
FAQ
Why does my Discord bot show online but not respond?
Almost always a missing Message Content intent. The bot receives message events with empty content, so nothing matches your prefix.
Where do I enable intents?
Two places, and both are required: the Developer Portal under your application's Bot settings, and your code's intent list when you create the client.
Why won't my bot come online after adding intents to my code?
You've requested an intent that isn't enabled in the portal. The gateway refuses the connection, so the bot never appears.
Do I need to restart after changing intents?
Yes. Intents are negotiated when the connection is established, so a running bot keeps its old set until it reconnects.
Do slash commands need Message Content?
No. Interactions carry their own arguments, which is a good reason to prefer them for new bots.
What happens when my bot gets popular?
Past 10,000 unique users, keeping privileged intents requires review. Apply before you reach it, or move to slash commands.
Wrapping up
"Online but silent" is a genuinely helpful symptom once you know how to read it: the process is up, the token works, the connection succeeded — so the missing piece is permission to see what you're trying to react to. Fix it in the portal and in your code, restart, and if you're starting fresh, consider building on slash commands so the whole category stops being your problem.