Your Telegram Bot Ignores Group Messages — It's Privacy Mode
If your Telegram bot answers perfectly in a direct message and ignores everything in a group, nothing is broken and your hosting is fine. By default, all bots added to groups run in Privacy Mode and "only see relevant messages and commands" (Telegram docs) — so your handler never receives the ordinary chatter it's watching for. There are two ways out, and one detail that wastes an afternoon if you don't know it: turning privacy mode off has no effect on groups the bot is already in until you remove and re-add it.
Why it works in DMs and not groups
That asymmetry is the diagnostic signature, and it follows directly from what privacy mode still lets through. Even with it enabled, bots receive:
- All service messages — people joining, leaving, and similar events.
- All messages from private chats — which is why DMs work perfectly.
- All messages from channels where they're a member.
What they don't get is the general conversation in a group. So a bot that replies to /start in a DM and does nothing when someone types the same thing in a group isn't misconfigured on your side — it never saw the message.
Commands addressed to your bot do get through. If your bot handles /weather it will keep working in groups; if it watches for keywords, reacts to plain text, or scans links, it won't.
Fix 1: make the bot an admin
The quickest route, and often the right one. Privacy mode is "enabled by default for all bots, except bots that were added to a group as admins."
If your bot needs to delete messages, ban users, or pin things, it needs admin anyway — and promoting it solves the visibility problem at the same time. For a moderation bot this is simply the correct configuration.
Fix 2: turn privacy mode off
If your bot shouldn't be an admin — a chat game, a link previewer, a reaction bot — disable privacy mode instead. It "can be disabled so that the bot receives all messages like an ordinary user."
You do this through BotFather, whose /setprivacy command sets "which messages your bot will receive when added to a group."
Then the part everyone misses: "the bot will need to be re-added to the group for this change to take effect."
So the sequence is:
- Change the setting in BotFather.
- Remove the bot from the group.
- Add it back.
Skip step 2 and 3 and the setting looks applied while the behaviour is unchanged — which reads exactly like the setting not working. If you've already flipped it and seen no difference, this is why.
Choose deliberately, because "all messages" means all messages
Turning privacy mode off isn't free, and it's worth a moment's thought before you make it your default.
It increases your event volume in every group. Your bot now receives every message in every group it's in, not just the ones aimed at it. On a fractional CPU where your allocation is a time budget, a busy group can mean a lot of handler invocations doing nothing useful. Filter early and cheaply — check the condition before doing any work, not after.
It fills your logs. If you log incoming updates, you're now logging entire group conversations into a capped log stream that rotates, pushing out the errors you actually need. Don't log message contents by default.
It's a privacy decision, not just a technical one. Your bot is reading everything people say in those groups. Store as little as you can, and be clear about it if your bot is public.
If your bot only ever responds to commands, leave privacy mode on. It's a sensible default and it keeps your workload proportional to actual usage.
The same problem exists on Discord
Worth knowing if you build for both: this is Telegram's version of privileged intents. A Discord bot that appears online and ignores everything usually has Message Content missing, and the fix is likewise in two places rather than one.
Both platforms defaulted to restricting message visibility for the same reason — most bots don't need to read everything, and the ones that do should be an explicit decision.
A two-minute diagnosis
- Does it respond in a DM? Yes → privacy mode, almost certainly. No → connection, token, or your handler.
- Do slash-style commands work in the group but plain text doesn't? That's privacy mode precisely.
- Is the bot an admin? If yes, privacy mode isn't your problem — look at your handler.
- Did you change the setting and see no difference? Re-add the bot to the group.
- Still nothing? Check the logs for the update arriving at all. If no update arrives, it's visibility; if it arrives and nothing happens, it's your code.
That last step is worth doing before anything else, because it splits the problem cleanly in two — and it's the kind of line worth logging deliberately.
FAQ
Why doesn't my Telegram bot see group messages?
Privacy mode is on by default and limits bots to relevant messages and commands. Ordinary group conversation isn't delivered.
Why does it work in private chats?
Bots receive all messages from private chats regardless of privacy mode. That contrast is the clearest sign of what's happening.
How do I turn privacy mode off?
Through BotFather's /setprivacy, then remove the bot from the group and add it back — the change doesn't apply to existing memberships.
Do admin bots need privacy mode disabled?
No. Bots added to a group as admins aren't in privacy mode by default.
Should I disable it for every bot?
No. If your bot only responds to commands, leaving it on reduces the events you process and the data you handle.
Could this be a hosting problem?
No. The updates aren't being sent to your bot at all — nothing about your container affects which messages Telegram delivers.
Wrapping up
Privacy mode is one of those defaults that's obviously right for the platform and obviously confusing for a first-time bot author, especially because the symptom — silence in groups, perfection in DMs — looks like a deployment problem. Decide which of the two fixes matches what your bot does, remember the re-add step, and if you do turn it off, filter early so a busy group doesn't spend your CPU on messages you were never interested in.