Разработка · 7 мин чтения

Продажа доступа в закрытый Telegram-канал: оплата, чеки, автовыдача

Продажа доступа в закрытый телеграм канал - это связка из трёх кусков: деньги, документ об оплате и сама выдача ссылки. Каждый кусок можно закрыть руками - принять перевод на карту, кинуть чек в личку, добавить человека в канал вручную. На потоке 5-10 подписчиков в день это ещё работает. На потоке 50+ в день ручная выдача превращается в отдельную должность, а забытый чек или подписка, которую никто вовремя не отключил, оборачивается разговором с налоговой или с недовольным подписчиком, который платит, а доступа не получил. Ниже - как я собираю такие связки на практике: от выбора эквайринга до бота, который сам создаёт одноразовую ссылку и выкидывает пользователя из канала по истечении срока.

Архитектура платного канала: из чего она реально состоит

В Telegram нет встроенного пейволла для обычных закрытых каналов - есть только звёздные подписки для авторов контента, и они закрывают узкий сценарий. Для остальных случаев архитектуру собираешь сам вокруг пригласительных ссылок с ограничениями: expire_date (время жизни), member_limit (сколько раз можно перейти) и creates_join_request (заявка на вступление, которую бот одобряет вручную или автоматически).

В рабочей связке обычно шесть элементов:

  • точка приёма оплаты - лендинг, сайт на Tilda или кнопка в самом боте;
  • эквайринг или платёжный сервис, который присылает уведомление об оплате;
  • онлайн-касса, формирующая чек;
  • генератор пригласительной ссылки на стороне Telegram Bot API;
  • база данных с датой окончания подписки для каждого пользователя;
  • задача, которая ежедневно кикает тех, у кого срок вышел.

Если выкинуть последний пункт, канал постепенно наполняется людьми, которые платили один раз три месяца назад и продолжают читать бесплатно - и это не гипотетическая проблема, а то, с чем реально приходят ко мне после полугода ручного администрирования.

Способы приёма оплаты за доступ к каналу

Выбор платёжки определяет, насколько просто дальше автоматизировать выдачу и чек. Сравнение по своей практике:

Способ Как подключается Комиссия на рынке Когда имеет смысл
T‑Bank эквайринг сайт/лендинг + виджет оплаты, вебхук на успешный платёж обычно 2,5-3,5% с оборота своя посадочная страница, нужен рекуррент для юрлиц
ЮKassa виджет или API, чек формируется автоматически от 2,8% в зависимости от оборота быстрый старт без своей кассы
CloudPayments API + встроенная фискализация около 2,7-3,2% рекуррентные подписки, автосписание раз в месяц
Telegram Stars / Payments внутри бота оплата прямо в чате бота, без ухода на сайт комиссия площадки + конвертация звёзд минимальный порог входа, аудитория без банковских карт
СБП по QR через банк-эквайер или платёжный агрегатор обычно ниже эквайринга карт, 0,4-1% разовые платежи без подписки

Если планируешь именно подписку с ежемесячным списанием, а не разовую продажу, сразу уточняй у банка возможность рекуррентных платежей - это отдельный тип договора, не все тарифы его включают по умолчанию. Я обычно связываю приём оплаты с лендингом на Tilda через кастомный скрипт, который дергает вебхук после успешной оплаты и передаёт его дальше в бота или в n8n.

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Чеки и 54-ФЗ: как оформить продажу подписки легально

Любая систематическая продажа доступа физлицам подпадает под 54-ФЗ - чек должен формироваться в момент оплаты, а не когда вспомнишь. Три рабочих варианта в зависимости от статуса:

  • самозанятый - чек через API «Мой налог», НПД 4% с физлиц или 6% с ИП/ООО, свою кассу покупать не нужно;
  • ИП или ООО без своей кассы - берёшь облачную кассу от ЮKassa или CloudPayments, они сами фискализируют платёж и отправляют чек на почту клиента;
  • ИП или ООО с оборотом, который не покрывает облачное решение по условиям банка - ставишь физическую или облачную ККТ отдельно (например, Атол Онлайн) и интегрируешь через API.

Разовая продажа или подписка с автосписанием

Разовая продажа проще технически - оплатил, получил ссылку, дальше твоя забота только про истечение срока и кик. Подписка с автосписанием требует хранения токена карты на стороне платёжки (сам его не видишь и не хранишь - это забота банка, не твоя), отдельного согласия на рекуррент от клиента и логики повторной попытки списания, если карта не прошла с первого раза. Я закладываю на подписочную модель отдельный вебхук «списание не удалось», который переводит пользователя в статус «грейс-период 3 дня», а не сразу кикает - иначе support завален вопросами из-за банальных технических сбоев на стороне банка.

Отдельно - про хранение данных подписчиков: если ведёшь базу с телефонами, почтами и датами оплаты, держи её на сервере в РФ (своя база Postgres, CRM с российским хостингом), а не в Google Sheets или Airtable - по 152-ФЗ персональные данные россиян должны обрабатываться на серверах, расположенных в России.

