Skip to content
SocialMGrowthGet a plan

Telegram bot broadcast to subscribers: the list, the loop and the clock

Updated · 2479 words · 11 min read

A bot broadcast is not a button in BotFather. It is a list you keep, a loop you pace and a set of errors you answer. This page covers all three, with the timing math for lists from 1,000 to 1,000,000.

A Telegram bot can broadcast only to people who started it, so you store each chat ID yourself and send one message per chat. The free ceiling is about 30 messages a second, so 100,000 subscribers take about 56 minutes. Paid broadcasts reach 1,000 a second for 0.1 Stars per extra message.

How does a Telegram bot broadcast to subscribers actually work?

A Telegram bot broadcast to subscribers is a loop your own server runs: it reads the chat IDs of everyone who pressed Start, then calls sendMessage once per person. Telegram keeps no subscriber list for you and has no "send to all" method, so the list, the pacing and the cleanup all live in your code.

That surprises people who expect a button in BotFather. There is none. The Bot API is a set of single calls, and a broadcast is just many of them in a row, each to one chat. Everything that makes a broadcast work or fail follows from that: who got onto your list, how you stored them, how fast you send, and what you do when a call comes back with an error.

A bot is also only one of the ways to reach people at once on Telegram. If you are still choosing, our overview of how channel posts and broadcast lists reach people who already joined compares the options, and the page on bulk messaging services and the consent each channel expects covers email, SMS and WhatsApp next to Telegram.

Why can't a Telegram bot initiate a conversation with a user?

Because Telegram decided bots may only answer. The bot documentation says plainly that bots can't start conversations with users; a person has to message the bot first or add it to a group. Try to message anyone else and the API returns 403 with "Forbidden: bot can't initiate conversation with a user".

So the "telegram bot cannot initiate conversation with a user" error is not a bug or a limit you can raise. It is the rule working. The fix is upstream: give people a reason and a link to open the bot. These are the doors that put a person on a bot's list legally.

DoorWhat the person doesWhat the bot may then send
Start button or deep linkOpens t.me/yourbot?start=source and taps StartPrivate messages, until they block or delete the chat
Login Widget with write accessSigns in on your website and allows the bot to message themPrivate messages, same as Start
Mini App write requestAccepts the write-access prompt inside your Mini AppPrivate messages, same as Start
Added to a groupA group admin adds the botMessages to that group only, never to its members one by one
Scraped or imported listNothingNothing: every send fails with 403

The last row is why a bot cannot be a cold outreach tool, however it is marketed. Products that send to strangers are logging in as user accounts instead, which is a different risk: read why bulk DMs from a personal Telegram account get limited before going near one. The same pattern shows up well beyond messaging. Software that fires actions in bulk at people who never opted in tends to be discounted by the platform, and this breakdown of what TikTok report bots really do and why volume fails walks through the moderation side of it.

The deep link's start parameter is worth using even on day one. A link like ?start=ig_bio arrives in the /start message, so you can save where each subscriber came from next to their chat ID and later see which post filled the list.

How should a bot store chat IDs for a broadcast?

Save the chat ID from every /start update in a table with one row per person, stored as a signed 64-bit integer, plus a status field. The Bot API warns that IDs can exceed 32 bits (up to 52 significant bits), so a 32-bit column silently corrupts them and those subscribers never receive a message.

The common search telegram bot store chat ids broadcast is usually asking two things: where to keep the IDs, and how to keep the list honest. Any database works, from SQLite for a small bot to Postgres for a large one. What matters is the shape of the row.

  • chat_id as BIGINT, unique. Upsert on every /start so a returning user does not create a duplicate.
  • status: active, blocked or gone. Only active rows get broadcasts.
  • source: the deep-link parameter, if any.
  • joined_at and last_seen, so you can tell a live list from an old one.
  • language from the user object, if you send more than one version.

