What it means
Telegram has three conversational containers, and only two of them are what people mean by "group".
A basic group is the small one you get when you select a few contacts and start a chat. In the API it is a chat object, it holds up to 200 members, and it is deliberately simple.
A channel is a broadcast surface where admins post and everyone else reads.
A supergroup is the same channel object as a broadcast channel, with the megagroup flag set. That single flag is the whole distinction at the protocol level, and it is why supergroups inherit every piece of channel infrastructure: the 200,000 member ceiling, the shared permanent history, granular admin rights, optional public usernames, and chat-scoped message IDs.
The practical consequence for anybody writing code is that supergroups live in the channel ID namespace, not the group one. That is where the -100 prefix in Bot API chat IDs comes from, and it is why a basic group and the supergroup it becomes have no numeric relationship whatsoever.
Migration is a replacement, not an upgrade
When a basic group crosses its limits or an admin enables a supergroup-only feature, Telegram performs a migration. The word makes it sound gentle. It is not.
Telegram creates a new channel, moves the members, and deactivates the old chat. The old chat receives messageActionChatMigrateTo(channel_id), the new one opens with messageActionChannelMigrateFrom(title, chat_id), and those two service messages are the only bridge between the old ID and the new one. Over the Bot API the same event appears as a 400 error whose parameters object carries migrate_to_chat_id.
For a CRM this is a referential-integrity event. Conversations, notes, assignments and pipeline cards all key off the chat ID, and after migration that key points at a chat that will never receive another message. The symptom is a customer who appears to have gone quiet. The cause is a dead foreign key.
What you can and cannot read from a large group
Supergroups are where the interesting audiences live, which makes member data the most requested and most misunderstood capability on Telegram.
channels.getParticipants accepts a filter, and the filters do different jobs: recent members, a search by name, admins, bots, kicked and banned users, and contacts. The method exists over MTProto only; the Bot API has no equivalent at all.
Two limits shape what is actually possible. First, there is a server-side cap on how deep a plain recent-members query can page, in the low thousands, so scanning a 200,000-member group by incrementing an offset simply stops returning rows long before you reach the end. The workaround is partitioning: instead of one deep scan, issue many shallow search queries with different prefixes, each of which returns its own shallow page. Second, Telegram has restricted participant listing for non-admins in large groups, so a great many calls come back with CHAT_ADMIN_REQUIRED no matter how you page.
The honest summary: for groups you administer, you can enumerate members. For large groups you merely joined, you can usually sample them, not export them. Any tool claiming to dump a complete 200,000-member list is describing something the API does not do.
Moderation primitives worth knowing
Supergroup moderation is not one permission, it is two sets of flags.
Admin rights cover changing chat info, deleting messages, restricting members, inviting users, pinning messages, adding other admins, managing video chats, managing topics and posting anonymously. Up to 50 administrators can hold them, each with a different combination.
Banned rights work as restrictions on ordinary members: whether they can view messages at all, send messages, send media of specific kinds, embed links, send polls, change chat info, invite users, pin, or manage topics. Crucially each restriction carries an expiry timestamp, which is how a timed mute exists as a first-class concept rather than as something your bot has to schedule and remember.
Slow mode sits alongside them, limiting how often each member may post. Telegram offers a fixed set of intervals: 10 seconds, 30 seconds, 1 minute, 5 minutes, 15 minutes and 1 hour. When a member posts too soon the server returns SLOWMODE_WAIT_X, which looks like a flood wait and is easy to misread as one. It is not: it is a property of the chat, not of your account, and it says nothing about your standing with Telegram.
Why it matters
Most business conversation on Telegram happens in supergroups: customer communities, regional trade groups, industry channels with comments enabled, and internal team chats. If your CRM treats them as a single undifferentiated "group" type, several things break at once.
Permalinks stop working, because the t.me/c/ form needs the raw channel ID rather than the prefixed one. History import silently returns nothing for basic groups, because there is none to import. Migration orphans records. And topics, which only exist on supergroups, mean that the chat ID alone is no longer a unique conversation key at all.
Common mistakes
- Assuming "group" means one thing. The Bot API reports two chat types and they behave differently.
- Ignoring migration events. The new chat ID is handed to you, in the service message or in the error parameters. Use it.
- Paging getParticipants by offset alone. You will hit the depth cap and quietly stop receiving rows. Partition by search instead.
- Treating SLOWMODE_WAIT as an account problem. It is a chat setting. Slowing the whole account down is the wrong response.
- Building t.me/c links from a Bot API chat_id. The
-100prefix has to be removed first. - Storing message IDs without their chat. Chat scoping makes them unique within a supergroup and nowhere else.
Related concepts
- Peer ID: why supergroups carry a
-100prefix and basic groups do not. - Forum topic: threads inside a supergroup, and what they do to your conversation key.
- Invite link hash: how people get into a private supergroup.
- Access hash: what enumerating members actually gives you.
- MTProto: the API where participant listing exists at all.
- Flood wait: the account-level cousin of
SLOWMODE_WAIT.
How Pinlyx handles it
Pinlyx stores the peer type alongside every chat, so a basic group and a supergroup are never confused for one another, and permalinks are built from the raw channel ID rather than the prefixed one. Migration service messages are watched, and when a group is upgraded the conversation, its notes and its pipeline card follow the new channel ID instead of being orphaned. Member extraction paces itself, partitions by search rather than paging blindly into the depth cap, and reports honestly when a group returns CHAT_ADMIN_REQUIRED instead of pretending it collected a full list. Everything lands in the Telegram CRM as contacts with their source group attached.