
Define where the bot is triggered before listing features
The same bot behaves differently in private chats, groups and channels. In a private chat, a bot cannot message someone until that user has started the conversation, so a requirement like notify everyone needs a clear answer on how users arrive. In groups, confirm whether the bot is an admin and whether it must read all messages; with privacy mode on, it only sees commands, replies to it and mentions. If your design depends on keyword monitoring, say so up front. The first page of the spec should cover three things: the surfaces (private chat, group, channel, Mini App), the roles (user, admin, operator), and the commands or buttons each role can trigger.
Describe the flow as states, not feature names
Items like supports ordering or supports lookup give neither developers nor testers anything to check. A state table works better: current state, user input, bot reply, next state, and where failures go. An ordering flow should at least cover abandonment, repeated taps, payment timeout and invalid input. There is also a technical reason to do this: inline button callback_data is limited (the official docs say 1 to 64 bytes), so rich context cannot ride on the button and the server has to hold session state. The number of states and branches is a better proxy for real effort than the number of features, and a fairer basis for quotes and change requests.
Write down what data is stored, who owns it and for how long
List at least four categories: user identifiers (use the numeric Telegram user id as the key, since usernames can change), business data such as orders or tickets, messages and logs, and third-party credentials such as payment or cloud keys. For each, record where it lives, who can read it, how long it is kept, and whether it can be exported and deleted. If personal or payment data is involved, check the compliance rules of the regions you operate in; that responsibility is yours, and the developer can only implement the rules you provide. Database and server accounts should sit under your organization, with the developer using sub-accounts, so you are not asking the vendor for your own data later.
Put bot token and hosting ownership in the handover list
Bots are created through BotFather, and the token is effectively control of the bot. Settle which Telegram account creates the bot, who stores the token, whether a separate test bot is used during development, and whether the token is regenerated at launch. If a token ever appears in a chat, repository or screenshot, regenerate it in BotFather. For hosting, state how updates are received (webhook or long polling, which cannot run at the same time), who buys the server and domain, who renews certificates, where logs go, and how the service restarts after a crash. A handover should include the repository, environment variable list, deploy steps, database schema and third-party account list. Missing any of these makes changing maintainers painful.
Make acceptance items reproducible and list the exclusions
A testable item has a precondition, an action and an expected result, for example: a new user taps Start and sees the welcome message with three menu buttons. Beyond the happy path, cover invalid input, insufficient permissions and third-party failures. Performance targets need numbers, such as concurrent users and a latency ceiling, along with the test environment. Telegram enforces sending limits (check the official docs for current values), so broadcast features should specify throttling and retry behavior. Equally important is what is excluded: extra languages, an admin panel, reports, and rework caused by later platform rule changes should be marked in or out of scope.
When to shrink the scope or pause the build
Cut the project into a smaller first phase if any of these hold: the flow can only be described as something like another bot; a required third-party API is not yet available or documented; nobody is named as owner of the data and token; or acceptance rests on phrases like runs stably or good experience. Requests to mass-message users who have not opted in, scrape other groups' members, or work around platform limits should not be part of the scope at all, since they conflict with Telegram's rules and put the bot at risk of restriction. A small first phase with clear acceptance, extended after the flow proves out, is usually easier to control than one large delivery.