Telegram Stars vs Stripe vs YooKassa для Mini Apps: что выбрать и как собрать без боли

Практичное сравнение Telegram Stars, Stripe и YooKassa для монетизации Mini Apps: архитектуры, комиссии, риски чарджбеков, iOS/Google правила, код и прод‑подводные камни.
Неправильный выбор платежной схемы для Telegram Mini App стоит не только комиссии. Это риски блокировки на iOS, чарджбеки, провал конверсии и месяцы переделок. Этот разбор — как принять реалистичное решение и собрать монетизацию, которая выдержит продакшен.
Если коротко: для цифровых товаров внутри Telegram Stars — самый быстрый и бесшовный путь без чарджбеков, Stripe — для международных фиатных платежей и подписок, YooKassa — для РФ и 54‑ФЗ. В реальности часто нужен гибрид: Stars для iOS/цифры, Stripe/YooKassa для альтернатив и офлайн‑чеков.
Картина поля: как сегодня платят в Mini Apps
Telegram дал три жизнеспособные траектории монетизации Mini Apps:
- Telegram Stars (внутренняя валюта XTR) — покупаются пользователем в Telegram, расходуются в ботах/мини‑приложениях на цифровые блага. Для создателей это отсутствие чарджбеков, нативный UX и соответствие правилам платформ (iOS/Android). Вывод происходит через экосистему TON и сторонние площадки, с рыночным спредом и KYC.
- Stripe — глобальные карты, Apple Pay/Google Pay, банковские методы для большинства стран (кроме РФ и ряда регионов). Прозрачные webhooks, удобные подписки, возвраты, диспуты, отличная аналитика. Требует комплаенса и юрлица в поддерживаемой юрисдикции.
- YooKassa — локальный лидер для РФ: карты МИР/Visa/MC (где применимо), СБП, кошелек, рассрочки. Автоматические чеки по 54‑ФЗ, интеграция с ОФД, быстрый онбординг под российские юрлица/ИП. Недоступен за пределами РФ как основной провайдер.
Почему это важно: цифровые товары на iOS обязаны идти через нативные платежи. Telegram решает это Stars — «внутренняя валюта» покупается в Telegram и тратится на цифровые сервисы, не нарушая политику магазинов. Фиатные обходы внутри Mini App на iOS для цифрового контента — риск блокировки. Значит выбор часто определяется не желанием «подключить Stripe», а требованием не сломать доступ к аудитории iPhone.
Типовые архитектуры монетизации
Ниже — три рабочие схемы, которые мы регулярно видим и собираем. Каждая закрывает свой контекст и боль.
1) Stars‑только для цифровых товаров
Поток:
- Клиент: Telegram Mini App (WebApp) инициирует покупку.
- Бэкенд: создает счет в звездах (XTR) через Bot API, сохраняет метаданные заказа, ждет подтверждения.
- Telegram: показывает нативный платежный экран Stars.
- Бот/бэкенд: получает
successful_payment/invoice‑статус, выдает доступ к контенту/фиче.
Плюсы: идеальный UX, ноль чарджбеков, нет карт, соответствует iOS/Android правилам. Минусы: вывод в TON, волатильность и спред; пока ограниченный набор бухгалтерских инструментов для юрлиц.
Схема данных (упрощенно):
orders— id, user_id, amount_xtr, status=pending|paid|expired, payload (что покупаем), platform=webapp|bot.events— raw_updates (audit), source=telegram|backend.
2) Гибрид: Stars для iOS + Stripe для остального мира
Поток:
- При старте Mini App определяем платформу/регион. Для iOS/цифры — показываем Stars. Для Android/Web/desktop — даем Stripe в качестве опции (или оба метода на выбор).
- Бэкенд создает либо
createInvoiceLinkв XTR, либо Stripe Checkout Session/PaymentIntent. - Финализация заказа идет по webhook’ам (Stripe) или апдейтам бота (Stars).
Плюсы: ловим максимум конверсии и международных платежей, подписки/купонка через Stripe. Минусы: усложнение UX, двойная бухгалтерия, синхронизация статусов и антидюбликаты.
3) РФ‑ориентированная модель: YooKassa + Stars как опционально
Поток:
- Для РФ показываем YooKassa (СБП/карты/кошелек), автоматически пробиваем чеки по 54‑ФЗ.
- Для пользователей на iOS, покупающих цифровые услуги — предлагаем Stars, чтобы не нарушать правила платформ.
Плюсы: высокий апрув рублевых платежей, чеки и ОФД «из коробки», СБП с низкой комиссией. Минусы: за пределами РФ — мало смысла; нужны локальные юрлица и документы.
Одна сухая шутка на дорожку: самый стабильный платежный метод — тот, куда пользователю не нужно вбивать цифры из пластика в 2026 году.
Конкретика: инструменты, потоки, код
Мы покажем базовые куски кода, которые действительно нужны в проде: валидация WebApp, создание инвойса в Stars, webhook Stripe, и идемпотентность.
Валидация Telegram WebApp initData
На входе фронт присылает window.Telegram.WebApp.initData. Бэкенд обязан проверить подпись HMAC‑SHA256 по токену бота.
import crypto from 'crypto';
export function validateInitData(initData: string, botToken: string): boolean {
// Parse querystring-like initData
const params = new URLSearchParams(initData);
const hash = params.get('hash') || '';
params.delete('hash');
// Telegram requires fields sorted by key joined with '\n'
const dataCheckString = [...params.entries()]
.sort(([a], [b]) => a.localeCompare(b))
.map(([k, v]) => `${k}=${v}`)
.join('\n');
const secret = crypto.createHmac('sha256', 'WebAppData').update(botToken).digest();
const calc = crypto.createHmac('sha256', secret).update(dataCheckString).digest('hex');
return calc === hash;
}
Храним user.id, auth_date и query_id для аудита. Не доверяем фронту ни цену, ни предмет покупки — только server‑side верификация.
Создание инвойса в Stars (XTR)
В Bot API для цифровых товаров можно выставлять счета в звездах. Сервер создает ссылку на инвойс и отдает ее фронту, который открывает платеж нативно.
// Пример на Node: createInvoiceLink для Stars
import fetch from 'node-fetch';
async function createStarsInvoice(botToken: string, payload: string, title: string, amountXTR: number) {
const url = `https://api.telegram.org/bot${botToken}/createInvoiceLink`;
const body = {
title,
description: title,
payload, // ваш order_id / hash
currency: 'XTR',
prices: [{ label: title, amount: amountXTR }], // amount в минимальных единицах XTR
// provider_token для Stars не требуется
};
const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });
const data = await res.json();
if (!data.ok) throw new Error(JSON.stringify(data));
return data.result as string; // invoice link
}
На фронте (Mini App) открываем ссылку через Telegram.WebApp.openInvoice(url, callback) и подписываемся на результат.
Stripe: Checkout + webhook
Для глобальных фиатных платежей и подписок — стандартный Checkout. Обязательно используйте идемпотентность и верификацию сигнатур.
import Stripe from 'stripe';
import express from 'express';
const stripe = new Stripe(process.env.STRIPE_KEY!, { apiVersion: '2023-10-16' });
const app = express();
app.post('/create-checkout', async (req, res) => {
const { orderId, userId, priceCents, currency } = req.body;
const session = await stripe.checkout.sessions.create({
mode: 'payment',
success_url: 'https://your.app/success?session_id={CHECKOUT_SESSION_ID}',
cancel_url: 'https://your.app/cancel',
line_items: [{ price_data: { unit_amount: priceCents, currency, product_data: { name: `Order ${orderId}` } }, quantity: 1 }],
metadata: { orderId, userId },
});
res.json({ url: session.url });
});
// Webhook: важна «сырость» тела для проверки подписи
app.post('/stripe-webhook', express.raw({ type: 'application/json' }), (req, res) => {
const sig = req.headers['stripe-signature'] as string;
let event: Stripe.Event;
try {
event = stripe.webhooks.constructEvent(req.body, sig, process.env.STRIPE_WEBHOOK_SECRET!);
} catch (err) {
return res.status(400).send(`Webhook Error: ${(err as Error).message}`);
}
if (event.type === 'checkout.session.completed') {
const session = event.data.object as Stripe.Checkout.Session;
const orderId = session.metadata?.orderId!;
// идемпотентно помечаем заказ оплаченным и выдаем доступ
}
res.json({ received: true });
});
Если бэкенд на Java/Spring — правила те же (сырой body, сигнатура, идемпотентность). Мы подробно обсуждали прод‑нюансы в материале про эксплуатацию Spring в проде — см. разбор о продакшене Spring.
YooKassa: платеж + чек по 54‑ФЗ
С YooKassa ключевая деталь — формирование чека (предметы расчета, НДС, признак способа). Пример на Node очень сжат:
import axios from 'axios';
async function createYooPayment(amountRub: number, orderId: string) {
const res = await axios.post('https://api.yookassa.ru/v3/payments', {
amount: { value: (amountRub / 100).toFixed(2), currency: 'RUB' },
capture: true,
confirmation: { type: 'redirect', return_url: 'https://your.app/return' },
description: `Order ${orderId}`,
receipt: {
customer: { email: 'user@example.com' },
items: [{ description: 'Digital item', quantity: '1.00', amount: { value: (amountRub / 100).toFixed(2), currency: 'RUB' }, vat_code: 1, payment_subject: 'service', payment_mode: 'full_payment' }]
},
metadata: { orderId }
}, { auth: { username: process.env.YK_SHOP_ID!, password: process.env.YK_SECRET! } });
return res.data.confirmation.confirmation_url;
}
Webhook YooKassa сообщает финальный статус. Не забываем о повторных нотификациях и идемпотентном апдейте заказов.
Сравнение по критериям, которые реально важны
| Критерий | Telegram Stars (XTR) | Stripe | YooKassa |
|---|---|---|---|
| География | Мировая аудитория Telegram | 45+ стран, нет РФ | РФ (локальные методы) |
| Тип товаров | Цифровые в Mini Apps/ботах | Цифровые и физические | Цифровые и физические, чеки 54‑ФЗ |
| Комиссии/издержки | Покупка Stars у Telegram (включает наценки магазинов), вывод через TON со спредом | Обычно ~2.9% + фикс за транзакцию (зависит от страны и метода) | 2–6% в зависимости от метода, СБП дешевле |
| Чарджбеки | Нет классических чарджбеков | Есть, нужно обрабатывать диспуты | Есть, но реже при СБП |
| Подписки | Ограниченно, нативных рекуррентных XTR нет | Сильные подписки/dunning | Есть рекуррент, но не везде |
| Возвраты | Через бота/поддержку, вручную в балансе Stars | Полноценные Refund/Partial Refund | Refund, с учетом фискализации |
| Онбординг | Быстро, без эквайринга | Требует юрлица/комплаенса | Юрлицо/ИП РФ, договор |
| Риск блокировки iOS | Минимальный для цифровых товаров | Высокий для цифровых на iOS в Mini App | Высокий для цифровых на iOS |
| Вывод средств | Через TON, KYC/AML, курс | На расчетный счет | На расчетный счет в РФ |
Вывод по таблице: если ваш основной продукт — цифровой контент/функции внутри Mini App и вам критичен iOS, Stars — базовый слой. Stripe дополняет глобальным фиатом и подписками, YooKassa — когда ваш core‑рынок РФ и нужны чеки.
Что ломается в продакшене
- Гонки между webhook’ом и апдейтом бота. Stripe прислал
paid, а Telegram‑инвойс еще «в пути» — или наоборот. Решаем через конечный автомат состояний заказа + идемпотентные транзакции в БД. - Двойное списание/двойная доставка. Пользователь дернул
openInvoiceдважды или сделал повторный клик в Stripe Checkout. СохраняемorderIdиpayment_intent/invoice_payload, ставим уникальные ключи вdeliveries(order_id). - Корректное определение платформы. iOS WebApp/встроенный браузер может вести себя иначе с редиректами. Для Stars используем
openInvoice— без внешних переходов. - Валютные округления. Stripe работает в минимальных единицах (центах), Stars — в минимальных долях XTR. Не смешивать типы: отдельные поля
amount_centsиamount_xtr. - Возвраты и доступы. Ревок фичи после рефанда должен быть идемпотентным и атомарным. Лучше «фичи по времени» (подписка) хранить в таблице прав, а не в произвольных полях профиля.
- Антифрод. Для фиата — скорость роста чарджбеков, тестовые карты, «плата за подписку через прокси‑почты». Включите 3DS/обязательные SCA, velocity‑лимиты, проверку страны BIN.
- Вывод Stars → TON. Риски: волатильность, задержки бирж, лимиты на KYC. Продумайте «внутреннюю отчетность» в XTR и фиатном эквиваленте на дату операции (аудит/налоги).
- SLA нотификаций. В Stripe/YooKassa возможны задержки/повторы вебхуков. Telegram update’ы тоже не гарантируют немедленность. Ставьте TTL на заказы и фоновые reconcile‑таски (cron/queue).
Архитектура обработки платежей в очередях:
- Очередь
payments_incoming(source=stripe/yookassa/telegram), задача — валидация и нормализация в унифицированное событиеPaymentSettled. - Сервис
order_fsm: меняет состоянияpending→paid→deliveredс идемпотентными upsert’ами. - Сервис
reconcile: раз в N минут сверяет заказы «paid, но не delivered» и добивает доставку/расследование.
UX и конверсия: детали, которые влияют на деньги
- Показ цены в «звездах» и в локальной валюте. Пользователь должен понимать, сколько это «в рублях/долларах сегодня». Показываем подсказку, но сервер хранит «официальную» цену в XTR.
- One‑tap платеж на iOS. Для Stars — это естественно; для Stripe внутри Telegram WebView — может потребоваться Payment Request API/Apple Pay (поддержка ограничена). Тестируйте реальные устройства.
- Paywall до онбординга. В Mini Apps лучше сначала собрать профиль (телега уже отдала user_id), показать value, и только затем просить оплату. Конверсия выше.
- Failover методов. Если Stripe не доступен стране — не показываем его вовсе. Аналогично для YooKassa за пределами РФ. Меньше лишних кнопок — выше CTR на оплату.
Право, налоги и совместимость с магазинами
- Цифровые товары на iOS. Внутри Mini Apps нельзя проводить внешние фиатные платежи за цифровой контент без риска для приложения. Stars здесь — безопасный путь.
- Физические товары и услуги офлайн. Можно брать фиат (Stripe/YooKassa) без Stars — и это нормально для политик магазинов.
- 54‑ФЗ в РФ. Для расчетов с физлицами в РФ нужен чек. YooKassa формирует чеки автоматически (через ОФД). С Stars понадобится отдельная логика (агентский договор/самостоятельная фискализация при продаже услуг в РФ — консультируйтесь с бухгалтером).
- НДС/НПД/самозанятые. Stripe/YooKassa дают данные для учета; по Stars потребуется своя модель признания дохода в момент расходования XTR/конвертации в фиат.
Сколько это стоит и когда окупается
- Интеграция Stars: 3–7 рабочих дней на MVP (инвойсы, статусы, выдача доступа, базовый биллинг), 2–3 недели на прод‑уровень (рефанды, отчеты, reconcile, антидюбликаты). Себестоимость разработки — от 3–6k$ на базовый контур при готовом бэкенде.
- Stripe: 1–2 недели на одноплатежный флоу (Checkout, webhook, статусы), 3–5 недель на подписки, купоны, прайс‑планирование, отчеты и disput‑воркфлоу. Плюс онбординг/комплаенс.
- YooKassa: 1–2 недели на оплату + чеки, кастомная фискализация — добавляет время. На стороне бизнеса — договор, KYC, согласование витрины.
- Операционные издержки: Stars — спред/волатильность + кассовый разрыв до вывода; Stripe — чарджбеки и fee; YooKassa — чек, ОФД, комиссия по методу.
- ROI: гибрид Stars+Stripe почти всегда бьет «только Stripe» по выручке за счет iOS‑аудитории. Для РФ — YooKassa дает прирост апрува и доверия пользователю СБП.
Рекомендованные сценарии выбора
- Вы продаете цифровые фичи (скины, уровни, подписка на контент): Stars по умолчанию для всего iOS/Android; Stripe как опция в десктопе/вебе и для подписок, где допустимо.
- Вы продаете физические товары: Stripe/YooKassa (по гео) — основной метод; Stars не нужны.
- Вы проектируете глобальный стартап с русскоязычной базой: гибрид Stars + YooKassa для РФ + Stripe для остального.
- B2B/высокие чеки: дополнительно добавляйте инвойс‑платежи (банковские переводы/SEPA/SWIFT в Stripe или прямые реквизиты) — Mini App только генерирует счет и отслеживает статус.
FAQ
Поддерживают ли Stars рекуррентные платежи/подписки?
Пока нативного рекуррентного биллинга в Stars нет. Подписки реализуют как «доступ до даты N» с продлением вручную или через напоминания. Для классических автосписаний — используйте Stripe (или YooKassa, если гео РФ).
Можно ли продавать цифровые товары через Stripe на iOS внутри Mini App?
Формально это конфликтует с правилами магазинов. На практике безопаснее: для iOS показывать Stars для цифрового контента; Stripe/ЮKassa — только для физики/офлайна или за пределами iOS‑клиента (например, десктоп/веб‑линк вне приложения).
Как обрабатывать возвраты в Stars?
Денег «из банка» нет, есть учет в XTR. Возвраты делают как обратные операции в вашем боте/саппорте (вернуть XTR пользователю или компенсировать доступом). В отчетности фиксируем корректировки и держим аудит событий.
Как выводить доход из Stars и считать налоги?
Вывод через TON/площадки, дальше — конвертация в фиат. Налоги зависят от вашей юрисдикции. Часто доход признают на момент получения XTR или конвертации в фиат — консультуйтесь с бухгалтером в своей стране.
Что выбрать для РФ, если нужны чеки по 54‑ФЗ?
YooKassa. Она формирует чеки, интегрирована с ОФД и поддерживает популярные методы (СБП). Stars для цифровых покупок на iOS — как дополнительный метод, но вопрос фискализации решайте отдельно.
Как бороться с дублирующимися платежами и багами вебхуков?
Идемпотентные операции в БД, уникальные ключи на order_id, защита повторных доставок. Все внешние события (Stripe/YooKassa/Telegram) пишем в журнал и агрегируем в единый PaymentSettled с проверкой текущего состояния заказа.
Key takeaways
- Stars — базовый метод для цифровых товаров в Mini Apps, особенно на iOS: высокий UX и отсутствие чарджбеков.
- Stripe — универсальный фиат с подписками и глобальным покрытием; не подходит для РФ и рискован на iOS для цифрового контента.
- YooKassa — лучший выбор для РФ с 54‑ФЗ и СБП; разумно сочетать со Stars для iOS‑покупок.
- В продакшене спасают идемпотентность, конечные автоматы заказов и reconcile‑таски.
- Не смешивайте учет: храните суммы отдельно в XTR и фиате, делайте аудит событий.
- Часто выигрывает гибрид: Stars для iOS/цифры + Stripe/YooKassa для остального.
Если вы строите Mini App с оплатами и хотите не только «чтобы работало», но и чтобы не горело в проде — напишите нам. MTBYTE спроектирует и соберет гибридную платежную архитектуру, подключим Stars/Stripe/YooKassa и доведем до релиза без сюрпризов. Связаться: /contact