guide

How to Run a Multilingual Telegram Bot

Telegram hands over the client language of every subscriber on the very first message. This guide covers what to do with it: detect, confirm, store it, and then serve every offer, drip, campaign and broadcast in that language.

One link posted in one place rarely produces one audience. A Telegram channel with a mixed following, an affiliate placement running across three countries, or an ad set with loose geo targeting will send you people whose phones are set to Portuguese, Hungarian and English inside the same hour. A monolingual bot treats all of them the same and quietly loses the ones who cannot read the welcome message.

A multilingual bot is not simply a translated bot. It is a bot where language is a stored property of every subscriber, set at the door and then used by every message that follows. That distinction is what makes the difference between translating a welcome screen and actually running several markets from one place.

Why language choice belongs at the start of the flow

The onboarding sequence in mySkua runs in a fixed order: /start, then the language pick, then an optional category pick, then an optional channel-subscription gate, then the welcome or offer message. Language comes first for a structural reason — every screen after it has to be rendered in something, and the category names, the gate instructions and the offer copy are all language-dependent.

There is also a data reason. A subscriber who arrives without a language attribute is a subscriber you cannot target later. Your day-two drip has to guess, your broadcast has to pick a majority language, and the people in the minority get a message they will not read. Retrofitting language onto an existing list is genuinely hard: you can infer from historical client codes, but you cannot ask ten thousand people to answer a question they already scrolled past.

The cost of doing it at the start is one tap. That is one of the cheapest steps you will ever add to a funnel, and it pays for itself on the first follow-up message.

Auto-detecting the Telegram client language

Telegram sends the user's interface language code along with the update that reaches your bot. The bot reads it before it renders anything, so the very first screen can already be in a plausible language rather than in whatever you happened to write first.

Be precise about what that code means. It is the language the person set their Telegram app to. It is not their country, not their citizenship, and not necessarily the language they want marketing in. Plenty of people run their phone in English while living in Budapest, and plenty of Portuguese speakers are in Brazil rather than Portugal. If you need geography, get it from the deep-link source that brought them in, not from the language code.

Two rules keep detection safe:

  • Always have a default. If the detected code is not one of the languages configured on your bot, fall back to the default language. A subscriber must never see a blank or broken screen because their phone is set to a language you do not run yet.
  • Treat detection as a suggestion, not a verdict. It is there to pre-select the right option, not to lock the subscriber into it.

Asking the subscriber to confirm, and why it matters

Detection gets you a good default. The confirmation step turns that guess into an explicit, stored preference — and that is the part that makes everything downstream reliable. In mySkua the bot auto-detects the Telegram client language, the subscriber confirms it, and all later content is served in the confirmed language.

The confirmation earns its place three times over. It corrects the guess for the meaningful minority whose interface language is not their reading preference. It gives you a value you can segment on with confidence rather than an inferred one. And it is a first micro-commitment: the subscriber has now interacted with the bot once, which measurably changes how the next screen lands.

Design details that matter more than they look:

  • Label each option in its own language — Português, Magyar, English — never a list of language names translated into English.
  • Be careful with flag emoji. A flag is a country, not a language, and using one flag for a language spoken across several countries reads badly in exactly the markets you are trying to win.
  • Keep the picker to the languages you have actually finished translating. An option that leads to half-English screens is worse than not offering it.
  • Give people a way back. A subscriber who taps the wrong button in the first two seconds should be able to switch without starting over.

Structuring text keys so nothing goes untranslated

Every onboarding message in mySkua is an editable text key with a version per language. The language prompt, the welcome, the channel-gate instruction, the not-subscribed-yet reply, the offer delivery — each is a separate key, each holds one row per language. That structure is what makes gaps visible instead of invisible.

The working rule is simple: a key is not finished until every active language has a row. Adopt it early, because the failure mode is not a crash. It is a subscriber getting three screens in Hungarian and then one in English, which reads as sloppiness at the exact moment you are asking for trust.

  • Never build a sentence from fragments. Word order differs between languages, so concatenating "Your code is" with a value and then a suffix produces something that cannot be translated well. Keep whole sentences in one key.
  • Keep placeholders identical across languages. A translator moving a placeholder is fine; renaming or dropping one is a broken message.
  • Keep formatting minimal. Telegram accepts a small subset of HTML — bold, italic, links, code, spoilers. Translators should not be inventing markup, so give them copy that already uses only what Telegram renders.
  • Budget for length. Translations rarely come back the same length as the source, and several European languages run noticeably longer than English. Copy that fits neatly on one phone screen in English can push the call to action below the fold elsewhere, so check the long version rather than the one you wrote first.

