4.17 million Telegram chats, 14,491 still active: what running a voice-to-text bot taught me
Voicy has 4,168,944 chats in its database and 14,491 active in the last 30 days. Here is how the bot handles the gap: reachability, a GPU queue, caching and honest pricing.
Voicy, my Telegram bot that turns voice messages into text, has 4,168,944 chats in its database as of October 28, 2026, and 14,491 of them were active in the last 30 days (13,816 of those are private chats). That ratio is the most useful thing running a bot at this scale has taught me, so this post is about what it means for how the bot is built and paid for. Every number below comes from stats.borodutch.com, which counted the database at 19:05 UTC today (counts only, never ids or message content), or from the bot's open-source repository, which I read this evening.
How many chats does Voicy really have?
Here is the table I wish I had looked at years ago. A chat is "active" when it had a transcription job, a voice record, or a new start in the window.
| Chat type | Ever | Active 30 days | Active 180 days |
|---|---|---|---|
| Private | 3,763,976 | 13,816 | 56,534 |
| Supergroup or channel | 246,801 | 211 | 975 |
| Group | 155,352 | 47 | 219 |
| Unknown | 2,815 | 417 | 2,815 |
The headline number is 4.17 million, and it is also nearly meaningless. Of the 3.76 million private chats, 2,997,481 are known to be unreachable: the person blocked the bot, deleted their account, or the chat is gone. That is 79.6 percent. The 56,534 private chats that were active in the last 180 days are 1.5 percent of everyone who ever pressed start, and 7.4 percent of the 766,495 private chats the bot can still message.
I used to quote the big number in my head as "my audience". It is the size of the graveyard plus the living, and only the living can use a new feature, read an announcement or pay for anything.
Why the bot marks chats as unreachable
Voicy writes down every time Telegram tells it a chat is a dead end. In src/helpers/chatReachability.ts the failures are sorted into four kinds: permanent (the bot was kicked or blocked, the chat was deleted, the bot no longer has the right to send messages), a stale status message, benign, and transient. Only the permanent kind flips a chat to unreachable: the bot stops queueing transcriptions for it and cancels the jobs it still had waiting. A chat that talks to the bot again comes back. The stats page's "unreachable" figure is that kind of dead end.
This matters for more than vanity. Any broadcast to the whole database would spend its first million sends on people who will never see them, and Telegram rate-limits what a bot can send. The only honest audience size is the reachable one, and the count of recently active chats inside it is smaller still.
What turning voice into text actually costs
The bot does not call a transcription API. Incoming voice messages, video notes, videos, audio files and media-looking documents are queued as jobs in MongoDB, and workers that I run on my own hardware pick them up. According to the README, the supported production setup is a Windows machine with an RTX 4070 Ti running faster-whisper with the large-v3 model, polling the bot's worker API and uploading the transcript back. The bot itself only queues, replies and edits a progress message.
Two small decisions came out of running this for years:
- Transcripts are cached for 10 days. The default in
transcriptionResultCache.tsis 10 days, adjustable with an environment variable. If the same Telegram file is forwarded into ten chats, only the first one needs a GPU. - Each unpaid chat can only have 10 jobs in the queue.
abuseLimits.tsdefaults to 10 active jobs per chat for chats that haven't been activated, because one spammy group can otherwise fill the queue for everybody else.
The GPU is one machine, so the queue is the product. Everything else in the bot (language selection, silent mode, locks for admins) is thin by comparison.
Voicy is not free, and I would rather say so
The honest part: transcription runs on compute that I pay for, so Voicy asks for a one-time donation per chat. The bot's own text says it plainly: "Voicy needs a one-time donation to keep transcribing in this chat." Donations are per chat, not per user, by Telegram Stars tier or Stripe, with a custom amount and a minimum of $6.99, or by sending tokens worth at least that to borodutch.eth. People who subscribe to my channel @golden_borodutch get 50 free transcriptions each.
The README also notes that the donation wall is, at the time of writing, disabled by default in the code for testing and can be switched back on with one environment variable (VOICY_DONATION_WALL_ENABLED). I don't want to claim what the live bot does about that from the code alone, so check the bot's /donate answer if you are deciding whether to add it to a group. Whichever way it is set, the design point stands: a bot with millions of past chats and tens of thousands of active ones cannot be funded by hope.
Where Voicy is weaker than the alternatives
- Telegram Premium has transcription built in, and for people who already pay for Premium that is simpler than adding a bot.
- Transcription is queued rather than instant, because one GPU serves every chat. A busy hour makes it slower than a cloud API with elastic capacity would.
- I haven't published an accuracy benchmark. The large-v3 model is good in the languages it covers well and noticeably worse in the ones it doesn't, and I'd rather not put a number on it that I haven't measured.
What I'd tell someone starting a bot now
- Track reachable and recently active chats from day one, not "total users". It changes what you build and what you promise yourself.
- Cache anything the user can resend. Forwarding is the normal way people use Telegram.
- Put a per-chat limit on the queue before you need one.
- If the compute is yours and it costs money, ask for money in the bot's own words and don't hide it.
The code is MIT-licensed, and you can read the numbers above in the open: the bot is @voicybot, the source is at github.com/backmeupplz/voicy, and there is a short FAQ at voicybot.com. All figures here were read on October 28, 2026.