What it means
Telegram has two kinds of account. A bot is created by BotFather, authenticated with a token, and flagged as a bot everywhere. A user is created with a phone number, authenticated with a session, and has all the capabilities a human needs.
A userbot is software driving the second kind. It logs in with auth.sendCode and auth.signIn, handles the two-factor step if the account has one, and from that point talks MTProto exactly as an official Telegram client would. The API credentials come from my.telegram.org as an api_id and api_hash pair, and Telegram issues them to anyone who asks, because third-party clients are a supported part of the ecosystem.
Nothing on the wire distinguishes a userbot from a person using a third-party Telegram client. That is precisely why the capability exists, and precisely why abusing it is policed so aggressively.
What only a user account can do
The full comparison is in the table below, but four capabilities account for essentially every reason a team ends up running a userbot:
- First contact. A bot cannot message a person who has not started it. A user account can message anyone it has a valid access hash for.
- History. A bot sees nothing sent before it joined. A user account reads whatever the chat allows.
- Membership. There is no Bot API method to enumerate a group's members. Over MTProto,
channels.getParticipantsexists, subject to a server-side result cap and, in large groups, an admin restriction. - Joining. A bot must be added by a human. A user account can act on an invite link hash itself.
The trade runs both ways, which is the part that gets left out of most descriptions. Inline keyboard buttons, callback queries, inline mode, and payment flows are bot-only. A user account cannot attach reply markup to a message under any circumstances. Anyone who replaces their bot with a userbot to "get more capability" loses every interactive feature they had.
The risk, described honestly
Running a userbot means putting a real account, tied to a real phone number, in front of Telegram's anti-spam systems. Those systems are automatic, opaque, and mostly not appealable.
The escalation path is consistent enough to plan around. It starts with short flood waits on messages.sendMessage. Ignored, the waits lengthen. Next comes PEER_FLOOD, which is qualitatively different: no countdown, no number, just an account that can no longer message non-contacts. After that comes a full spam block, and finally USER_DEACTIVATED_BAN, at which point the account and its phone number are gone.
The trigger that matters most is not volume. It is the spam-report rate. An account sending 40 well-targeted messages a day to people who find them relevant will run for months. The same account sending 40 irrelevant messages a day will collect reports, and reports move you down the escalation path far faster than throughput does. This is why "how many can I send" is the wrong question and "who am I sending to" is the right one.
A practical tool worth knowing: messaging @SpamBot from a restricted account tells you the current restriction status and offers an appeal path. It is the only visibility Telegram gives you into your own standing.
Operating a pool safely
The numbers below are Pinlyx production defaults, and they are deliberately conservative.
- Warm up for at least 7 days. A new account that sends a cold DM on day one almost always earns an immediate flood wait. Receive messages, join a few relevant channels, set a photo and a bio, have a real conversation.
- 20 messages an hour, 50 a day per account to contacts who have never written to you.
- At least 10 seconds between any two sends from the same account, with jitter, because perfectly regular intervals are themselves a signal.
- Rotate across at least three accounts for any campaign above a hundred sends, and slow down the whole pool when one account gets a wait, not just that account.
- Vary the message. Identical strings across hundreds of sends are trivially detectable. See spintax.
- Stop on reply. Once a person answers, the sequence has done its job. Continuing to send scheduled steps into a live conversation is the single most reportable behaviour in outbound.
Why it matters
For a CRM, the userbot question is the difference between two business models. A product built only on the Bot API can serve inbound conversations beautifully and can never do outreach. A product that also drives user accounts can do lead generation on Telegram, which is where most of the commercial demand is, especially in markets where Telegram has replaced email for business conversation entirely.
The engineering that separates a viable implementation from a dangerous one is not glamorous: per-account rate limiting, honest flood-wait back-off, a per-account peer cache, stop-on-reply, opt-out handling, and an operator alert when an account's error profile changes. Skip those and you have built an account shredder with a nice interface.
Common mistakes
- Sending on day one. Warm-up is not optional and cannot be shortened by sending more slowly.
- Hot-switching accounts on every flood wait. The pool then produces the same wait on the next account ten minutes later. Slow down globally.
- Treating PEER_FLOOD as a longer flood wait. It is a different class of event and needs a full stop.
- Buying the cheapest virtual numbers. They are pre-flagged. The saving disappears the first time a batch gets banned.
- Sending the same string to everyone. Duplicate content is one of the easiest signals for a platform to detect.
- Replacing a working bot with a userbot. You lose buttons, callbacks, inline mode and payments, and gain risk you did not need.
Related concepts
- MTProto: the protocol a userbot speaks.
- Session string: the credential that keeps it logged in, and the thing to protect.
- Flood wait: the first warning on the escalation path.
- Telegram Bot API: the safer half of the architecture.
- Business connection: the sanctioned way to automate a personal account, with no session and no ban risk.
- Spintax: how to keep bulk messages from looking like bulk messages.
How Pinlyx handles it
Pinlyx runs user accounts through WTelegramClient with a rate limiter configured per account: 20 messages an hour and 50 a day by default, a 10-second minimum gap, and exponential back-off on FLOOD_WAIT. Long waits pause the account for the rest of the day automatically, and PEER_FLOOD halts it entirely and notifies the operator rather than retrying. Account rotation is per-account aware, so one paused sender does not stop a campaign. Sequences stop on reply by default. Everything that a bot can do is done by a bot, because the safest userbot action is the one you never had to take, and the whole thing sits inside the Telegram CRM rather than in a standalone script.