Бот для розыгрышей Вкусно и Точка в MAX
Монорепо-платформа для маркетингового бота в мессенджере MAX: массовые рассылки по аудитории, розыгрыши с проверкой подписки, онбординг пользователей и веб-панель администратора.
О проекте
Клиент обратился с задачей создать платформу для управления маркетинговым ботом в мессенджере MAX — российском аналоге Telegram. Нужен был полный инструментарий: онбординг пользователей с маркетинговым согласием, массовые рассылки по собранной базе, механики вовлечения через розыгрыши и административная веб-панель для управления всем этим.
Монорепо с тремя приложениями: API-сервер на Elysia (Bun) для обработки входящих обновлений MAX, асинхронный worker для доставки рассылок через BullMQ + Redis, и веб-панель на React + Vite для администраторов. Хранение данных — PostgreSQL через Prisma ORM.
Технологии
- TypeScript
- Bun
- Elysia
- React
- Vite
- Tailwind CSS
- PostgreSQL
- Prisma
- BullMQ
- Redis
- Docker
Что разработано
- Монорепо с приложениями bot-api, bot-worker, admin-web и общим пакетом packages/shared
- API-сервер на Elysia (Bun) с обработкой обновлений MAX в режиме webhook или long-polling
- Онбординг пользователей: шаги awaiting_contact → awaiting_consent → completed с записью телефона и маркетингового согласия
- Модуль рассылок: создание сообщений с текстом и медиа (фото/видео/gif), расписание (once/daily/weekly/monthly), ручной запуск
- Очередь доставки на BullMQ + Redis: один job на получателя, параллельная обработка до 25 воркеров
- Глобальный rate limiter для MAX API: 25 rps с запасом до платформенного потолка 30 rps
- Retry-логика: до 5 попыток с экспоненциальным backoff, счётчики delivered/failed по каждому запуску
- Модуль розыгрышей: статусы draft/scheduled/active/finished, медиа-прикрепление, дата начала/конца, количество победителей, проверка подписки на каналы
- Deeplink-участие в розыгрыше: кнопка со ссылкой ?start=g_<id> открывает бота и фиксирует участие автоматически после онбординга
- Управление каналами: привязка розыгрышей к каналам, проверка подписки пользователя перед участием
- Статистика: дашборд с аналитикой аудитории, рассылок и розыгрышей в веб-панели
- Cron-задачи: финализатор розыгрышей, планировщик рассылок — каждые 15 секунд
- База данных через Prisma ORM с PostgreSQL: модели AudienceUser, Mailing, MailingRun, Giveaway, GiveawayEntry, Job и другие
- Docker Compose: postgres + redis + bot-api + bot-worker + admin-web в отдельных контейнерах
Ключевые фичи
- Двухрежимный приём обновлений: long-polling для локальной разработки, webhook через отдельный сервис для production
- Очередь рассылок с гарантированной доставкой: BullMQ обеспечивает retry, rate limiting и инкрементальные счётчики без блокировки API
- Онбординг как gate: рассылки уходят только пользователям с completed-онбордингом и зафиксированным маркетинговым согласием
- Deeplink вместо callback-кнопок: участие в розыгрыше через ?start=g_<id> — надёжнее legacy-кнопок, работает при переподписке
- Многоканальные розыгрыши: проверка обязательной подписки на несколько каналов перед регистрацией участия
- Раздельный worker: update-worker обрабатывает входящие обновления асинхронно через таблицу Job, изолируя доставку от бизнес-логики
- Гибкое расписание рассылок: разовые, ежедневные, еженедельные и ежемесячные — с ручным триггером из панели
- Веб-панель на React + Vite: три раздела — статистика, розыгрыши, рассылки — с единым AppShell
Решение задачи
Платформа предоставила маркетинговой команде полный инструментарий для работы с аудиторией в мессенджере MAX: от сбора базы через онбординг до массовых рассылок и механик вовлечения через розыгрыши.
Архитектура с выделенной очередью (BullMQ + Redis) и rate limiter'ом позволяет отправлять рассылки на большую аудиторию без риска превысить лимиты платформы и без потери доставки при временных сбоях.
Метрики
Заказать похожий проект
Оставьте заявку — обсудим задачу и предложим решение под ваш бизнес.
Оставить заявку