Keep the status current without guessing. When someone blocks the bot, Telegram sends a my_chat_member update with the new status "kicked"; when they unblock and press Start again, it flips back to "member". Handling that one update keeps the list clean between broadcasts. Store nothing you do not need: a chat ID, a first name and a source are enough to run a broadcast, and a short list of fields is easier to protect and to delete on request. Add a /stop command that sets the row to inactive, and honor it at once.

How do you send a message to all users of a bot without hitting limits?

Read the active rows, send one message per chat at no more than about 30 per second, and handle every error as it comes back. That is the whole answer to "telegram bot send message to all users": a paced queue, not a single call. Telegram's FAQ also asks for no more than one message per second in a single chat.

Here is how to broadcast message to all bot users in the order we build it for clients.

  1. Freeze the audience. Copy the active chat IDs into a broadcast job table with a pending flag, so new subscribers mid-send do not shift the queue and a crash can resume where it stopped.
  2. Prepare the message once. Upload any photo or video in a test send first and reuse the returned file_id, so the server is not uploading the same file thousands of times.
  3. Send in paced batches. A worker takes 25 to 30 pending rows per second and calls sendMessage (or sendPhoto, or copyMessage from a draft chat) for each. Staying a little under the ceiling leaves room for retries.
  4. Record every result. Mark each row sent, failed or retry. A 403 changes the subscriber's status; a 429 pauses the worker.
  5. Report at the end. Delivered, blocked, gone and still pending. That last number should be zero before you call the job finished.

Two habits save the most trouble. Send the broadcast to a test chat first, every time, because there is no recall once it goes out. And keep the copy short with one clear button; a long wall of text from a bot gets muted, and a muted bot is one step from a blocked one. For wording, our cold message templates rewritten line by line apply just as well to a first broadcast, and for timing and offers the DM marketing guide with its worked Telegram numbers shows how often a list tolerates hearing from you.

What do broadcast errors mean, and what should the bot do with each?

Most failures in a broadcast are 403s from people who left, plus 429s when you send too fast. Treat 403 as a status change and 429 as an instruction to wait the exact number of seconds Telegram returns in retry_after. Retrying a 403, or ignoring a 429, is what turns a routine send into a slow, error-filled one.

ResponseWhat it meansWhat the bot should do
403: bot was blocked by the userThey blocked the botSet status blocked; skip until a new /start
403: user is deactivatedThe account was deletedSet status gone; drop the row from future sends
403: bot can't initiate conversation with a userThis ID never started the botRemove it; find how it got onto the list
400: chat not foundWrong or corrupted ID (often a 32-bit column)Check the stored value, then remove if it is bad
429: Too Many Requests, retry after NYou exceeded the pacePause the worker N seconds, resend the same row

A healthy list loses a slice of its rows to blocks with every broadcast, and that is normal. What is not normal is a sudden jump in blocks right after a send, which tells you the message, not the code, was the problem. If you are deciding which parts of a campaign a script should run and which a person should, our notes on which outreach steps are safe to automate and what the stack costs draw that line for email and DMs too.

How long does a Telegram broadcast take?

At the free ceiling of about 30 messages per second, a bot reaches 10,000 subscribers in roughly 6 minutes and 100,000 in roughly 56 minutes. Paid broadcasts raise the ceiling to 1,000 per second, but they cost Stars and need a large bot. Telegram itself suggests spreading free broadcasts over 8 to 12 hours.

So the honest answer to "how long does a telegram broadcast take" depends on list size and on whether you want speed or spread. The figures below are the floor at full pace; real jobs run a little slower because of retries and media.

Active subscribersFree, 30 per secondPaid, 1,000 per secondPaid cost (approx.)
1,000About 34 secondsNot worth itNone
10,000About 6 minutesNot worth itNone
100,000About 56 minutesAbout 100 secondsAbout 9,700 Stars
500,000About 4 hours 38 minutesAbout 8 minutes 20 secondsAbout 48,500 Stars
1,000,000About 9 hours 16 minutesAbout 17 minutesAbout 97,000 Stars

