Legan Studio
Все статьи
~ 8 мин чтения

Telegram Stars: монетизация ботов и Mini Apps в 2026

Как принимать платежи в Telegram Stars, выводить XTR, считать комиссию и встроить Stars в подписки, цифровые товары и Mini Apps без сторонних провайдеров.

  • Telegram
  • Stars
  • монетизация
  • платежи

Telegram Stars (XTR) — это внутренняя валюта Telegram, через которую боты и Mini Apps продают цифровые товары и подписки без подключения внешних эквайеров. С 2024 года это единственный способ официально монетизировать цифровой контент в Telegram, и в 2026 году Stars стал зрелой инфраструктурой: с возвратами, подписками, чеками и понятным выводом средств.

Ниже — полный разбор: как принимать Stars, как считать экономику с учётом комиссии Apple/Google и доли Telegram, как реализовать подписку, рефанды и связку с CRM, и какие ошибки чаще всего ловят разработчики на проде.

Что такое Telegram Stars и зачем они нужны

Stars — это аналог внутриигровой валюты на уровне всего мессенджера. Пользователь покупает Stars через App Store, Google Play или Fragment, а внутри ботов и Mini Apps тратит их на цифровые товары: подписку, доступ к каналу, разблокировку фичи в Mini App, виртуальные предметы.

Для разработчика плюсы простые: нет KYC по 115-ФЗ, нет договора с эквайером, нет PCI DSS, нет необходимости держать СБП-шлюз. Минус один — комиссия. Apple/Google забирают 30% при покупке Stars, Telegram оставляет себе ~30% от того, что дошло до бота, плюс комиссия за конвертацию в TON или фиат при выводе. На круг разработчик получает 50–55% от цены, которую заплатил пользователь.

Когда Stars подходят, а когда нет

Stars обязательны для любых цифровых товаров внутри Telegram: подписка на закрытый канал, премиум-функции в Mini App, доступ к курсу, виртуальные подарки. Использовать СБП или карты для этих случаев нельзя — Telegram заблокирует бота при жалобе.

Для физических товаров и услуг вне Telegram (доставка пиццы, запись в салон, билеты на офлайн-мероприятие) Stars наоборот не подходят: нужна обычная касса по 54-ФЗ, СБП, карты. Здесь работает классический sendInvoice с провайдером ЮKassa или CloudPayments.

sendInvoice со Stars: минимальный пример

В Bot API для Stars используется тот же sendInvoice, но с пустым provider_token и валютой XTR. Цена указывается в Stars (1 Star ≈ $0.013 в розничном эквиваленте, но во внутренних расчётах считаем целыми XTR).

from aiogram import Bot, Router, F
from aiogram.types import Message, LabeledPrice, PreCheckoutQuery

router = Router()

@router.message(F.text == "/buy_pro")
async def buy_pro(message: Message, bot: Bot):
    await bot.send_invoice(
        chat_id=message.chat.id,
        title="PRO-доступ на 30 дней",
        description="Безлимитные генерации, приоритетная очередь, экспорт в PDF.",
        payload=f"pro_30d:{message.from_user.id}",
        provider_token="",            # для Stars — пусто
        currency="XTR",
        prices=[LabeledPrice(label="PRO 30 дней", amount=250)],  # 250 Stars
    )

payload — это ваш внутренний идентификатор заказа, он вернётся в successful_payment без изменений. Никогда не кладите туда секреты — он виден в логах Telegram.

Обработка pre_checkout и successful_payment

Telegram перед списанием Stars присылает pre_checkout_query: у вас есть 10 секунд, чтобы подтвердить или отклонить покупку (например, если товар уже распродан).

@router.pre_checkout_query()
async def precheckout(query: PreCheckoutQuery, bot: Bot):
    order_id = query.invoice_payload
    if not await orders.is_available(order_id):
        await bot.answer_pre_checkout_query(
            query.id,
            ok=False,
            error_message="К сожалению, товар закончился. Stars не списаны."
        )
        return
    await bot.answer_pre_checkout_query(query.id, ok=True)


