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
- Спрашивают сразу при /start — пользователь не видел сервиса, оценка случайная.
- «Оцените сервис от 1 до 5» — путают шкалы, мешают NPS / CSAT.
- Не реагируют на детрактора — упускают шанс спасти клиента.
- Спам каждый месяц — отписки.
- NPS как KPI команды — натягивают цифры, исчезает honesty.
- Один общий 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 для продуктовой команды.