Первые 60 секунд диалога с ботом решают, останется ли пользователь или удалит чат через минуту. Половина новых пользователей, которые «пропали» — пропала именно в onboarding: непонятно, что бот умеет, слишком много вопросов сразу, нет «вау-момента». В этой статье — как сделать onboarding бота в MAX, который поднимает retention 1d с 30% до 60%, проводит пользователя через первый ценный шаг за < 60 секунд, корректно собирает согласия по 152-ФЗ и не требует от человека ввода всего сразу.
Цели onboarding
- Первое впечатление — за 5 секунд пользователь понимает, что это за бот.
- Первый ценный шаг — за 60 секунд получил конкретную пользу.
- Минимум данных — собираем только то, без чего нельзя работать.
- Согласия — получены явно, не «спрятаны» в пользовательское соглашение.
- Активация — пользователь сделал ключевое действие (заказ, запись, тест).
Антипаттерны
| Антипаттерн | Что вместо |
|---|---|
| «Введите имя, телефон, 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 | % дошедших до конца flow | 60–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
- Длинное приветствие на 1500 символов — никто не читает.
- Сразу регистрация — отказ 60% потенциальных пользователей.
- Мелкая клавиатура с 8 пунктами — пользователь теряется.
- Согласие в виде «принять условия» без объяснения — нарушение 152-ФЗ.
- Нет аналитики onboarding — не видите, где падают.
- Нет «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-экономику.