@router.message(F.successful_payment)
async def on_paid(message: Message):
    sp = message.successful_payment
    await orders.mark_paid(
        payload=sp.invoice_payload,
        charge_id=sp.telegram_payment_charge_id,
        amount_xtr=sp.total_amount,
    )
    await message.answer("Готово! PRO активирован на 30 дней.")

telegram_payment_charge_id — это идентификатор, по которому потом делается рефанд. Сохраните его в БД рядом с заказом, без него возврат невозможен.

Подписки в Stars

С весны 2025 в Bot API появились Star subscriptions — рекуррентные списания каждые 30 дней без участия пользователя. Включаются параметром subscription_period: 2592000 в createInvoiceLink.

link = await bot.create_invoice_link(
    title="PRO-подписка",
    description="Доступ к расширенным функциям, 30 дней.",
    payload="sub_pro",
    currency="XTR",
    prices=[LabeledPrice(label="PRO", amount=250)],
    subscription_period=2592000,
)

Telegram сам списывает Stars каждые 30 дней. Если у пользователя не хватает Stars, подписка ставится на паузу, и вам прилетит апдейт chat_member с новым статусом или событие в successful_payment после пополнения.

Тип продажиМетодprovider_tokencurrency
Разовая покупка цифрового товараsendInvoiceпустоXTR
Подписка на 30 днейcreateInvoiceLink + subscription_periodпустоXTR
Физический товарsendInvoiceтокен ЮKassaRUB
Услуга вне TelegramsendInvoiceтокен CloudPaymentsRUB

Возвраты: refundStarPayment

Возвращать Stars умеет любой бот, продавший товар. Метод — refundStarPayment, нужны user_id и telegram_payment_charge_id.

await bot.refund_star_payment(
    user_id=user_id,
    telegram_payment_charge_id=charge_id,
)

Stars вернутся пользователю мгновенно, у бота списываются с баланса. Возврат возможен в течение 21 дня — после этого срока Telegram уже выплатил вам средства, и вернуть их через API нельзя (только вручную через поддержку).

Экономика: сколько реально получит разработчик

Допустим, продаёте PRO-доступ за 250 Stars (≈ 350 ₽ в App Store на iOS, ≈ 320 ₽ в Google Play на Android, ≈ 290 ₽ через Fragment).

Канал покупкиЦена для юзераApple/GoogleTelegramВам на баланс% от цены
iOS App Store350 ₽105 ₽ (30%)~75 ₽~170 ₽48%
Google Play320 ₽96 ₽ (30%)~70 ₽~155 ₽48%
Fragment (TON)290 ₽0 ₽~85 ₽~205 ₽70%

Поэтому в боте полезно мягко подсказывать пользователям пополнять Stars через Fragment — там нет налога Apple/Google.

Вывод средств: TON или фиат

Stars выводятся:

  1. В TON через бота @BotFather/mybots → Payments → Withdraw Stars. Минимум 1000 Stars, комиссия сети TON (~0.1 TON), приходит на ваш кошелёк за 1–5 минут.
  2. В фиат через Fragment по реквизитам юрлица/ИП. Доступно не во всех юрисдикциях, для РФ требуется иностранный счёт или счёт ИП в ОАЭ/Армении.

Большинство студий выводит в TON, а потом продаёт за рубли через P2P-биржи или OTC. Учтите валютный контроль и налог на доход.

Связка Stars с CRM и аналитикой

Каждый successful_payment отправляйте в очередь и оттуда в CRM (Bitrix24, amoCRM) и в аналитику. Минимальный payload:

async def on_paid(message: Message):
    sp = message.successful_payment
    await event_bus.publish("payment.success", {
        "user_id": message.from_user.id,
        "username": message.from_user.username,
        "amount_xtr": sp.total_amount,
        "charge_id": sp.telegram_payment_charge_id,
        "payload": sp.invoice_payload,
        "ts": int(time.time()),
    })

В Yandex.Metrika из Mini App отправляйте цель purchase с goal_id через tgWebApp.sendData или прямой вызов ym(counterId, "reachGoal", "purchase", { value_xtr: 250 }). Так вы увидите ROI рекламы в Telegram Ads с точностью до объявления.

Топ-7 ошибок при работе со Stars

  1. Не проверяют pre_checkout_query и продают уже распроданный товар.
  2. Кладут JWT или email в payload — он логируется на стороне Telegram.
  3. Не сохраняют telegram_payment_charge_id и не могут сделать рефанд.
  4. Используют Stars для физических товаров — получают блокировку бота.
  5. Забывают, что цена в prices — это целые Stars, не дробные.
  6. Не обрабатывают повторный successful_payment (идемпотентность по charge_id).
  7. Считают, что 100 Stars = 100 ₽; реальный курс плавает в зависимости от канала покупки.

Итого

Telegram Stars в 2026 — рабочий и предсказуемый канал монетизации цифровых продуктов внутри Telegram. На круг разработчик получает 48–70% от цены покупки в зависимости от того, через что пользователь пополнил баланс. Главное — корректно обрабатывать pre-checkout, хранить charge_id для рефандов, грамотно нарезать тарифы и не пытаться продавать через Stars то, что Telegram считает услугами вне платформы.

Частые вопросы

Можно ли принимать Stars и рубли в одном боте?

Да, и это рекомендуемая схема. Stars — для цифровых товаров и подписок внутри Telegram, рубли через ЮKassa или CloudPayments — для услуг и физических товаров. В одном боте могут жить два разных sendInvoice: один с currency="XTR" и пустым provider_token, второй с currency="RUB" и реальным токеном эквайера. Главное — корректно различать их в successful_payment по payload и не путать в аналитике.

Что выгоднее: Stars или прямой эквайринг?

Зависит от среднего чека и аудитории. Для микроплатежей (50–500 ₽) и подписок Stars выгоднее: нет фикс-комиссии, мгновенное списание, нет необходимости в кассе и фискализации. Для крупных покупок (от 3000 ₽) выгоднее СБП через ЮKassa: комиссия 0.4–0.7% против эффективных 30–52% у Stars. Для смешанной модели — берите оба.

Как часто Telegram выплачивает Stars?

Заработанные Stars становятся доступны к выводу через 21 день после получения — это окно для рефандов. После этого вы видите их в @BotFather → Payments и можете вывести в TON в любой момент. Минимум для вывода — 1000 Stars. Комиссия сети TON около 0.1 TON, идёт за счёт получателя.

Можно ли вернуть Stars после 21 дня?

Через refundStarPayment — нет, метод вернёт ошибку PAYMENT_REFUND_EXPIRED. После 21 дня средства уже выплачены вам, и единственный путь — связаться с поддержкой Telegram через @BotSupport и согласовать ручной возврат. Поэтому полезно держать SLA по обработке жалоб в пределах двух недель.

Нужна ли касса по 54-ФЗ при продаже за Stars?

Если конечный получатель — ИП или ООО на территории РФ и пользователь — резидент, налоговая трактует это как доход и требует фискализации. На практике многие студии выводят Stars на иностранную юрисдикцию (ОАЭ, Армения, Кипр) и платят налог там. Если работаете через российское ИП — ставьте онлайн-кассу через АТОЛ или Бизнес.Ру и пробивайте чеки на каждую успешную транзакцию.

Как реализовать пробный период в подписке Stars?

В API Stars нет нативного trial. Реализуется на стороне бота: первые 7 дней просто выдаёте PRO-статус, на 7-й день присылаете createInvoiceLink с подпиской на 30 дней. Если пользователь не оплатил — возвращаете free-тариф. Альтернатива — продать первый период за 1 Star (≈1.5 ₽) и потом продлевать по полной цене, но Telegram может пометить это как манипуляцию.

Можно ли подарить Stars другому пользователю через бота?

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