Skip to content
Все статьи
Разработка7 мин

Telegram Mini App вместо мобильного приложения: наш опыт

Я мобильный разработчик, пишу на Flutter, и при этом не раз отговаривал клиентов от мобильного приложения. Не из лени. Просто для части задач Telegram Mini App делает то же самое, а пользователю не нужно ничего устанавливать.

Samandar MaxamadjonovМобильный разработчик

Представьте: четверо парней снимают квартиру в Чиланзаре. Кто-то купил продукты, кто-то заплатил за свет, кто-то третью неделю не выносит мусор. Чтобы это честно делить, мы делали Xonadosh. И первым вопросом было: приложение в сторах или что-то внутри Telegram?

Если сделать приложение, один человек его скачает, второй «потом посмотрит», а двое так и не установят. Сервис, где нужны все соседи, умирает на этом шаге. А общий чат в Telegram у них уже есть. Так что мы сделали Mini App и бота рядом с ним.

Что такое Mini App, если без маркетинга

Это обычное веб-приложение, которое открывается внутри Telegram по кнопке в боте или по ссылке. Telegram передаёт ему данные пользователя, тему оформления, язык. Для человека это выглядит как экран внутри мессенджера, а не как сайт.

Главное отличие от сайта: человек уже авторизован. Не нужно ни SMS, ни пароля, ни «Войти через Google». Открыл и работаешь.

Вот как примерно выглядит связка бота и Mini App в Xonadosh. Бот напоминает, а сложные экраны (расчёты, график дежурств) открываются уже в приложении.

X
Xonadosh
bot
Сегодня твоя очередь выносить мусор. Отметь, когда сделаешь.
Сделано
Открыть Xonadosh
Сделано
Засчитано. Следующим дежурит Бобур, в четверг.
Напоминание: за продукты на этой неделе ты должен Сардору 45 000 сум.
Открыть расчёт

Имена и суммы условные, но сценарий именно такой: бот отвечает за напоминания, а всё, что требует экрана, живёт в Mini App.

Три проекта, три причины

Xonadosh. React 18 и Vite на фронте, Django 6 и DRF на бэкенде, бот на aiogram 3. Для интерфейса взяли библиотеку компонентов @telegram-apps/telegram-ui, чтобы экраны выглядели как родной Telegram на iOS и Android. Причина выбора Mini App: продукт работает только если им пользуются все соседи.

İstanbul EKU. Сеть клиник ЭКО в Ташкенте, Самарканде и Ургенче. Пациентское приложение сделано как Mini App на Next.js 15 с ботом @istanbul_eku_bot: услуги, запись, полезные материалы на русском и узбекском. Пациентке не нужно искать клинику в сторе, а для такой деликатной темы это важно: приложение не висит на главном экране телефона, его открывают из Telegram.

UstozTop. Маркетплейс репетиторов на Nuxt 3 и Django. UstozTop работает и как сайт, и как Mini App. Один и тот же код: из поиска Google человек попадает на сайт, а из Telegram-канала на тот же каталог внутри мессенджера.

9:41ustoztop.uzUstozTop на телефоне
UstozTop: один и тот же каталог работает на сайте и внутри Telegram

Где Mini App выигрывает у приложения

Telegram Mini App Мобильное приложение
Установка Не нужна, одна кнопка в боте Стор, 50–150 МБ, разрешения
Авторизация Telegram передаёт пользователя сразу Регистрация, SMS или Apple/Google вход
Модерация Нет, обновили сервер и всё App Store и Google Play, от дня до недели
Распространение Ссылка в чате, канале, группе Реклама установок, ASO
Push-уведомления Только сообщения от бота Полноценные push через FCM/APNs
Офлайн Практически нет Да
Доступ к железу Ограниченный Полный: камера, Bluetooth, фон
Стоимость Ближе к веб-приложению От $1 600

Для Узбекистана строка «Распространение» весит особенно много. Аудитория уже в Telegram, и ссылка на Mini App в канале с 20 000 подписчиков работает лучше, чем просьба «скачайте приложение».

Ограничения, о которые мы споткнулись