Автовыдача доступа: бот-привратник на aiogram

Схема, которую я собираю чаще всего: канал закрыт для прямого вступления, все заявки идут через creates_join_request=True, а бот с правами администратора одобряет их только тем, у кого есть активная запись в базе.

Последовательность такая: оплата → вебхук в бота → бот создаёт одноразовую ссылку с member_limit=1 и коротким expire_date (обычно 15-30 минут, чтобы ссылку не успели переслать третьим лицам) → отправляет её пользователю → пользователь переходит и отправляет заявку → бот ловит событие chat_join_request и одобряет только если в базе есть активная оплата на этот user_id.

@router.chat_join_request()
async def approve_paid_member(request: types.ChatJoinRequest):
    subscription = await db.get_active_subscription(request.from_user.id)
    if subscription and subscription.expires_at > datetime.utcnow():
        await request.approve()
        await bot.send_message(request.from_user.id, "Доступ открыт до " + subscription.expires_at.strftime("%d.%m.%Y"))
    else:
        await request.decline()

Такая схема закрывает главную дыру ручной выдачи - пересланную другу ссылку без ограничения по времени и числу переходов, которая гуляет по каналу месяцами.

Автоматизация через n8n без написания бота с нуля

Если не хочется поднимать отдельного бота под каждый канал, тот же процесс собирается в n8n за один workflow: нода Webhook принимает уведомление от ЮKassa или T‑Bank об успешной оплате, нода Function проверяет подпись запроса, дальше HTTP Request дергает Telegram Bot API createChatInviteLink, а следующая нода пишет запись со сроком действия в Postgres - не в Google Sheets, чтобы не тащить персональные данные подписчиков за пределы РФ.

curl -X POST "https://api.telegram.org/bot/createChatInviteLink" 
  -d chat_id=-1001234567890 
  -d member_limit=1 
  -d creates_join_request=true 
  -d expire_date=1735689600

Отдельным плюсом такой связки идёт скорость сборки - на n8n workflow с приёмом оплаты, генерацией ссылки и записью в базу у меня уходит один-два дня против недели на бота с нуля. Готовый шаблон подобного сценария есть у меня в библиотеке готовых скриптов - можно взять за основу и адаптировать под свою платёжку.

Автокик по истечении подписки и напоминания

Выдать доступ - половина дела, вторая половина - вовремя его забрать. Ежедневная cron-задача (в n8n - нода Schedule Trigger, в боте - APScheduler) сравнивает даты окончания подписок с текущей датой и для просроченных вызывает banChatMember, а сразу следом unbanChatMember - это исключает пользователя из канала, но не банит его навсегда, он сможет вернуться после новой оплаты.

За 3 дня до окончания стоит присылать напоминание в личку с кнопкой продления - это снижает отток на 15-20% по моим замерам на паре ботов с платной подпиской, просто потому что часть людей забывает продлить, а не осознанно отказывается.

Параметр Ручное администрирование Бот с автовыдачей и автокиком
Время до выдачи доступа от нескольких минут до часов, зависит от того, когда админ увидел оплату секунды после вебхука
Риск бесплатного доступа после просрочки высокий, если админ забыл проверить исключён - кик по расписанию
Масштаб без потери качества комфортно до 10-20 заявок в день ограничен только лимитами Bot API
Пересылка ссылки третьим лицам стандартная ссылка на канал, легко расшарить одноразовая ссылка с истечением, риск минимален

Автоматизация в мессенджере

Telegram-бот / Mini App

от 30 000 ₽

Подробнее →

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

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

Если это разовая продажа другу - формально не страховой случай для налоговой. Но систематическая продажа доступа физлицам за деньги - это предпринимательская деятельность, и для неё нужен статус самозанятого, ИП или ООО с чеком на каждую оплату, независимо от того, идут деньги через СБП, эквайринг или на карту.

Что будет, если добавлять людей в канал вручную по мере оплаты?

На малых объёмах ничего критичного, кроме потери времени. На больших - растут задержки между оплатой и доступом, появляются забытые просроченные подписчики и споры по возвратам, потому что нет единого лога, кто и когда получил ссылку.

Сколько стоит бот с автовыдачей доступа и автокиком по подписке?

Базовый телеграм-бот с генерацией одноразовых ссылок и ежедневным кикером у меня стоит от 30 000 ₽. Если добавляется интеграция с рекуррентными платежами, онлайн-кассой и CRM - сумма растёт, обычно старт от 50 000 ₽ в зависимости от количества платёжных систем.

Как быть с возвратами, если подписчик просит деньги назад?

Возврат оформляется через API эквайринга (ЮKassa, CloudPayments и T‑Bank это поддерживают), а параллельно бот должен сразу отозвать доступ - иначе получится ситуация, где деньги вернули, а человек продолжает читать канал до конца оплаченного периода.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Самозанятый Калинкин Н. А. · работаю с физлицами и юрлицами

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно