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

NPS и опросы в боте MAX: правильный замер лояльности

Как замерять NPS, CSAT и CES в боте MAX: момент опроса, формулировки, шкала, реакция на промоутеров и детракторов, антифрод и интеграция с CRM.

  • MAX
  • NPS
  • аналитика

NPS в боте — самый дешёвый и быстрый способ узнать, что думают клиенты. Но 90% реализаций ломаются: спрашивают в неудачный момент, формулируют криво, не реагируют на низкие оценки и в итоге собирают шум вместо данных. В этой статье — как правильно встроить NPS / CSAT / CES в бот MAX: когда задавать вопрос, как формулировать, шкала и комментарий, реакция на промоутеров и детракторов, антифрод от self-promo, интеграция с CRM и регулярный мониторинг динамики.

Какие метрики и зачем

МетрикаВопросШкалаЧто измеряет
NPS«Насколько вероятно, что вы порекомендуете нас?»0–10Лояльность и виральность
CSAT«Насколько вы удовлетворены [действием]?»1–5 / 1–10Удовлетворённость конкретным касанием
CES«Насколько просто было [сделать действие]?»1–7Усилия пользователя

Не путайте. NPS — про долгосрочную лояльность к бренду, спрашивается раз в квартал/после ключевой покупки. CSAT — после конкретного касания (заказ, разговор с поддержкой). CES — про юзабилити (легко ли было оформить заказ).

Когда задавать вопрос

КогдаКакая метрика
Сразу после доставки заказаCSAT
После закрытия тикета поддержкиCSAT + CES
После отмены заказаCSAT (понять причину)
Раз в квартал для активныхNPS
Через 30 дней после первого заказаNPS (адаптация)
После ключевого события (юбилей в сервисе)NPS

Правило: спрашивайте, когда у пользователя свежее впечатление. Через 2 недели после «спасибо за заказ» NPS — мусор.

Формулировки

NPS:

На сколько вероятно, что вы порекомендуете нас друзьям и коллегам? (0 — точно не порекомендую, 10 — обязательно порекомендую)

CSAT после заказа:

Как вам ваш заказ? Оцените от 1 до 5

CES после саппорта:

Насколько просто было решить ваш вопрос? 1 — очень сложно, 5 — очень просто

Не используйте «оцените сервис» — слишком абстрактно и каждый понимает по-своему.

Реализация в боте MAX

async def send_nps(user_id: int):
    text = (
        "Помогите нам стать лучше 🙏\n\n"
        "Насколько вероятно, что вы порекомендуете нас друзьям?\n"
        "0 — точно не порекомендую, 10 — обязательно"
    )
    rows = []
    for r in [(0, 1, 2, 3), (4, 5, 6), (7, 8, 9, 10)]:
        rows.append([InlineKeyboardButton(str(s), callback_data=f"nps:{s}") for s in r])
    await bot.send_message(user_id, text, reply_markup=InlineKeyboardMarkup(rows))

@bot.callback_query_handler(lambda c: c.data.startswith("nps:"))
async def on_nps(call):
    score = int(call.data.split(":")[1])
    await db.execute("INSERT INTO nps_responses (user_id, score, created_at) VALUES ($1,$2,now())",
                     call.from_user.id, score)
    if score <= 6:
        await on_detractor(call, score)
    elif score <= 8:
        await on_passive(call)
    else:
        await on_promoter(call, score)

Важно: на оценку обязательно реагируйте, не просто «спасибо за оценку». Для каждого сегмента — свой сценарий.

Реакция на детрактора

async def on_detractor(call, score: int):
    text = (
        "Очень жаль, что не оправдали ожиданий 😔\n\n"
        "Что пошло не так? (можно коротко в свободной форме — поможет нам исправить)"
    )
    await set_state(call.from_user.id, "nps:detractor_comment")
    await bot.send_message(call.message.chat.id, text)
    # Эскалация в саппорт
    await bot.send_message(SUPPORT_CHAT, f"⚠️ Детрактор {call.from_user.id}: NPS={score}, ждём комментарий")

Принцип: детрактор — это шанс спасти клиента. Личное сообщение от менеджера в течение часа закрывает 30–40% жалоб.

Реакция на промоутера

async def on_promoter(call, score: int):
    text = (
        "Спасибо! 💚 Очень рады, что нам по пути.\n\n"
        "Если хотите — поделитесь ссылкой с друзьями (1000₽ им, 1000₽ вам):\n"
        f"{await build_referral_link(call.from_user.id)}"
    )
    await bot.send_message(call.message.chat.id, text)

