Задача
Закрытый телеграм-клуб по вязанию. Вход платный, оплата разовая: заплатил один раз – остался в канале навсегда, никаких подписок и повторных списаний. До автоматизации всё это делалось руками: человек писал, ему называли реквизиты, он присылал скриншот перевода, и только потом получал ссылку.
Задача формулировалась просто: пусть бот принимает оплату и сам выдаёт доступ. Условие владелицы клуба звучало ещё проще – чтобы это ничего не стоило в месяц. Клуб небольшой, платить за сервер ради нескольких обращений в день бессмысленно.
Решение
Бот целиком живёт на бесплатном тарифе Cloudflare Workers. Там же база на D1 – пользователи, платежи, настройки, – и крон, который раз в минуту добивает статусы оплат. Отдельного сервера в схеме нет вообще: телеграм-бот запускается только в момент, когда кто-то ему написал.
Оплата идёт через ЮMoney, доступ выдаётся одноразовой пригласительной ссылкой – её нельзя переслать подруге, она сгорает после первого входа. Владелице клуба досталась панель с заявками и настройками, куда мы не входим: тексты, сумму и надпись на кнопке она меняет сама.
Почему бесплатный бот получился именно на Cloudflare
Первая версия строилась в Яндекс Облаке, и там бесплатным бот быть отказывался. Виноват холодный старт: функция просыпалась двадцать одну секунду, а телеграм столько ждать не станет – вебхук отваливался по таймауту.
Обход был очевидный и разорительный: перейти на опрос, то есть держать функцию, которая сама спрашивает телеграм о новых сообщениях. Работает, но работает всегда. Функция крутилась пятьдесят восемь секунд из каждых шестидесяти, круглосуточно, при том что реальных сообщений было несколько десятков в день. Счёт капал за простой.
У Workers холодного старта нет. Вебхук отвечает мгновенно, вызов происходит ровно тогда, когда пришло сообщение, а в промежутках не выполняется ничего. Отсюда и ноль в счёте: создание бота бесплатно возможно не потому, что тариф щедрый, а потому что архитектура не заставляет платить за ожидание.
Ретранслятор: почему без российского адреса деньги не доходят
Здесь была самая дорогая находка проекта, и на ней мы потеряли полдня.
ЮMoney не отправляет уведомления об оплате на зарубежный домен. А Cloudflare – зарубежный. Коварство в том, что проверить это кнопкой нельзя: в кошельке есть тестовая отправка, и она доходит прекрасно. Тестовое уведомление приходит, боевое – нет. Мы успели перебрать подпись, формат формы и тип кнопки, прежде чем поняли, что дело вообще не в них.
Решение – функция-ретранслятор на российском адресе, в Yandex Cloud. Она принимает уведомление от платёжки и передаёт его боту, не меняя тело запроса, поэтому подпись остаётся валидной. Холодный старт, который убил первую версию, здесь не мешает: тот же крон Cloudflare раз в минуту пингует функцию, она отвечает и не засыпает. Денег это не стоит – пинг укладывается в бесплатный лимит.
Правило, которое мы вынесли и применяем теперь всегда: любой российский платёжный сервис проверять на боевом платеже. Тестовая кнопка не доказывает ничего.
Как это работает
- Человек нажимает «Старт» и видит описание клуба и кнопку оплаты.
- Бот выставляет счёт в ЮMoney на сумму, заданную владелицей в панели.
- После оплаты уведомление идёт в российский ретранслятор, оттуда – боту.
- Параллельно крон раз в минуту сам опрашивает статус платежа, а у человека есть кнопка «Я оплатил» – доступ не зависит от того, дошло уведомление или нет.
- Бот создаёт одноразовую пригласительную ссылку и отправляет её в личку.
- Заявка попадает в панель: когда нажал старт, дошёл ли до оплаты, оплатил ли, вошёл ли в канал.
Что владелица меняет без нас
Панель открывается по тому же адресу, вход по паролю. Внутри две вкладки. В настройках – приветствие, сумма, надпись на кнопке, текст после оплаты, текст напоминания, реквизиты кошелька и идентификатор канала. В заявках – таблица с фильтрами по дню, неделе и месяцу и подсчётом конверсии от старта до входа в канал.
Это принципиальный момент для маленького проекта: если каждая правка текста требует разработчика, бесплатная инфраструктура перестаёт быть бесплатной – она просто меняет статью расходов.
Результат
Клуб получил автоматическую продажу входа вместо переписки со скриншотами, а владелец – отсутствие ежемесячного счёта. Бот сдан и работает на аккаунте клиента: мы не держим ни его инфраструктуру, ни его деньги.
Стек
Схема повторяется на любом проекте, где нужен платный доступ в закрытый канал: клуб, курс, сообщество. Меняются тексты и сумма, архитектура остаётся той же.
Грабли, на которые уже наступил
Тестовое уведомление платёжки ничего не доказывает. Разобрано выше и стоило полдня. Проверять только боевым платежом на настоящую сумму.
Бесплатный тариф не равен бесплатной архитектуре. В Яндексе тариф тоже щедрый, но схема с постоянным опросом съедала его за сутки. Считать надо не лимиты, а то, сколько времени код реально выполняется.
Cloudflare периодически недоступен из России. Роскомнадзор время от времени блокирует его подсети. Для бота это не смертельно – телеграм ходит к нему сам, – но означает, что на входящие уведомления от платёжки закладываться нельзя. Поэтому статусы мы опрашиваем сами и добавили кнопку «Я оплатил»: даже если ни одно уведомление не дойдёт, человек получит доступ.
Подпись уведомления считается по новой схеме. Старый способ со склейкой полей отмер весной 2026 года. Сейчас это HMAC-SHA256 в нижнем регистре по отсортированным и URL-кодированным параметрам. Половина инструкций в поиске описывает мёртвую схему – по ним подпись никогда не сойдётся.
Вопросы и ответы
Бот для телеграм бесплатный – так бывает?
Бывает, если считать инфраструктуру. Хостинг, база и планировщик укладываются в бесплатные тарифы, пока нагрузка небольшая: речь о десятках и сотнях сообщений в день, а не о рассылке на миллион. Бесплатной становится эксплуатация, а не разработка – написать и настроить бота всё равно кто-то должен.
Создание бота бесплатно – в чём подвох?
Подвоха два. Первый: конструкторы дают бесплатный тариф, но забирают его ровно там, где начинается нужное вам – приём платежей, своя база, выдача доступов. Второй: бесплатный тариф облака легко проесть кривой архитектурой, как это вышло у нас в первой версии. Бесплатно получается не от тарифа, а от того, что код выполняется только по делу.
А если клуб вырастет – придётся платить?
При росте в разы – да, но пороги бесплатных тарифов высокие. Для клуба, где несколько десятков обращений в день, запас многократный. И переезд не потребуется: меняется тариф, а не схема.
Чем это отличается от конструктора ботов?
Конструктор берёт абонентскую плату и живёт на своей стороне: ваши подписчики, платежи и тексты лежат у него. Здесь всё на аккаунтах владельца клуба – он не зависит ни от нас, ни от чужого сервиса. Подробнее разница разобрана в статье про границу между конструктором и своим ботом.
Можно так же сделать бесплатный чат-бот, а не платный вход?
Да, схема та же: бот на Workers, база рядом, вебхук вместо опроса. Разница только в том, что без приёма денег из схемы уходит платёжка и вместе с ней ретранслятор – а это как раз самая хлопотная часть проекта.
Кому принадлежит бот после сдачи?
Владельцу клуба. Аккаунт облака, кошелёк, бот и панель оформлены на него, доступы переданы. Мы не держим ни инфраструктуру, ни деньги и не выступаем посредником в платежах.