Цветочная школа в Казани. Пять курсов в LMS, реклама не запускается — нет квалифицированных лидов. Нужен Telegram-бот для лидогенерации с квизом и автоматической сегментацией. Без ManyChat, без конструктора — кастомный стек.
Почему ManyChat и Tilda не подходят для квалификации лидов
Tilda-форма — посетитель заполнит и забудет. Нет контекста, нет диалога, нет сегментации. Строчка в таблице с именем и телефоном — и всё.
ManyChat — визуальный конструктор без кода. Простые автоответы работают. Кастомная логика — нет. Написать классификатор, который смотрит на комбинацию ответов и выдаёт сегмент, через клики в интерфейсе нельзя. Медленно и негибко.
Нужна своя логика: канал → бот → анкета → сегмент → уведомление владельцу. Это не собирается на конструкторе.
Postgres state machine вместо grammyjs/conversations
Первая попытка — плагин grammyjs/conversations. Описываешь диалог как функцию с await conversation.wait(). Выглядит красиво, пишется быстро.
Проблема: состояние хранится в памяти процесса. Бот упал, pm2 перезапустил — все незавершённые сессии потеряны. Пользователь дошёл до третьего вопроса, бот перезагрузился — начинает сначала. В продакшне неприемлемо.
Отказались. Перешли на Postgres state machine.
Три таблицы: promo_campaigns, promo_quiz_sessions, quiz_responses. Каждый шаг квиза — строка в базе. Текущий вопрос хранится в promo_quiz_sessions.current_step. Ответ — инсерт в quiz_responses. Бот падает — сессия сохранена. При следующем сообщении от пользователя бот читает состояние из базы и продолжает с нужного шага.
Это дольше писать. Зато надёжно.
Hot/warm/cold сегментация за 4 вопроса: как работает классификатор
Анкета — четыре вопроса. Цель: квалифицировать лид за секунду, прежде чем тратить время менеджера.
Вопросы про уровень опыта, готовность к покупке, бюджет и цель. Каждый ответ даёт балл. По сумме баллов классификатор присваивает сегмент:
| Сегмент | Признак | Действие |
|---|---|---|
| hot | готов купить, бюджет есть, цель конкретная | немедленное уведомление менеджеру |
| warm | интерес есть, нужен прогрев | показать программу, закрыть возражения |
| cold | смотрит, сравнивает | минимальный приоритет |
| non_target | не наша аудитория | не тратим время |
Результат — мгновенное уведомление в личку владельцу и менеджеру. Имя пользователя, Telegram-username, сегмент. Менеджер видит «hot» — звонит первым. Видит «cold» — ставит в прогрев. Никаких таблиц, никакого ручного разбора.
Telegram-бот для лидогенерации за один день: стек grammY + TypeScript
Утром — схема БД, миграции. После обеда — бот-хендлеры, subscription gate, классификатор. Вечером — smoke-тест в test-канале. На следующее утро — production-пост в канале школы. Live в 09:21.
Стек: grammY + TypeScript + Postgres + pm2 на Hetzner VPS.
Пишите: @afonin900.