Telegram Mini Apps in 2025: when to ship one instead of a mobile app
In 2024 we shipped seven Telegram Mini Apps and one native app. Here is when a TMA pays back 4–6× faster — and where you still need native.
Creastra Digest
- A TMA pays back in 6–10 weeks; a native app in 8–14 months
- TMA limits: offline, background tasks, heavy graphics, non-Telegram push
- Payments via Telegram Stars or an in-app provider — legal and free of store fees
By mid-2025 Telegram has 950M+ MAU and Mini Apps are no longer a niche. We have seven TMAs in production — from a barbershop booking flow for Britva to a B2B catalogue for furniture maker Dubrava — and one native iOS/Android app for a clinic. Here is the frame we use to pick the format.
When a TMA is the obvious win
- The audience already lives in Telegram (B2C services, local retail, B2B tools for owners)
- Short flows: book, pay, order, status, search a catalogue
- No need for offline beyond about 5 minutes
- No heavy sensors (LiDAR, complex NFC beyond simple reads)
- Budget under 2.5M ₽ and timeline under 12 weeks
When you genuinely need native
If the app is the primary touchpoint and users open it 5+ times a week for 10+ minutes, native pays back. Same if you need background work (courier tracking, fitness, real-time AR), biometrics for critical actions, or device-ecosystem integration (CarPlay, Wear OS).
The stack we settled on
We standardised TMAs on Next.js 15 on edge-runtime, a thin layer to verify initData, GraphQL over Postgres, Prisma for types. Theme and colours come from the Telegram WebApp API, so the app looks native in light and dark without separate styles.
// Verify initData on the server — critical, or anyone can spoof a user
import crypto from 'node:crypto';
export function verifyInitData(initData: string, botToken: string) {
const url = new URLSearchParams(initData);
const hash = url.get('hash');
url.delete('hash');
const dataCheck = [...url.entries()]
.sort(([a], [b]) => a.localeCompare(b))
.map(([k, v]) => `${k}=${v}`)
.join('\n');
const secret = crypto.createHmac('sha256', 'WebAppData').update(botToken).digest();
const computed = crypto.createHmac('sha256', secret).update(dataCheck).digest('hex');
return computed === hash;
}The Britva case: barbershop booking
Britva runs six Moscow shops. Pre-TMA, bookings flowed through WhatsApp admins: 14-minute median response, 22% loss at peak. The Mini App took seven weeks: barber catalogue, live slots, payment via a Telegram provider, two-hour reminder.
Payments: Stars vs provider
Telegram Stars suit digital goods and subscriptions and have no store fee. For physical services and Russian sole-traders or LLCs, use a provider (YooKassa, Tinkoff) — funds land on your operating account directly. Britva uses YooKassa: 2.4% fee, T+1 settlement.
Gotchas
- Never trust initData without server-side verification — it is the security root of TMA
- Viewport shifts when the keyboard opens — lay out on 100dvh, not 100vh
- BackButton must be hidden manually when returning to the home screen
- iOS occasionally loses input focus — setTimeout(focus, 60) helps
- You build your own analytics: Telegram does not expose a native funnel
When to ship both
A hybrid makes sense when you have two distinct groups: a wide audience with short flows (TMA) and loyal users with long sessions (native). For the clinic going native, we plan a separate TMA for booking and intake forms so prospects do not need to install the full app just to do one thing.