Промоутер готов рекомендовать — превратите это в реферальную программу. Подробнее в статье «Реферальная программа в боте MAX».

Сбор комментариев

Числовая оценка без комментария — половина пользы. Логика «после оценки 0–8 спрашиваем «почему», после 9–10 — «что особенно понравилось» (для маркетинговых тестимониалов)»:

@bot.message_handler(func=lambda m: state(m).name == "nps:detractor_comment")
async def on_detractor_comment(msg):
    await db.execute(
        "UPDATE nps_responses SET comment = $1 WHERE user_id = $2 AND comment IS NULL ORDER BY created_at DESC LIMIT 1",
        msg.text, msg.from_user.id,
    )
    await bot.send_message(msg.chat.id, "Спасибо! Менеджер свяжется в течение часа.")
    await create_crm_ticket(msg.from_user.id, "NPS_detractor", msg.text)
    await clear_state(msg.from_user.id)

Расчёт NPS

WITH cat AS (
  SELECT 
    CASE
      WHEN score >= 9 THEN 'promoter'
      WHEN score >= 7 THEN 'passive'
      ELSE 'detractor'
    END AS bucket,
    count(*) AS n
  FROM nps_responses
  WHERE created_at > now() - interval '90 days'
  GROUP BY 1
)
SELECT 
  100.0 * (
    sum(CASE WHEN bucket = 'promoter' THEN n ELSE 0 END) -
    sum(CASE WHEN bucket = 'detractor' THEN n ELSE 0 END)
  ) / sum(n) AS nps,
  sum(n) AS responses
FROM cat;

Бенчмарки NPS по индустриям 2026:

  • ритейл онлайн — 30–55;
  • доставка еды — 25–50;
  • финтех — 30–60;
  • B2B SaaS — 20–45.

Антифрод

Защита от:

  • сам себе ставит 10 сто раз: один user_id — одна оценка в окне 30 дней;
  • промо-боты: проверка возраста аккаунта, наличие фото, активности;
  • ставят 0, чтобы получить компенсацию: лимит выплат компенсаций, ручное ревью;
  • сотрудники голосуют 10 со своих аккаунтов: исключаем известные внутренние user_id.
async def can_submit_nps(user_id: int) -> bool:
    last = await db.fetch_val("""
        SELECT max(created_at) FROM nps_responses WHERE user_id = $1
    """, user_id)
    if last and (datetime.utcnow() - last).days < 30:
        return False
    if user_id in INTERNAL_USERS:
        return False
    return True

Сегментация и динамика

NPS на агрегате — слишком крупный показатель. Разрезайте по:

  • сегмент пользователя (champion / new / at_risk);
  • источник трафика (реклама, реферал, сарафан);
  • продукт / категория;
  • регион;
  • частота покупок.

Тренд месяц-к-месяцу важнее абсолютного значения. Падение NPS на 5 пунктов за месяц — повод копать (что изменили в продукте, в доставке, в ценах).

Интеграция с CRM

Каждая оценка должна создавать событие в CRM (amoCRM/Bitrix24). Поля: оценка, комментарий, сегмент, дата заказа, на которое ответил. Это даёт менеджерам полную картину клиента.

async def push_to_crm(user_id: int, score: int, comment: str | None):
    await crm.create_note(
        contact_id=await get_crm_contact(user_id),
        text=f"NPS: {score}\n{comment or ''}",
        tags=["NPS", f"NPS_{score}", "detractor" if score <= 6 else "promoter" if score >= 9 else "passive"],
    )
    if score <= 6:
        await crm.create_task(
            contact_id=await get_crm_contact(user_id),
            title="Перезвонить детрактору",
            deadline=datetime.utcnow() + timedelta(hours=4),
        )

Common pitfalls

  1. Спрашивают сразу при /start — пользователь не видел сервиса, оценка случайная.
  2. «Оцените сервис от 1 до 5» — путают шкалы, мешают NPS / CSAT.
  3. Не реагируют на детрактора — упускают шанс спасти клиента.
  4. Спам каждый месяц — отписки.
  5. NPS как KPI команды — натягивают цифры, исчезает honesty.
  6. Один общий NPS вместо сегментов — теряют сигнал.

Итого

