Legan Studio
Все статьи
~ 14 мин чтения

Quiz-бот в Telegram: лидогенерация под ключ

Quiz-бот квалифицирует трафик и отдаёт горячие лиды в CRM. Разбираем, как собрать его так, чтобы конверсия в заявку держалась на 25–40%.

  • Telegram
  • лидогенерация
  • продажи
  • сценарии

Quiz-бот — один из самых стабильно работающих форматов лидогенерации в Telegram. Пользователь проходит 5–10 вопросов, на выходе получает персональное предложение или расчёт, а бизнес — квалифицированный лид с понятным контекстом. На правильно собранной воронке конверсия из старта в заявку держится в районе 25–40%, тогда как стандартная лендинг-форма выдаёт 3–5%, а в нишах с дорогим продуктом — до 30% именно через квиз.

Что такое квиз-бот

Квиз-бот — это сценарий из серии вопросов с ветвлением, который ведёт пользователя от первого тапа до персонального оффера и формы контакта. Каждый ответ влияет либо на следующий вопрос, либо на финальное предложение. На выходе пользователь видит «расчёт именно для меня», а менеджер получает не просто номер телефона, а карту потребностей: бюджет, сроки, ниша, объём, предпочтения.

Психологически квиз решает три задачи:

  • Снижает когнитивную нагрузку — клиент не пишет, а нажимает кнопки.
  • Создаёт ощущение персонализации — на выходе расчёт «именно для меня».
  • Квалифицирует — в самой воронке отсекаются нецелевые контакты.

Telegram как площадка усиливает эффект: пользователь уже залогинен, контакт можно собрать одним тапом через requestContact, а сам квиз доставляется одной ссылкой t.me/yourbot?start=quiz1 без перехода на сайт.

Сценарии по нишам

Квиз хорошо ложится на ниши, где продукт сложный, а оффер зависит от параметров клиента. Несколько проверенных кейсов:

  • Банк / ипотека — «Какая ипотека вам подходит?» Вопросы: цель (квартира/дом/рефинанс), регион, сумма, первый взнос, статус занятости, наличие зарплатной карты. На выходе — список программ с примерной ставкой и платежом.
  • Онлайн-школа — «Какой курс выбрать?» Текущий уровень, цель обучения, время в неделю, бюджет, формат (записи/живые занятия). На выходе — рекомендация курса + промокод.
  • Стройка и ремонт — «Сколько стоит ваш ремонт?» Тип помещения, площадь, состояние, желаемый класс отделки, сроки. На выходе — вилка цены и слот для замерщика.
  • Страховой брокер — «Подбор страховки». Тип (КАСКО/ОСАГО/ВЗР/ДМС), возраст, регион, стаж/анамнез. На выходе — 2–3 предложения от партнёров.
  • Авто — «Подбор машины с пробегом» по бюджету, типу кузова, году, пробегу.
  • Косметология — «Какая процедура подойдёт?» с дисклеймером «не является медицинской консультацией».

Общее у всех сценариев: результат имеет ценность сам по себе, даже если клиент не оставит контакт. Это снижает ощущение «развода» и повышает completion rate.

Анатомия квиза

Воронка квиза, которая стабильно работает в большинстве ниш:

  1. Hook — первый интригующий вопрос или промис («Подберём ипотеку с минимальной переплатой за 90 секунд»).
  2. 5–7 квалифицирующих вопросов — короткие, с готовыми вариантами ответа.
  3. Прогресс-бар на каждом шаге — снижает дроп-офф на 5–15%.
  4. Картинки на ключевых шагах — добавляют эмоций и удерживают внимание.
  5. Промежуточный wow — «Уже подбираем варианты под ваш бюджет…».
  6. Форма контакта — имя, телефон через requestContact, опционально email.
  7. Персональный результат — расчёт, подборка, оффер, таймер ответа менеджера.

Шагов больше 10 быть не должно: дроп-офф растёт быстрее, чем растёт качество квалификации. Идеал — 6–8 шагов плюс контактная форма.

Конверсия: реальные цифры

Если сравнить квиз с альтернативами на одной и той же холодной аудитории из платного трафика:

КаналCR в заявкуСтоимость лида (CPL)
Лендинг с обычной формой3–5%базовая
Лендинг с квизом-блоком8–12%−30–40%
Telegram-квиз-бот12–20%−50–60%
Telegram-квиз в узкой нише25–40%−60–70%

Цифры в правой колонке — относительно лендинга-эталона. Главный драйвер выгоды — отсутствие фрикции на форме: телефон собирается одним тапом по requestContact вместо ввода руками.

Telegram UX: кнопки и прогресс

Базовый интерфейс квиза в Telegram — InlineKeyboardMarkup с callback_data на каждой кнопке. Текстовый ввод используется только там, где варианты не предсказать (имя, комментарий). Прогресс показывается либо текстом «Шаг 3 из 7», либо эмодзи-баром:

🟪🟪🟪⬜⬜⬜⬜  3 из 7

Картинку на каждом шаге (sendPhoto с caption) лучше использовать на ключевых развилках — не на каждом, иначе сообщение становится «тяжёлым» и медленнее открывается на слабом мобильном.

# aiogram 3.x: шаг квиза с inline-кнопками и прогрессом
from aiogram import F, Router
from aiogram.fsm.context import FSMContext
from aiogram.types import (
    CallbackQuery,
    InlineKeyboardButton,
    InlineKeyboardMarkup,
)

router = Router()

QUESTIONS = [
    {
        "key": "goal",
        "text": "Что планируете купить?",
        "options": [
            ("Квартира в новостройке", "new"),
            ("Вторичка", "secondary"),
            ("Дом", "house"),
            ("Рефинансирование", "refi"),
        ],
    },
    {
        "key": "region",
        "text": "В каком регионе оформляете?",
        "options": [
            ("Москва и МО", "msk"),
            ("Санкт-Петербург", "spb"),
            ("Другой регион", "other"),
        ],
    },
    # ...ещё 4–5 вопросов
]


def progress_bar(step: int, total: int) -> str:
    filled = "🟪" * step
    empty = "⬜" * (total - step)
    return f"{filled}{empty}  {step} из {total}"


def question_kb(step: int) -> InlineKeyboardMarkup:
    q = QUESTIONS[step]
    rows = [
        [InlineKeyboardButton(text=label, callback_data=f"q:{step}:{value}")]
        for label, value in q["options"]
    ]
    return InlineKeyboardMarkup(inline_keyboard=rows)


@router.callback_query(F.data.startswith("q:"))
async def on_answer(call: CallbackQuery, state: FSMContext) -> None:
    _, step_str, value = call.data.split(":", 2)
    step = int(step_str)

    data = await state.get_data()
    answers = data.get("answers", {})
    answers[QUESTIONS[step]["key"]] = value
    await state.update_data(answers=answers)

    next_step = step + 1
    if next_step >= len(QUESTIONS):
        await call.message.answer("Отлично! Остался последний шаг — контакт.")
        await ask_contact(call.message, state)
        return

    bar = progress_bar(next_step, len(QUESTIONS))
    await call.message.edit_text(
        f"{bar}\n\n{QUESTIONS[next_step]['text']}",
        reply_markup=question_kb(next_step),
    )
    await call.answer()

edit_text вместо нового сообщения держит чат чистым — пользователь видит один «слайд», который меняется по мере ответов. Если шаг с картинкой, придётся слать новое сообщение через answer_photo.

Сбор контакта без боли

Главная фрикция в любой форме — телефон. В Telegram это решается за один тап: бот отправляет KeyboardButton с request_contact=True, и пользователь делится номером, привязанным к аккаунту, без ввода вручную.

from aiogram.types import KeyboardButton, ReplyKeyboardMarkup, ReplyKeyboardRemove

async def ask_contact(message, state):
    kb = ReplyKeyboardMarkup(
        keyboard=[[KeyboardButton(text="Поделиться номером", request_contact=True)]],
        resize_keyboard=True,
        one_time_keyboard=True,
    )
    await message.answer(
        "Менеджер свяжется в течение 15 минут. "
        "Нажмите кнопку, чтобы поделиться номером:",
        reply_markup=kb,
    )


@router.message(F.contact)
async def on_contact(message, state: FSMContext):
    phone = message.contact.phone_number
    name = message.contact.first_name or message.from_user.full_name
    await state.update_data(phone=phone, name=name)
    await message.answer(
        "Спасибо! Готовим персональный расчёт.",
        reply_markup=ReplyKeyboardRemove(),
    )
    await send_lead_to_crm(await state.get_data(), message.from_user.id)

Email собирать стоит только если он реально нужен для оффера (отправка коммерческого предложения, доступ к обучающей платформе). Каждое дополнительное поле режет конверсию на 8–15%. Валидация email — простая регулярка плюс опциональная проверка MX-записи на бэкенде.

Согласие на обработку ПДн оформляется отдельным шагом перед формой контакта: чекбокс-кнопка «Согласен с политикой» с ссылкой на документ. Без этого — нарушение 152-ФЗ и риск претензии от РКН.

Передача лида в CRM

Лид без интеграции — это половина продукта. Минимальный контур:

  • по событию «контакт оставлен» создаётся сделка в amoCRM/Битрикс24/RetailCRM;
  • в карточку прокидываются все ответы квиза как кастомные поля;
  • UTM-метки из start-параметра сохраняются;
  • источник = «Telegram quiz {название}» для отдельной воронки;
  • менеджеру падает уведомление в чат-канал отдела продаж.
import httpx

AMO_BASE = "https://yourcompany.amocrm.ru"
AMO_TOKEN = "..."  # long-lived access token


async def send_lead_to_crm(data: dict, tg_user_id: int) -> int:
    answers = data["answers"]

    # Сегментация по ответам
    if answers.get("urgency") == "now":
        temperature = "hot"
        pipeline_status_id = 142  # «горячий, перезвонить за 15 мин»
    elif answers.get("urgency") == "month":
        temperature = "warm"
        pipeline_status_id = 143
    else:
        temperature = "cold"
        pipeline_status_id = 144

    payload = [{
        "name": f"Quiz: {data.get('name', 'без имени')}",
        "status_id": pipeline_status_id,
        "custom_fields_values": [
            {"field_code": "PHONE", "values": [{"value": data["phone"]}]},
            {"field_id": 901, "values": [{"value": answers.get("goal", "")}]},
            {"field_id": 902, "values": [{"value": answers.get("region", "")}]},
            {"field_id": 903, "values": [{"value": answers.get("budget", "")}]},
            {"field_id": 904, "values": [{"value": temperature}]},
            {"field_id": 905, "values": [{"value": data.get("utm_source", "")}]},
            {"field_id": 906, "values": [{"value": str(tg_user_id)}]},
        ],
    }]

    async with httpx.AsyncClient(timeout=10) as client:
        r = await client.post(
            f"{AMO_BASE}/api/v4/leads",
            headers={"Authorization": f"Bearer {AMO_TOKEN}"},
            json=payload,
        )
        r.raise_for_status()
        return r.json()["_embedded"]["leads"][0]["id"]

Запрос обязательно идёт с ретраями (httpx + tenacity или внешняя очередь): если amoCRM недоступна, лид нельзя терять. Простейший фолбэк — записать payload в локальную таблицу leads_outbox и фоновым воркером дослать.

Сегментация: горячий, тёплый, холодный

Один из главных побочных эффектов квиза — сама воронка квалифицирует. По ответам на 1–2 ключевых вопроса лид падает в нужный статус:

  • Горячий — «нужно сейчас», бюджет в верхнем диапазоне, конкретный продукт. Менеджер звонит в течение 15 минут, иначе CR падает в 3 раза.
  • Тёплый — «в ближайший месяц», думает, сравнивает. Сценарий — звонок в течение рабочего дня + nurture-цепочка в боте.
  • Холодный — «просто интересуюсь», без срока. Закрывается контентом: сравнения, кейсы, рассылка раз в неделю.

Разные сегменты — разные follow-up. Холодным звонить сразу = жечь бюджет менеджера и портить базу. Горячих не звонить за 15 минут = терять до 70% конверсии в продажу.

A/B-тесты, которые реально двигают метрику

Не все эксперименты дают эффект. По нашему опыту, метрику стабильно сдвигают:

  • Первый вопрос (hook). «Какая ипотека вам подходит?» vs «Узнайте, на какую ставку вы можете рассчитывать» — разница в CTR на старт может быть 2×.
  • Длина квиза. 5 вопросов vs 8 — completion rate отличается на 15–25%, а качество лида — иногда нет.
  • Формулировка кнопки контакта. «Получить расчёт» vs «Узнать стоимость» vs «Подобрать вариант» — разница до 30%.
  • Запрос телефона vs username. В Telegram username собирать проще, но менеджеру удобнее звонить — компромисс зависит от ниши.
  • Картинки на шагах vs только текст. Картинки повышают completion на 5–10%, но утяжеляют сообщение.

Тестируем по одному изменению за раз, минимум 200–300 прохождений на вариант, иначе шум.

Реклама на квиз: откуда брать трафик

Квиз-бот хорошо склеивается с большинством платных каналов в РФ:

  • Яндекс.Директ — лендинг с кнопкой «Пройти квиз в Telegram» или прямой start-link с UTM. Хорошо работает на поисковых запросах с интентом «подбор / расчёт / стоимость».
  • VK Реклама — таргет на интересы и lookalike. Прямой start-link разрешён, креативы — карусели с этапами квиза.
  • Telegram Ads — официальный канал, дорогой вход (€2 от Telegram), но очень дешёвый CPM. Объявление ведёт прямо в бот.
  • Закупка в каналах через биржи (Telega.in, Tgrm.ru) — нативные посты со скриншотами квиза.
  • Reels/Shorts — короткое видео с прохождением квиза, ссылка в шапке.

UTM передаются через start-параметр: t.me/yourbot?start=ya-direct_brand_q1. На стороне бота это парсится в /start и сохраняется в FSM с самого первого шага, чтобы попасть в CRM вместе с лидом.

Метрики, на которые смотрим

Полная воронка квиз-бота, которую считаем минимум еженедельно:

  • CTR на старт — сколько кликнули по объявлению / увидели стартовое сообщение.
  • Completion rate — % дошедших до финального шага. Норма — 50–70%.
  • CR в контакт — % оставивших телефон. Норма — 70–85% от завершивших.
  • Drop-off по шагам — на каком вопросе теряется больше всего, оттуда же гипотезы для теста.
  • CPL (cost per lead) — стоимость одного контакта.
  • CPS (cost per sale) — стоимость продажи (нужен фидбэк из CRM).
  • ROAS — выручка / расходы на рекламу.
  • Доля горячих в общей массе — индикатор качества трафика.

Дашборд удобно собирать в Metabase или DataLens поверх Postgres, куда бот пишет события quiz_started, step_completed, contact_provided, lead_created.

Подводные камни

Что чаще всего убивает квиз:

  • Длинный квиз. 12+ шагов — completion 20% вместо 60%, итоговые лиды дороже, чем у лендинга.
  • Навязчивые вопросы рано. «Ваша зарплата?» на 3-м шаге — мгновенный дроп-офф. Чувствительные вопросы — ближе к концу, после того как клиент уже вложился.
  • Запрос телефона на втором экране. Конверсия падает в 2–3 раза.
  • Открытые текстовые поля «опишите вашу задачу» в начале — пользователь не готов писать, готов только нажимать.
  • Молчание после контакта. Если бот не показал результат после формы, это воспринимается как обман. Минимум — «Спасибо, расчёт уже у менеджера, перезвонит за 15 минут».
  • Нет дожима. 30–50% не доходят до контактов. Без напоминания через 1–24 часа — это просто потерянный трафик.
  • Один и тот же квиз на все каналы. Аудитория из Я.Директа и из закупа в канале — разная, hook должен отличаться.

Конструктор или кастом

Решение между no-code конструктором и собственной разработкой зависит от ниши, объёма и требований к интеграциям.

КритерийMarquiz / Senler / BotHelpКастомный бот
Стоимость стартаот 1 000 ₽/месот 80 000 ₽ разово
Срок запуска1–3 дня2–4 недели
Глубина ветвленияЛинейная или простаяЛюбая логика
Интеграции с CRMГотовые модулиЛюбые API + очереди
Кастомный дизайнШаблоныПолная свобода
Аналитика по шагамБазоваяЛюбые метрики в свой DWH
A/B-тестыЧасто платная опцияСвой движок
Контроль данныхНа стороне сервисаСвой сервер
Подходит длядо 500 лидов/мес, простой офферот 500 лидов/мес, сложный продукт

Практическое правило: начните с конструктора, чтобы валидировать гипотезу за неделю. Когда канал даёт стабильно 300+ лидов в месяц и упирается в ограничения шаблона — переезжайте в кастом. Перенести аудиторию из конструктора в свой бот не больно: подписчики сами перейдут по новой ссылке после первого поста.

Дожим и реактивация

Около 30–50% пользователей не доходят до контактов. Это не «потерянные», а «недоквалифицированные» лиды:

  • через 1–2 часа — мягкое напоминание «Вы не закончили подбор — продолжить?»;
  • через 24 часа — небольшой бонус (бесплатная консультация, чек-лист) за завершение;
  • через 3–5 дней — реактивация через сегмент в общей контент-воронке.

Эта механика добавляет ещё 10–20% к итоговому числу заявок. В Telegram доставляемость напоминания близка к 100% (в отличие от email с 20–30% open rate), поэтому эффект особенно заметен.

Юридические нюансы

Перед запуском платного трафика на квиз нужно закрыть базовый юр-минимум:

  • Согласие на обработку ПДн — отдельный экран перед сбором телефона, со ссылкой на политику конфиденциальности и фразой «Нажимая кнопку, я даю согласие…».
  • Политика конфиденциальности и оферта — опубликованы на сайте, доступны прямой ссылкой из бота.
  • Уведомление РКН о начале обработки ПДн (152-ФЗ).
  • Уведомление о трансграничной передаче — Telegram-сервера за пределами РФ, передача попадает под 152-ФЗ.
  • Дисклеймер в нишах с особым регулированием: «Результат не является медицинской консультацией / финансовым советом / диагнозом» — для медицины, финансов, юр-услуг.
  • 38-ФЗ о рекламе — последующие рассылки только с согласием и кнопкой отписки.
  • Маркировка рекламы для платного трафика на бот через ОРД (если бюджет на размещение в РФ).

Без этих документов риски — претензии от РКН (штраф до 700 000 ₽ для юрлица за нарушение режима ПДн) и блокировка рекламных кампаний.

Итого

Квиз-бот в Telegram — это связка из 6–8 короткого сценария с прогрессом и картинками, нативного сбора телефона через requestContact, асинхронной интеграции с CRM, сегментации по «температуре» и автоматического дожима. На правильно настроенной воронке CR из старта в заявку 25–40% реален для большинства ниш услуг и сложных продуктов. Сроки разработки — 2–4 недели, бюджет 80 000–250 000 ₽ в зависимости от глубины интеграций. Для теста гипотезы — конструктор за неделю; для масштабирования от 500 лидов в месяц — переход на кастом окупается за 2–3 месяца.

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

Что такое квиз-бот и почему он работает лучше обычной формы?

Квиз-бот — это сценарий из серии вопросов с ветвлением, который ведёт пользователя от первого тапа до персонального оффера и формы контакта. Психологически он решает три задачи: снижает когнитивную нагрузку (клиент не пишет, а нажимает кнопки), создаёт ощущение персонализации (на выходе расчёт «именно для меня») и квалифицирует (в воронке отсекаются нецелевые контакты). В CRM прилетают не просто «контакты», а лиды с понятной картой потребностей: бюджет, сроки, ниша, задача. Конверсия из старта в заявку 25–40% против 3–5% у обычных landing-форм.

Какова оптимальная анатомия квиза для лидогенерации?

Hook — первый интригующий вопрос или промис («Подберём ипотеку с минимальной переплатой за 90 секунд»). Затем 5–7 квалифицирующих вопросов с готовыми вариантами ответа, прогресс-бар на каждом шаге, картинки на ключевых развилках для эмоций, промежуточный wow «уже подбираем варианты», форма контакта (имя + телефон через requestContact), персональный результат. Шагов больше 10 быть не должно: дроп-офф растёт быстрее, чем растёт качество квалификации. Идеал — 6–8 шагов плюс контактная форма.

Какая реальная конверсия у квиз-бота по сравнению с лендингом?

На одной и той же холодной аудитории из платного трафика: лендинг с обычной формой даёт CR 3–5%, лендинг с квиз-блоком 8–12%, Telegram-квиз-бот 12–20%, а в узких нишах с дорогим продуктом квиз-бот вытягивает 25–40%. Стоимость лида в Telegram-квизе обычно на 50–60% ниже, чем у лендинг-эталона. Главный драйвер выгоды — отсутствие фрикции на форме: телефон собирается одним тапом по requestContact вместо ввода руками, и пользователь не покидает мессенджер.

Как собрать контакт пользователя в Telegram без потерь конверсии?

Главная фрикция в любой форме — телефон. В Telegram это решается за один тап: бот отправляет KeyboardButton с request_contact=True, и пользователь делится номером, привязанным к аккаунту, без ввода вручную. Email собирать стоит только если он реально нужен для оффера — каждое дополнительное поле режет конверсию на 8–15%. Согласие на обработку ПДн оформляется отдельным шагом перед формой контакта: чекбокс-кнопка «Согласен с политикой» с ссылкой на документ. Без этого — нарушение 152-ФЗ и риск претензии от РКН.

Как сегментировать лиды из квиза по горячий-тёплый-холодный?

Один из побочных эффектов квиза — сама воронка квалифицирует. По ответам на 1–2 ключевых вопроса (срок и бюджет) лид падает в нужный статус. Горячий — «нужно сейчас», бюджет в верхнем диапазоне, конкретный продукт; менеджер звонит за 15 минут, иначе CR падает в 3 раза. Тёплый — «в ближайший месяц», думает; звонок в течение рабочего дня плюс nurture-цепочка в боте. Холодный — «просто интересуюсь»; закрывается контентом и рассылкой раз в неделю. Холодным звонить сразу = жечь бюджет менеджера и портить базу.

Конструктор Marquiz или кастомный бот — что выбрать?

Решение зависит от объёма и требований к интеграциям. Конструкторы (Marquiz, Senler, BotHelp) — старт от 1 000 ₽/мес, запуск за 1–3 дня, готовые шаблоны, базовые интеграции с CRM, простое ветвление. Подходят до 500 лидов в месяц на простой оффер. Кастомный бот — от 80 000 ₽ разово, срок 2–4 недели, любая логика ветвления, любые API и очереди, свой движок A/B-тестов, любые метрики в свой DWH. Практическое правило: начните с конструктора, чтобы валидировать гипотезу за неделю. Когда канал стабильно даёт 300+ лидов в месяц и упирается в ограничения шаблона — переезжайте в кастом, окупается за 2–3 месяца.

Какие ошибки чаще всего убивают конверсию квиз-бота?

12+ шагов — completion 20% вместо 60%, итоговые лиды дороже, чем у лендинга. Навязчивые вопросы рано (например, зарплата на 3-м шаге) — мгновенный дроп-офф; чувствительные вопросы должны быть ближе к концу. Запрос телефона на втором экране — конверсия падает в 2–3 раза. Открытые текстовые поля в начале — пользователь готов нажимать, не готов писать. Молчание после контакта воспринимается как обман — обязательно показать результат и таймер ответа менеджера. Отсутствие дожима — 30–50% не доходят до контактов, без напоминания через 1–24 часа это потерянный трафик.