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

Onboarding-сценарий для нового пользователя бота MAX

Как сделать onboarding нового пользователя бота MAX: первые 60 секунд, прогрессивное раскрытие функций, согласия, метрики активации и retention.

  • MAX
  • UX
  • активация

Первые 60 секунд диалога с ботом решают, останется ли пользователь или удалит чат через минуту. Половина новых пользователей, которые «пропали» — пропала именно в onboarding: непонятно, что бот умеет, слишком много вопросов сразу, нет «вау-момента». В этой статье — как сделать onboarding бота в MAX, который поднимает retention 1d с 30% до 60%, проводит пользователя через первый ценный шаг за < 60 секунд, корректно собирает согласия по 152-ФЗ и не требует от человека ввода всего сразу.

Цели onboarding

  1. Первое впечатление — за 5 секунд пользователь понимает, что это за бот.
  2. Первый ценный шаг — за 60 секунд получил конкретную пользу.
  3. Минимум данных — собираем только то, без чего нельзя работать.
  4. Согласия — получены явно, не «спрятаны» в пользовательское соглашение.
  5. Активация — пользователь сделал ключевое действие (заказ, запись, тест).

Антипаттерны

АнтипаттернЧто вместо
«Введите имя, телефон, email, дату рождения» сразуСпрашивайте по мере необходимости
5-минутный туториал1 экран приветствия + кнопка «Поехали»
Список из 30 пунктов меню3–5 главных + «ещё»
«Прочитайте Пользовательское соглашение» (ссылка на 12 страниц)Чёткая короткая формулировка + одна кнопка
Сразу регистрация / звонок менеджераСначала ценность, потом регистрация

Структура хорошего onboarding

1. Приветствие (3 секунды): кто ты, что умеешь, кнопка «Начать»
2. Согласие на обработку ПДн (если нужно): чёткий короткий текст + 2 кнопки
3. Первый ценный шаг (≤ 60 сек): минимальный сценарий до результата
4. «Что ещё умею»: 2–3 главные возможности + ссылка в меню
5. Контакты поддержки: одна кнопка

Приветствие

@bot.message_handler(commands=["start"])
async def on_start(msg):
    is_new = await register_user_if_new(msg.from_user)
    if not is_new:
        return await show_main_menu(msg.chat.id)

    text = (
        "👋 Привет! Я — бот сервиса доставки кофе X.\n\n"
        "Помогу заказать любимый напиток за 10 секунд, "
        "напомню о любимом времени и копит баллы.\n\n"
        "Поехали?"
    )
    kb = InlineKeyboardMarkup([
        [InlineKeyboardButton("☕ Заказать первый кофе", callback_data="onb:start")],
    ])
    await bot.send_message(msg.chat.id, text, reply_markup=kb)
    await track("onb_seen", msg.from_user.id)

Принципы приветствия:

  • 2–4 предложения, без длинных абзацев;
  • одна-две главных ценности (не «у нас 50 функций»);
  • одна явная кнопка действия — не «выбирайте из 5 вариантов».

Прогрессивное согласие

Согласие на обработку ПДн нужно только когда мы их собираем. Если первые шаги бота — показ ассортимента и просмотр новостей, согласие не нужно. Запрашиваем при первом сборе ПДн (имя, телефон):

@bot.callback_query_handler(lambda c: c.data == "onb:order")
async def on_order_start(call):
    if not await has_consent(call.from_user.id):
        text = (
            "Для заказа нужно согласие на обработку персональных данных.\n\n"
            "Что мы собираем: имя, телефон, адрес доставки.\n"
            "Зачем: оформить и доставить заказ.\n"
            "Полный текст: /privacy"
        )
        kb = InlineKeyboardMarkup([
            [InlineKeyboardButton("✅ Согласен", callback_data="consent:yes")],
            [InlineKeyboardButton("❌ Отказаться", callback_data="consent:no")],
        ])
        return await bot.send_message(call.message.chat.id, text, reply_markup=kb)
    # ... continue ordering

Подробнее — в статье «Согласие и оферта в боте MAX».

Первый ценный шаг

Цель — пользователь получает ценность в первые 60 секунд. Примеры по типам ботов:

БотПервый ценный шаг
Магазин/доставкаПоказать каталог по категории/локации
Запись на услугиПоказать ближайшие свободные слоты
ПоддержкаОтветить на типовой вопрос из FAQ
КурсыДать первый бесплатный урок / прохождение мини-теста
HRПоказать 3 актуальные вакансии
ФинансовыйКалькулятор / онлайн-расчёт

Первый шаг должен не требовать регистрации, авторизации, заполнения полей. Только потом — «чтобы оформить, понадобится телефон».

Скользящая регистрация

async def collect_phone_when_needed(call, after_callback: str):
    if await get_phone(call.from_user.id):
        return await dispatch(after_callback, call)
    kb = ReplyKeyboardMarkup(
        [[KeyboardButton("📱 Поделиться номером", request_contact=True)]],
        one_time_keyboard=True, resize_keyboard=True,
    )
    await set_state(call.from_user.id, f"need_phone_for:{after_callback}")
    await bot.send_message(call.message.chat.id, "Для оформления нужен ваш номер телефона:", reply_markup=kb)

@bot.message_handler(content_types=["contact"])
async def on_contact(msg):
    if msg.contact.user_id != msg.from_user.id:
        return await bot.send_message(msg.chat.id, "Пожалуйста, поделитесь своим контактом, не чужим.")
    await save_phone(msg.from_user.id, msg.contact.phone_number)
    state = await get_state(msg.from_user.id)
    if state and state.name.startswith("need_phone_for:"):
        await dispatch(state.name.split(":", 1)[1], msg)

request_contact=True — нативная кнопка MAX/Telegram для безопасной передачи номера, без ручного ввода.

Wow-момент

После первого ценного шага — короткое «вау»:

  • доставка кофе → «Через 18 минут будет у вас!»;
  • запись на массаж → «Записаны на завтра в 14:00. Напомним за 2 часа»;
  • первый урок → «Поздравляем, +50 XP! Стрик: 1 день».

Это создаёт эмоциональную привязку и поднимает retention 1d на 15–30%.

Что ещё умею

async def show_after_first_action(chat_id: int):
    text = (
        "🎉 Готово! Что ещё могу:\n\n"
        "🔁 *Повторить заказ* — кнопка «Повторить» в /history\n"
        "⏰ *Напомнить* — настройте в /settings\n"
        "💎 *Бонусы* — копятся автоматически: /bonus\n\n"
        "Полное меню — кнопка «Меню» внизу"
    )
    await bot.send_message(chat_id, text, reply_markup=build_main_menu(), parse_mode="Markdown")

Не больше 3–5 пунктов с маленькими описаниями. Все остальное — в /help и через основное меню.

Метрики onboarding

МетрикаЧто показываетБенчмарк
Activation 1h% новых, сделавших первое ключевое действие за 1 час40–70%
Retention 1dвернулся через 1 день30–60%
Retention 7dвернулся через 7 дней20–40%
Time to first valueмедианное время до первого ценного шага< 60 секунд
Onboarding completion rate% дошедших до конца flow60–85%
Drop-off по шагамгде падаютвизуально на воронке
async def track_onb_step(user_id: int, step: str):
    await db.execute("""
        INSERT INTO onb_events (user_id, step, ts) VALUES ($1, $2, now())
    """, user_id, step)

Воронка в Metabase / Datalens: seen → consent_yes → first_action_started → first_action_completed.

A/B-тесты onboarding

Onboarding — поле для частых тестов. Меняйте:

  • текст приветствия (короткое vs описательное);
  • количество кнопок в первом сообщении (1 vs 3);
  • сразу запрос телефона vs «потом»;
  • эмодзи vs без эмодзи;
  • предложение бесплатного бонуса при регистрации vs без.

Один тест за раз, минимум 1000 новых пользователей в варианте, метрика — activation 1h и retention 7d.

Реактивация «недозашедших»

Пользователи, которые увидели приветствие, но не нажали кнопку — отдельная проблема. Через 24 часа — мягкий push:

async def cron_reactivate_silent():
    rows = await db.fetch_all("""
        SELECT user_id FROM users 
        WHERE first_seen_at BETWEEN now() - interval '25 hours' AND now() - interval '23 hours'
          AND NOT EXISTS (SELECT 1 FROM onb_events WHERE user_id = users.id AND step != 'onb_seen')
          AND NOT EXISTS (SELECT 1 FROM reminders WHERE user_id = users.id AND kind='silent')
    """)
    for r in rows:
        await bot.send_message(
            r.user_id,
            "Привет ещё раз! Если хотите попробовать — пара тапов и заказ за 10 секунд:",
            reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("☕ Заказать", callback_data="onb:start")]]),
        )
        await mark_reminder(r.user_id, "silent")

Не больше 2 таких напоминаний с интервалом 3+ дней — иначе уход в blacklist.

Common pitfalls

  1. Длинное приветствие на 1500 символов — никто не читает.
  2. Сразу регистрация — отказ 60% потенциальных пользователей.
  3. Мелкая клавиатура с 8 пунктами — пользователь теряется.
  4. Согласие в виде «принять условия» без объяснения — нарушение 152-ФЗ.
  5. Нет аналитики onboarding — не видите, где падают.
  6. Нет «wow-момента» — пользователь не чувствует ценность.

Итого

Onboarding в боте MAX — это первые 60 секунд: короткое приветствие (2–4 предложения, одна кнопка действия), прогрессивное согласие на ПДн (только когда нужны данные, чёткие 2 кнопки), первый ценный шаг без регистрации (показ ассортимента / слотов / урока), скользящая регистрация (request_contact только когда нужно для оформления), wow-момент после первого действия, мини-обзор «что ещё умею». Метрики: activation 1h (40–70%), retention 1d (30–60%), time to first value (< 60 секунд). A/B-тесты на ключевых шагах с 1000+ пользователями в варианте. Грамотный onboarding обычно поднимает retention 1d в 1.5–2 раза и сокращает CAC за счёт снижения отвалов.

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

Что показать в приветствии нового пользователя бота MAX?

Минимум: 1 строчка кто вы (бренд/сервис), 1–2 строчки что умеет бот в виде ценности для пользователя (не «у нас 50 функций», а «закажу за 10 секунд», «напомню вовремя», «накоплю баллы»), одна явная кнопка действия. Не больше 4 предложений всего. Не используйте длинные приветствия с историей компании, перечислением всех возможностей и ссылками на блог. Цель — за 5 секунд пользователь понимает, что это и зачем нажимать кнопку.

Когда запрашивать согласие на обработку ПДн?

Только в момент, когда вы реально начинаете собирать ПДн — имя, телефон, адрес. Если первые шаги бота не требуют ПДн (просмотр каталога, чтение FAQ), согласие запрашивать не нужно. Текст согласия должен быть конкретным: что собираем, зачем, кому передаём, ссылка на полную политику. Две кнопки — «Согласен» и «Отказаться». Согласие фиксируется в БД с timestamp и текстом версии политики (для аудита). Без согласия пользователь не может перейти к шагам, требующим ПДн, но просмотр контента остаётся доступным.

Что считается «первым ценным шагом»?

То действие, ради которого пользователь пришёл и которое он может сделать без регистрации, заполнения форм и согласий. Для магазина — показ каталога по категории. Для записи — список свободных слотов. Для FAQ-бота — ответ на типовой вопрос. Для курсов — короткий бесплатный урок или мини-тест. Цель — за 60 секунд пользователь получил конкретную пользу, а не «зарегистрируйтесь, тогда покажу». Регистрация — только перед действием, которое реально её требует (оформление заказа, запись с предоплатой).

Какие метрики onboarding отслеживать?

Activation 1h (% новых, сделавших ключевое действие за час, бенчмарк 40–70%), retention 1d / 7d (вернулся через день / неделю, 30–60% / 20–40%), time to first value (медиана, цель < 60 сек), onboarding completion rate (дошли до конца flow, 60–85%), drop-off по шагам в виде воронки (где падают). Каждый шаг логируется как event в таблицу onb_events. В Metabase / Datalens строится воронка onb_seen → consent_yes → first_action_started → first_action_completed. Без этих метрик невозможно понять, где именно теряете пользователей.

Стоит ли сразу запрашивать телефон через request_contact?

Нет, не сразу. Запрашивайте только перед действием, которое реально требует телефон: оформление заказа с доставкой, запись с подтверждением, регистрация в программе лояльности. Сразу запрос телефона на этапе приветствия отсекает 30–50% пользователей, которые ещё не поняли ценность. Используйте паттерн «скользящая регистрация»: пользователь нажимает «Оформить заказ» → бот говорит «нужен ваш номер для подтверждения» с кнопкой request_contact → после получения возвращается к оформлению.

Как реактивировать пользователей, которые увидели приветствие, но не нажали кнопку?

Cron раз в час выявляет: первое посещение было 23–25 часов назад, нет ни одного onb_event кроме onb_seen. Шлёт мягкое напоминание: «Привет ещё раз! Пара тапов и [ценность за 10 секунд]» с одной кнопкой действия. Не более 2 таких напоминаний с интервалом 3+ дней — иначе пользователь блокирует бот. Конверсия реактивации обычно 5–15%, зависит от качества первого приветствия. Если конверсия < 3% — проблема в самом приветствии, не в напоминаниях.

Какие A/B-тесты сильнее всего влияют на onboarding?

Топ-3: текст приветствия (короткое 2 строчки vs описательное 5 строк — короткое чаще выигрывает на 10–20% activation), количество вариантов в первом сообщении (1 главная кнопка vs 3 — одна обычно лучше), момент запроса телефона (сразу vs «когда понадобится» — отложенный почти всегда побеждает на 15–30% retention 1d). Тесты по эмодзи дают слабый эффект (±2–5%), но в массе важны. Бесплатный приветственный бонус при первом действии часто даёт +20–40% к activation, но проверяйте unit-экономику.