A Telegram Mini App instead of a mobile app: what we learned
I'm a mobile developer, I write Flutter, and I've still talked clients out of a mobile app more than once. Not out of laziness. For some jobs a Telegram Mini App does the same thing, and the user doesn't have to install anything.
Samandar MaxamadjonovMobile developer
Picture four guys renting a flat in Chilonzor. One bought groceries, one paid the electricity bill, one hasn't taken the rubbish out for three weeks. To split all of that fairly, we built Xonadosh. And the first question was: an app in the stores, or something inside Telegram?
With an app, one flatmate downloads it, the second will "look at it later", and two never install it. A service that needs every flatmate on board dies right there. But they already have a group chat in Telegram. So we built a Mini App with a bot next to it.
What a Mini App is, minus the marketing
It's an ordinary web app that opens inside Telegram from a button in a bot or from a link. Telegram hands it the user's data, the colour theme and the language. To the user it looks like a screen inside the messenger, not like a website.
The main difference from a website: the user is already signed in. No SMS, no password, no "Sign in with Google". Open it and go.
Here's roughly how the bot and the Mini App work together in Xonadosh. The bot sends reminders; the heavier screens (balances, the chore rota) open in the app.
The names and amounts are made up, but the flow is exactly this: the bot handles reminders, and anything that needs a screen lives in the Mini App.
Three projects, three reasons
Xonadosh. React 18 and Vite on the front, Django 6 and DRF on the back, a bot on aiogram 3. For the UI we used the @telegram-apps/telegram-ui component library so the screens look like native Telegram on iOS and Android. Why a Mini App: the product only works if every flatmate uses it.
İstanbul EKU. A network of IVF clinics in Tashkent, Samarkand and Urgench. The patient app is a Mini App on Next.js 15 paired with the @istanbul_eku_bot bot: services, appointment booking and helpful material in Russian and Uzbek. Patients don't have to look the clinic up in a store, and for a topic this sensitive that matters: the app doesn't sit on the phone's home screen, it opens from Telegram.
UstozTop. A tutor marketplace on Nuxt 3 and Django. UstozTop works both as a website and as a Mini App. Same code: people coming from Google search land on the website, and people coming from a Telegram channel get the same catalogue inside the messenger.

Where a Mini App beats an app
| Telegram Mini App | Mobile app | |
|---|---|---|
| Install | None, one button in the bot | Store, 50–150 MB, permissions |
| Sign-in | Telegram passes the user instantly | Registration, SMS or Apple/Google sign-in |
| Review | None, update the server and you're done | App Store and Google Play, a day to a week |
| Distribution | A link in a chat, channel or group | Install ads, ASO |
| Push notifications | Bot messages only | Full push via FCM/APNs |
| Offline | Practically none | Yes |
| Hardware access | Limited | Full: camera, Bluetooth, background |
| Cost | Closer to a web app | From $1,600 |
In Uzbekistan the "Distribution" row carries a lot of weight. The audience is already on Telegram, and a Mini App link in a channel with 20,000 subscribers works better than asking people to download an app.
The limits we ran into
No push notifications
You only get messages from the bot. In Xonadosh we built reminder chains through the bot, and they work. But if a user has blocked the bot, there's no way to reach them. In a mobile app, push works for as long as the app is installed.
The UI lives in someone else's window
By default, a vertical swipe collapses the Mini App. If you have a list or a map, users will keep closing the app by accident. Bot API 7.7 added disableVerticalSwipes(), but older Telegram versions simply don't have it, and your code has to cope. Then there's the iOS keyboard covering input fields, and the Back button, which you have to wire into your own router by hand.
Not all Telegrams are the same
The same Mini App opens in Telegram on iPhone, on Android, in Telegram Desktop and in the web version. They all behave differently. On Desktop the window is small and doesn't stretch the way it does on a phone. Theme colours come from the user's settings, and if you hard-coded a white background somewhere, a user with a dark theme gets a white blotch in the middle of a black screen.
That's why in Xonadosh all the Telegram calls live in one small wrapper module. Each call checks whether the method exists in the current client version, and if it doesn't, quietly does something sensible instead. As a bonus, the app can be opened in a plain browser during development, with no Telegram at all. UstozTop keeps it simpler: the Nuxt app checks whether it's running inside Telegram and expands to full screen, and otherwise it's the same website.
Payments
Digital goods sold inside Telegram fall under Telegram's own rules, which means Telegram Stars. For services and physical goods you can connect payment providers or send people to pay through Click and Payme. It's solvable, but the payment flow has to be designed before development starts, not a week before launch.
Authentication security
On the Xonadosh backend the check looks roughly like this (aiogram ships a ready-made helper):
from aiogram.utils.web_app import check_webapp_signature
if not check_webapp_signature(settings.BOT_TOKEN, init_data):
raise AuthenticationFailed("Invalid initData signature")
if time.time() - int(parsed["auth_date"]) > settings.INIT_DATA_MAX_AGE_SECONDS:
raise AuthenticationFailed("initData expired, reopen the app")
Five lines, but without them nothing else matters.
When you really do need an app
I'm not against mobile apps, they're my main job. Here's when I recommend building an app myself:
- you need offline: a book, a reference guide, an app for trips without internet;
- you need background work: tracking, alarms, push that is guaranteed to arrive;
- heavy use of the camera, Bluetooth or files;
- your audience isn't only in Uzbekistan, and not everyone lives in Telegram;
- paid digital content that should live in the App Store and Google Play.
Foydali Nuqtalar, a paid self-help book in 15 languages, is a classic mobile app, for example. It needed Apple and Google sign-in, real push notifications and paid access to chapters, and its audience is far from Telegram-only. I wrote about that project in detail in the article on taking an app all the way to the stores.
How I decide now
If a product is built around a group of people who already talk on Telegram, or it gets opened a couple of times a week, I start with a Mini App. It's faster, cheaper, and tests the idea on real users without store review.
If six months later it turns out people need offline mode or reliable push, the backend is already there, and a mobile app becomes a second client of the same API. That's how we planned Xonadosh: the Django backend doesn't care where a request came from.
With İstanbul EKU we went a step further: we built the system as multi-tenant from the start, so the same code can run a Mini App for another clinic network with its own bot, logo and services. That's much easier with a Mini App than with a store app, where every such copy means a separate listing and a separate review.
The reverse path, from an app to a Mini App, I've seen less often. Usually because after six months and $5,000+ spent on an app, nobody wants to admit that a button in a bot would have been enough.





