How to Set Up Bot Commands, Menu Button and Description in Telegram
Practice4 minInnovialabs editorial team
In short
Commands are set with setMyCommands per scope and language, the menu button with setChatMenuButton, and the description, short description and profile photo define what users see before pressing Start.
The short answer: what you configure and where
A bot has several "storefront" elements, and each can be set in BotFather or through the Bot API:
| What | Where the user sees it | BotFather | Bot API |
|---|---|---|---|
| Commands | Command menu and hints when typing "/" | /setcommands | setMyCommands |
| Menu button | Left of the input field | /mybots → Bot Settings → Menu Button | setChatMenuButton |
| Description | Empty chat before pressing Start | /setdescription | setMyDescription |
| Short description | Bot profile and link previews | /setabouttext | setMyShortDescription |
| Profile photo | Chat list and profile | /setuserpic | — |
BotFather is convenient for one-off setup. The API is needed when commands differ by language, role or chat, and when settings should live in code alongside the bot.
Commands: setMyCommands
A command uses lowercase Latin letters, digits and underscores, up to 32 characters; its description can be up to 256 characters. Keep the list short: 3–7 commands people actually need.
curl -X POST "https://api.telegram.org/bot<TOKEN>/setMyCommands" \
-H "Content-Type: application/json" \
-d '{
"commands": [
{"command": "start", "description": "Start"},
{"command": "orders", "description": "My orders"},
{"command": "help", "description": "Help"}
],
"scope": {"type": "all_private_chats"},
"language_code": "en"
}'
Scopes
The scope parameter lets you show different commands in different places:
default— everywhere by default;all_private_chats— in all private chats;all_group_chats— in all groups;all_chat_administrators— to administrators of all groups;chat,chat_administrators,chat_member— a specific chat, its administrators, or a specific member.
Telegram picks the most specific matching scope. In a group, for example, an administrator sees commands from chat_administrators if they are set, while a regular member sees all_group_chats or default. This is a handy way to hide service commands like /stats from regular users.
Languages
The language_code parameter sets the list for users with that Telegram interface language. First set a list without language_code as the fallback, then add translations for ru, en, uz and any other languages you need. Note that the language comes from the app settings, not from a choice made inside your bot.
Menu button
The button to the left of the input field comes in three types:
commands— opens the command list;web_app— launches a Mini App;default— default behavior.
{
"menu_button": {
"type": "web_app",
"text": "Catalog",
"web_app": {"url": "https://example.com/app"}
}
}
Without chat_id, setChatMenuButton changes the default button for all private chats; with chat_id, only for that user. You can use this to show the Mini App only after registration. Keep the button text short and specific: "Catalog", "Book now" rather than "Open".
Description and short description
The description (up to 512 characters) appears in an empty chat with the bot, above the Start button. It is the main text that convinces people to tap. Answer three questions: what the bot does, why it is useful, and what happens after Start. In BotFather you can add an image or a short animation to the description.
The short description (up to 120 characters) appears on the bot's profile page and in the preview when a link to the bot is shared. One sentence about the benefit.
Both texts can be localized with language_code, just like commands. The bot's name can be localized too, with setMyName.
Profile photo and first impression
Before pressing Start, a user sees the name, profile photo, short description in the profile, the description with its image in the chat, and the menu button. Checklist:
- the photo reads well in a small circle: a logo or mark without small text;
- the name says what the bot is, not just the brand name;
- the description explains the benefit instead of just greeting;
- all texts are translated into your audience's languages;
- commands and the menu button match what the bot can actually do.