NPS / CSAT / CES в боте MAX — мощный инструмент при правильной реализации: спрашивайте в момент свежего впечатления (после доставки, после саппорта, через 30 дней после первого заказа), используйте правильную метрику под задачу (не путайте NPS и CSAT), реагируйте на оценку — детрактору эскалация в саппорт + личное сообщение менеджера в течение часа, промоутеру — реферальная программа. Собирайте комментарии после числовой оценки. Защищайтесь от self-promo и накруток лимитом 1 ответ в 30 дней. Интегрируйте в CRM как note + task. Сегментируйте по когортам и продуктам. Тренд важнее абсолюта. Грамотная NPS-программа выявляет проблемы до того, как они станут массовыми, и поднимает конверсию рефералов на десятки процентов.

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

Чем отличаются NPS, CSAT и CES?

NPS («Насколько вероятно, что порекомендуете?» 0–10) измеряет долгосрочную лояльность и виральность, спрашивается раз в квартал или после ключевых событий. CSAT («Насколько вы довольны?» 1–5) — про удовлетворённость конкретным касанием (заказ, разговор с саппортом), задаётся сразу после события. CES («Насколько просто было сделать X?» 1–7) — про юзабилити, минимизацию усилий пользователя. Не путайте — у каждой свой контекст применения и интерпретация. Всё вместе даёт полную картину: NPS показывает, останется ли клиент с вами, CSAT — что-то конкретное сломалось, CES — где интерфейс трудный.

Когда правильно задавать NPS?

Через 30 дней после первого заказа (адаптация состоялась, но впечатления свежие), раз в квартал для активных клиентов, после юбилея в сервисе. Не задавайте при /start — пользователь не видел продукт, ответ случайный. Не задавайте сразу после доставки заказа — это CSAT-момент, не NPS. Не задавайте чаще раза в 30–60 дней одному пользователю — оценки начинают «размываться», люди раздражаются. Лучшая практика — рандомизация момента в окне ±2 дня от целевой даты, чтобы избежать «понедельничного эффекта».

Как правильно реагировать на детрактора (0–6)?

Сразу — извинение и просьба коротко описать, что пошло не так. Эскалация в чат поддержки с алертом «детрактор!». Менеджер связывается в течение часа лично, разбирает проблему, предлагает компенсацию (если применимо). Это закрывает 30–40% жалоб без ухода клиента. Промежуточный шаг — категоризация причины (доставка / качество / цена / сервис) для аналитики паттернов. Если детракторы стабильно жалуются на одно и то же — проблема системная, чините продукт.

Что делать с промоутерами (9–10)?

Не «спасибо за оценку», а конкретное действие: предложите реферальную программу с понятным бонусом (1000 ₽ им, 1000 ₽ вам), запросите отзыв на публичной площадке (2GIS, Яндекс.Карты), предложите написать кейс / тестимониал для маркетинга. Сегмент промоутеров — самый ценный для виральности и лояльности, отдельные акции для них (early access, закрытые скидки) усиливают связь с брендом. Показатель «доля промоутеров с минимум 1 рефералом» — отдельная метрика NPS-программы.

Какой NPS считается хорошим?

Зависит от индустрии: онлайн-ритейл 30–55, доставка еды 25–50, финтех 30–60, B2B SaaS 20–45, телеком 0–30 (низко по индустрии). Абсолютное значение менее важно, чем тренд: NPS 35 с ростом +5 в квартал лучше, чем NPS 50 с падением -3. Сравнивайте себя в первую очередь с собой во времени, потом с прямыми конкурентами. Помните: высокий NPS можно «нарисовать» отбором респондентов (только довольные клиенты), поэтому смотрите на response rate (% ответивших) вместе со значением — низкий response rate = смещение выборки.

Как защитить NPS от накруток?

Лимит — один ответ от user_id в 30 дней. Исключение известных внутренних user_id (сотрудники, тестировщики). Скоринг подозрительных аккаунтов: возраст MAX-аккаунта, наличие фото, активность в платформе. Лимит выплат компенсаций детракторам с ручным ревью. Аномалия «50 десяток за час с одного IP» — алерт. Если у компании есть KPI на NPS у команды — это убивает honesty: люди начинают «упрашивать поставить 10», что искажает реальную картину. NPS должен быть метрикой исследования, не KPI.

Как интегрировать NPS с amoCRM/Bitrix24?

Каждая оценка создаёт note в карточке контакта с тегами (NPS, NPS_X, detractor/passive/promoter). Для детракторов автоматически создаётся задача «Перезвонить детрактору» с дедлайном 4 часа на ответственного менеджера. Для промоутеров — задача «Запросить тестимониал». В дашборде CRM выводите динамику NPS по менеджерам, продуктам, регионам — это даёт управленческий взгляд. Выгрузка комментариев детракторов в текстовый отчёт раз в неделю — must-have для продуктовой команды.