The cost column follows Telegram's rule that each message above the free 30 per second costs 0.1 Stars. At 100,000 users and full paid speed, about 3,000 messages fit inside the free rate during those 100 seconds, and the other 97,000 cost 0.1 Stars each. Paid broadcasting is switched on per message with the allow_paid_broadcast parameter, and the FAQ sets two entry conditions: at least 100,000 Stars on the bot's balance and at least 100,000 monthly active users.

Should you broadcast fast or slow?

Fast only when the message is time-bound: a live stream starting, a sale ending, an outage. For everything else, slow wins. A send spread over ten hours means a 100,000-user bot sends fewer than three messages a second, never meets a 429, and lands while people in different time zones are awake. It also means your support chat gets replies at a pace a person can answer. For volume figures on other Telegram tools, see the limits a Telegram message sender runs under.

When is a channel post better than a bot broadcast?

When the message is one-way and identical for everyone. A channel post reaches every subscriber at once, with no rate limit, no loop and no server, and readers can mute it without blocking anything. A bot broadcast earns its extra work when you need personal fields, segments, buttons that run actions, or a reply flow.

Many of our clients end up running both: a channel for news, and a bot for the parts that need one person at a time, such as orders, reminders and support. If your audience is a group rather than a channel, the plain explainer on what adding people to a Telegram group in bulk really allows covers the limits there, and for a single message to one person, every way one person can message another on Telegram is the place to start.

A case from August shows why the stored list matters more than the sending code. A course creator came to us with a bot of about 40,000 subscribers whose broadcasts "reached nobody". The sending loop was fine. The chat IDs had been saved in a 32-bit integer column two years earlier, so every user with a larger ID came back as "chat not found". We migrated the column to BIGINT, rebuilt the active list from fresh /start events plus a channel post asking people to tap Start again, and moved sends to a ten-hour spread. The next broadcast reached the rebuilt list with a few hundred 403s from people who had genuinely left, which is what a working broadcast looks like.

Bots are one piece of outreach, not the whole of it. If you are planning the wider program, read how we plan a cold outreach program and read its reply rates, the seven outreach types and where a bot fits among them, and our page on comment triggers and the DM automation platforms allow, which is where most bot subscribers come from in the first place.

Sources

  1. Telegram: bots, an introduction for developers
  2. Telegram: Bots FAQ, broadcast and paid broadcast limits
  3. Telegram Bot API reference: sendMessage, chat IDs, ChatMemberUpdated
  4. Telegram: bot features and deep linking
  5. Telegram Login Widget and write access
  6. Telegram Mini Apps: requestWriteAccess

Questions about bot broadcasts

Can a Telegram bot message users who never pressed Start?

No. Telegram bots can only reply to people who messaged them first, signed in with write access or accepted a Mini App write request. Any other send returns 403 with the error that the bot can't initiate a conversation with a user.

Is there an API method to send one message to all bot users?

No. The Bot API has no broadcast method and no list of a bot's users. You keep the chat IDs yourself, from each /start, and loop through them with sendMessage at about 30 messages a second.

How many messages per second can a Telegram bot send?

About 30 per second across different chats for free, no more than about one per second in a single chat, and 20 per minute in a group. Paid broadcasts allow up to 1,000 per second for bots that qualify.

What happens to users who blocked the bot?

Sends to them fail with 403 and the text that the bot was blocked by the user. Telegram also sends the bot a my_chat_member update with status kicked, so you can mark them inactive and skip them next time.

How long does a broadcast to 50,000 subscribers take?

About 28 minutes at the free pace of 30 messages a second, a little longer with retries. Telegram recommends spreading large free broadcasts over 8 to 12 hours, which also avoids rate-limit errors.

Is a bot broadcast better than a channel post?

Only when you need personal fields, segments, action buttons or replies. For one identical message to everyone, a channel post is simpler: it reaches all subscribers at once with no rate limit and no server to run.

Turn this plan into posts, replies, and reach

Send the account link and the result you want. We will reply with a plan, a price, and a timeframe for this service.