Per-language offers, media and button labels

Text is the obvious part. The parts teams forget are the ones attached to the text. In mySkua each message key can carry media and inline buttons, and every campaign holds a per-language message with its own media and inline URL buttons. All of that is translatable, and all of it is visible to the subscriber.

  • Button labels. The single most common leak. A perfectly translated Portuguese offer with a "Claim bonus" button undoes its own work in the place the eye goes first.
  • Media. Any image or video with text baked into it is language-specific. Either produce one per language or keep a text-free asset as the shared fallback.
  • Destination URLs. Button links can differ per language, which is what you want when each market has its own landing page, its own terms, or its own tracking.
  • Category welcome offers. If subscribers self-select an interest, each category can carry its own welcome offer — and that offer is itself per-language, so Sport in Hungarian and Casino in Portuguese are genuinely different messages rather than one message with a swapped noun. See audience segmentation for how those splits combine.

Adding a new language without touching code

Language codes are configured per bot and are arbitrary, so opening a new market is a content job rather than a deployment. A sane order of operations:

  • Add the language code to the bot.
  • Translate the onboarding spine first: language prompt, welcome, channel gate, offer delivery. That is the minimum viable set — until it is complete, do not put the option in the picker.
  • Translate the live campaigns next, then the auto-messages, then anything scheduled.
  • Hand translation to someone with the editor role. Team access is per bot with owner, admin, editor and viewer roles, so a translator can write copy without reaching your campaigns, broadcasts or settings.
  • Test by switching your own Telegram client to the new language and running /start end to end. Reading rows in a panel is not the same as seeing them on a phone.

Decide deliberately on regional variants. Splitting Portuguese into Brazil and Portugal is right when the offer, the terms or the tone genuinely differ, and wasteful when they do not — every split doubles the number of rows you maintain forever. Split when the content differs, not when the flag does.

Language-aware drips, broadcasts and campaigns

Once language is stored, it becomes a targeting dimension rather than a display setting.

Drips. Auto-messages fire a set delay after a subscriber joins and can be targeted by language, source, tag or category. In practice that means one drip per language, or a language filter layered on top of a source filter when the same market arrives from different placements. Delivery is bounded on purpose: failed sends retry a limited number of times, and subscribers who block the bot are dropped rather than retried forever.

Broadcasts. One-off sends show a live recipient count before you send, which is the fastest way to see how your list actually splits by language. Scheduled broadcasts run daily, weekly or monthly with a timezone — and this is where language and geography stop being the same thing. A Portuguese-language segment sitting mostly in Brazil should not be scheduled on Lisbon time.

Campaigns. A campaign carries a per-language message under a single code, so one deep link (t.me/yourbot?start=CODE) serves every market. That is worth stating plainly: you do not need one link per language, which keeps attribution intact and stops your campaign reporting from fragmenting. The wider funnel mechanics are covered in the Telegram lead generation guide.

Reporting split by language and market

Language is one of the more useful cuts you can apply to subscriber growth, daily active users, retention cohorts, campaign activations and delivery stats — because unlike most segments, a gap between languages usually has a specific, fixable cause.

  • Retention collapses in one language only. Almost always an untranslated step further down the funnel. Someone completed onboarding in their language and then received an English drip on day two.
  • Activation differs on the same campaign. Same offer, same window, different language, large gap — that points at the copy or the button label rather than at the offer.
  • Delivery stats differ by language. Worth checking against send timing before blaming the content; a scheduled broadcast landing at 4am in one market explains a lot.
  • Language crossed with source. A placement can bring the right language and the wrong intent. Reading both together tells you whether to fix the creative or the copy.

Some verticals need this split for reasons beyond performance — where offers, terms and messaging are market-specific by obligation, per-language content is part of running the funnel correctly. The iGaming Telegram bot page covers that setup.

Request access

mySkua is in an invite-only private beta, so accounts are opened by request rather than self-serve. If you run Telegram funnels across several languages and want detection, confirmation, per-language content and language-aware reporting in one panel, join the waitlist and tell us which markets you run and how many bots. We prioritise setups we can genuinely help.

Related: Telegram lead generation · Audience segmentation · iGaming bots.

Want this on your own bots?

mySkua is in a closed beta and accounts are opened in small batches. Tell us what you run and we will come back to you.

Request access