Кафе, сайт и розыгрыши в мессенджере: как это работает вместе
Розыгрыши среди гостей вели вручную: номерки записывали, оплату сверяли в переписке. Собрал связку «сайт плюс бот плюс админка», где номерок покупают в чате, а победителя можно перепроверить. С 14 октября заказы на сайте принимаются только с онлайн-оплатой.
Коротко (TL;DR)
- Кафе национальной кухни в регионе. Сначала сделал сайт статикой на своём сервере: меню наборами блюд с фото, реальные условия доставки, юридические страницы и разметка заведения общепита.
- Поверх сайта поставил бота в мессенджере MAX: номерок для розыгрыша покупается прямо в переписке, а у владельца есть админка с сеткой номерков, бронью на 15 минут, отметкой оплат и рассылкой подписчикам.
- Главная страница похудела с 1603 КБ до 303 КБ, загрузка упала с 3203 мс до 1826 мс. Розыгрыш прогнал вручную на 35 номерках, для администратора написал памятку.
- Обновление 14.10.2026: заказы наборов на сайте теперь только с онлайн-оплатой, вариант «при получении» убран по просьбе владелицы. Если банк недоступен, сервер заказ не создаёт и честно показывает ошибку. Оферту переписал под это.
Сделаю под ключ: разберу задачу, назову срок и цену. Чтобы начать, напишите в Telegram одной фразой.
Обсудить ботаСайт кафе обычно делают один раз и забывают. Он висит, показывает меню и телефон, а работа идёт мимо него — в переписке, в звонках, в тетрадке у администратора. Расскажу, как из сайта получился инструмент, в который владелец заходит каждый день, и что для этого пришлось достроить сверху.
Сайт: меню, доставка и документы
Начал с базы. Сайт собрал статикой — то есть страницы отдаются готовыми файлами, без базы данных и тяжёлого движка. Для кафе это правильный выбор: меню меняется не каждый час, зато страница открывается быстро и почти не ломается. Поставил на свой сервер, подключил защищённое соединение с сертификатом, который продлевается сам.
Меню перестроил: вместо перечисления позиций — наборы блюд с фотографиями и описаниями, чтобы человек понимал, что именно получит. Добавил реальные условия доставки и настоящее время работы. Звучит скучно, но именно на этих пунктах теряются заказы: человек не понял, довезут ли до него, и ушёл.
Отдельно закрыл юридическую часть, потому что сайт принимает контакты людей. Написал политику обработки персональных данных и публичную оферту, добавил чекбокс согласия к форме, баннер про cookie и реквизиты в подвале. Без этого сайт работает ровно до первой претензии.
Чтобы кафе находили
Дальше — чтобы сайт вообще показывался в поиске. Прописал мета-теги на страницах: это короткие описания, которые видит человек в выдаче до того, как кликнет. Добавил гео-теги региона — подсказку поисковику, где физически находится заведение.
Поверх этого поставил разметку заведения общепита. Это невидимый для посетителя блок данных, из которого поисковик понимает: перед ним кафе, у него есть адрес, часы работы и меню. Такие карточки в выдаче выглядят богаче обычной синей ссылки. Плюс карта сайта и файл robots, чтобы страницы обходились целиком и в нужном порядке.
Бот вместо формы заказа
Сайт сам по себе кафе даёт немного. Поэтому вторым слоем сделал бота в мессенджере MAX. У него команды и кнопки, приём файлов, а главное — покупка номерка для розыгрыша прямо в переписке. Человек не уходит на сторонний сайт, не регистрируется, не вводит пароль. Открыл чат, выбрал номер, оплатил.
Розыгрыш здесь не развлечение, а повод вернуться. Кафе получает список тех, кто уже проявил интерес, — и может написать им ещё раз, когда появится новое меню.
К боту сделал мини-приложение — окно, которое открывается внутри мессенджера и показывает ту же сетку номерков. Кому удобнее кнопками в чате, тот остаётся в чате. Кому удобнее видеть сетку целиком, открывает мини-приложение. Данные общие.
Админка, в которую владелец заходит сам
Самая важная часть проекта — панель для владельца. Через неё создаётся розыгрыш, видна сетка номерков, отмечаются оплаты, собирается дашборд с текущим состоянием и уходит рассылка подписчикам бота.
Отдельно продумал бронь. Когда человек выбирает номерок, тот резервируется на 15 минут. За это время он переводит деньги, админ подтверждает — номерок закрепляется. Не успел, деньги не пришли — номерок возвращается в общий доступ. Без такой брони два человека спокойно оплачивают один и тот же номер, и дальше разбирается уже владелец, а не программа.
Оплата на старте — перевод по системе быстрых платежей и ручное подтверждение админом. Это сознательное решение: запустить быстро, без подключения эквайринга и долгих согласований. Эквайринг заложен как надстройка — когда оборот это оправдает, он встанет на готовое место, а логика брони и сетки не изменится.
Как доказывается честность розыгрыша
Розыгрыш всегда упирается в один вопрос: откуда участники знают, что победителя не назначили заранее. Поэтому окно выбора победителя сделал с контрольной строкой. Это короткий набор символов, который считается из исходных данных розыгрыша. Он публикуется вместе с результатом, и по нему любой желающий может перепроверить, что итог не подкручивали задним числом.
Технически это мелочь. По смыслу — то, без чего механика не работает: за номерок платят только тогда, когда верят в результат.
Перед сдачей прогнал розыгрыш вручную на 35 номерках: бронь, оплаты, отмена по таймауту, выбор победителя, проверка строки. Для администратора написал памятку на каждый день, чтобы запуск не требовал моего участия.
Стек и один пойманный баг
Под капотом: статика и nginx с сертификатом на автопродлении, бэкенд розыгрышей на FastAPI и SQLite, службы systemd, чтобы всё поднималось само после перезагрузки, и отдельный воркер на длинных запросах к API мессенджера.
На этом воркере и поймал главный баг. Мессенджер держит соединение и отвечает до 30 секунд, а у HTTP-клиента стоял таймаут 20 секунд. Клиент рвал связь раньше, чем приходил ответ, — и бот молча терял события. Выглядело как случайные пропажи сообщений, а причина была в двух числах, которые не сошлись.
Картинки перевёл в формат WebP с запасным JPEG для старых браузеров и добавил предзагрузку главной картинки первого экрана — чтобы она появлялась сразу, а не через секунду после текста.
Цифры и что осталось открытым
| Что мерил | Было | Стало |
|---|---|---|
| Вес страницы | 1603 КБ | 303 КБ (минус 81%) |
| Первый экран | 700 КБ | 230 КБ |
| Загрузка | 3203 мс | 1826 мс |
| Логотип | 517 КБ | 81 КБ |
При повторном заходе картинки берутся из кэша браузера, то есть заново не скачиваются вообще. Вёрстку проверил на трёх ширинах: 375, 768 и 1440 пикселей — телефон, планшет, компьютер. Кнопки плюс и минус в корзине были 24 на 24 пикселя, пальцем в такие не попасть, — увеличил.
Открытых хвостов на момент сдачи два: два фото блюд пока стоят заглушками и ждут съёмки, а регистрация мини-приложения в кабинете разработчика мессенджера делается на стороне заказчика. Об обоих написал прямо, а не оставил всплывать потом.
Что добавилось в сентябре
К сентябрю бот и админку покрыл автопроверками: проходит 73 из 73. Пока их писал, нашёл и исправил 3 ошибки, которые ручной прогон не поймал.
Самое полезное дал первый живой покупатель. Он споткнулся на вводе телефона, хотя в тестах этот шаг проходил без проблем. Место исправил. Автопроверки ловят то, что в них заложено, а живой человек находит то, о чём никто не подумал.
Что поменялось 14 октября: заказ только с оплатой
Заказ наборов с сайта к этому времени уже можно было оплатить онлайн картой или через СБП, а можно было выбрать оплату при получении. 14 октября владелица попросила второй вариант убрать, и теперь на сайте один путь. Человек собирает корзину, переходит на защищённую страницу банка и платит, а владелица видит заказ только после того, как банк подтвердил оплату. Доставка по-прежнему оплачивается курьеру отдельно.
Убрать кнопку на странице мало. Браузер может держать в кэше старую версию сайта, где выбор ещё был, и прислать заказ «при получении». Поэтому правило живёт на сервере: на любой запрос он создаёт заказ только с онлайн-оплатой, а пометку о способе оплаты от старых страниц просто не учитывает.
Второй вопрос: что делать, если банк не отвечает. Сервер в этом случае заказ не создаёт вовсе. Если платёж не удалось открыть, черновик заказа удаляется, а гость видит сообщение, что онлайн-оплата временно недоступна, и может позвонить в кафе. На кухню не прилетает заказ, за который никто не заплатит. Оба случая, недоступный банк и выключенная оплата, проверяются автотестом: заказ не появляется, гость получает ошибку.
Под это же я переписал пункт оферты про оплату. Теперь там сказано, что заказ на сайте оплачивается полностью при оформлении картой или через СБП, платёж принимает банк на своей странице, данные карты кафе не получает, а чек приходит в электронном виде. Документы должны говорить ровно то, что делает сайт, иначе первая же претензия упрётся в расхождение. Сколько заказов кафе потеряло или сохранило после этого изменения, я пока не знаю, прошло два дня.
Частые вопросы
Зачем кафе бот, если есть сайт?
Сайт человек открывает, когда ищет. Бот остаётся у него в списке чатов и позволяет написать первым — про новое меню, про розыгрыш, про доставку. Это разные задачи, и вместе они работают лучше, чем порознь.
Почему оплата вручную, а не сразу картой?
Чтобы запуститься быстро. Перевод по системе быстрых платежей и подтверждение админом работают с первого дня и не требуют согласований. Эквайринг закладывался как надстройка — логика брони и сетки под него уже готова.
Что даёт контрольная строка у розыгрыша?
Возможность перепроверить результат. Строка считается из исходных данных и публикуется вместе с именем победителя. Если бы итог меняли задним числом, строка не сошлась бы.
Сайт статикой — это не устарело?
Наоборот. Для меню и описаний тяжёлый движок не нужен, а статика открывается быстрее и её почти нечему ломать. Всё динамическое — розыгрыши, оплаты, рассылки — живёт отдельным сервисом и подключается к боту.
Сможет ли администратор вести всё это без меня?
Для этого и написана памятка. Создание розыгрыша, отметка оплат, выбор победителя и рассылка делаются кнопками в панели. Розыгрыш я прогнал вручную целиком, чтобы инструкция описывала реальный порядок действий, а не предполагаемый.
Коротко о главном
Сайт кафе — это фундамент: меню, доставка, часы работы, документы и разметка, по которой заведение находят. Но фундамент сам по себе никого не кормит. Работать он начинает тогда, когда сверху появляется то, чем пользуются каждый день.
В этом проекте такой надстройкой стали бот с номерками и админка, в которую владелец заходит сам: создал розыгрыш, отметил оплаты, выбрал победителя, разослал новость подписчикам. Плюс честные мелочи — бронь на 15 минут, контрольная строка, памятка администратору, — без которых механика разваливается на первой же спорной ситуации.
Если у вас офлайновое заведение и сайт, который просто висит, — расскажите, как устроена ваша работа, и я предложу, что к нему достроить, чтобы им начали пользоваться. Напишите в Telegram, MAX или VK.
Всё о мессенджере MAX в одном месте
Эта статья — часть кластера материалов о MAX: разработка ботов и мини-аппов, продвижение канала, воронки, отраслевые сценарии и кейсы с реальными результатами.
Что я делаю для бизнеса
Напишите одной фразой, что нужно. Отвечу, что подойдёт, сколько займёт и сколько стоит. Сообщение уже подготовлено.
- Боты в Telegram, MAX, VK
- Автоматизация процессов и CRM
- Аналитика и дашборды
- Сайты и лендинги под ключ
Разборы, кейсы и практика — без воды. Выходит регулярно, читать 3–5 минут.