Push-уведомлений нет

Есть только сообщения от бота. В Xonadosh мы сделали цепочки напоминаний через бота, и они работают. Но если пользователь заблокировал бота, достучаться до него нельзя. В мобильном приложении push работает, пока приложение установлено.

Интерфейс живёт в чужом окне

Вертикальный свайп по умолчанию сворачивает Mini App. Если у вас список или карта, пользователь будет случайно закрывать приложение. С Bot API 7.7 появился метод disableVerticalSwipes(), но на старых версиях Telegram его просто нет, и код должен это переживать. Ещё отдельная история с клавиатурой на iOS, которая перекрывает поля ввода, и с кнопкой «Назад», которую надо подключать к своему роутеру вручную.

Telegram бывает разный

Один и тот же Mini App открывается в Telegram на iPhone, на Android, в Telegram Desktop и в веб-версии. Ведут они себя по-разному. На Desktop окно маленькое и не растягивается так, как на телефоне. Цвета темы приходят из настроек пользователя, и если вы где-то захардкодили белый фон, у человека с тёмной темой получится белое пятно посреди чёрного экрана.

Поэтому в Xonadosh вся работа с Telegram вынесена в один небольшой модуль-обёртку. Каждый вызов проверяет, есть ли метод в текущей версии клиента, и если нет, тихо делает что-то разумное. Заодно это позволяет открывать приложение в обычном браузере во время разработки, без Telegram вообще. На UstozTop всё проще: Nuxt-приложение проверяет, открыто ли оно внутри Telegram, и разворачивает окно на весь экран, а в остальном это тот же сайт.

Оплата

Для цифровых товаров внутри Telegram действуют правила самого Telegram, там нужны Telegram Stars. Для услуг и физических товаров можно подключать платёжных провайдеров или вести на оплату Click и Payme. Это решается, но схему оплаты надо продумать до начала разработки, а не за неделю до запуска.

Безопасность авторизации

На бэкенде Xonadosh проверка выглядит примерно так (aiogram даёт готовую функцию):

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")

Пять строк, но без них всё остальное не имеет смысла.

Когда всё-таки нужно настоящее приложение

Я не против мобильных приложений, это моя основная работа. Вот когда я сам советую делать приложение:

  • нужен офлайн: книга, справочник, приложение для поездок без интернета;
  • нужен фон: трекинг, будильники, push, которые точно дойдут;
  • активная работа с камерой, Bluetooth, файлами;
  • аудитория не только в Узбекистане, и не все сидят в Telegram;
  • платный цифровой контент, который должен жить в App Store и Google Play.

Например, Foydali Nuqtalar, платная книга по самопомощи на 15 языках, — это классическое мобильное приложение. Там нужны были вход через Apple и Google, настоящие push-уведомления и платный доступ к главам, а аудитория далеко не только в Telegram. Об этом проекте я подробно писал в статье про путь приложения до сторов.

Как я решаю сейчас

Если продукт строится вокруг группы людей, которые уже общаются в Telegram, или его открывают пару раз в неделю, я начинаю с Mini App. Это быстрее, дешевле и проверяет идею на живых пользователях без модерации сторов.

Если через полгода выяснится, что людям нужен офлайн или надёжные push, бэкенд уже готов, и мобильное приложение станет вторым клиентом к тому же API. В Xonadosh мы так и заложили: Django-бэкенд ничего не знает о том, откуда пришёл запрос.

С İstanbul EKU мы пошли ещё дальше: систему сразу сделали мультиарендной, чтобы на том же коде можно было запустить Mini App для другой сети клиник со своим ботом, логотипом и услугами. Для Mini App это проще, чем для приложения в сторах, где каждый такой клон — отдельная публикация и отдельная модерация.

Обратный путь, от приложения к Mini App, я видел реже. Обычно потому, что после полугода и $5 000+ на приложение никто не хочет признавать, что хватило бы кнопки в боте.

Есть задача? Напишите — обсудим.

Пишите в Telegram напрямую основателю студии. Расскажите в двух словах, что нужно — ответим с вопросами и примерной оценкой.