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

Бот для сбора отзывов в Telegram

Как собрать бот для NPS, отзывов о товаре и услуге в Telegram: NPS-шкала, теги, модерация, публикация в канал и интеграция с Yandex/2GIS.

  • Telegram
  • отзывы
  • NPS
  • репутация

Сбор отзывов — недооценённый сценарий для Telegram-ботов. После заказа клиент получает в боте короткую форму, оценивает сервис по NPS-шкале, оставляет комментарий — и бот автоматически публикует положительные отзывы в канал, отрицательные эскалирует руководителю, а нейтральные просит улучшить с конкретикой.

Разберём архитектуру, шаблоны диалога, антиспам и связку с публичными площадками (Яндекс.Карты, 2GIS, Google Maps).

Зачем собирать отзывы через бот

  • Конверсия в отзыв х5 против email-рассылки.
  • Скорость: отзыв в течение 1–24 часов после услуги, пока эмоции свежи.
  • Сегментация на лету: довольные → публикация, недовольные → саппорт.
  • Бесплатное распространение — бот сразу шлёт отзыв в Telegram-канал бренда.
  • Метрики — NPS, CSAT, доля промоутеров считаются автоматически.

CR в отзыв через бота — 30–50% против 5–8% по email и 1–3% по SMS.

Сценарий диалога: NPS + детали

Бот: Иван, спасибо что выбрали нас!
     Оцените, насколько вероятно, что вы порекомендуете нас друзьям?
     [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]

Юзер: 9

Бот: Здорово! Что вам особенно понравилось?
     [Качество] [Скорость] [Сервис] [Цена] [Своё]

Юзер: Скорость

Бот: Хотите, мы опубликуем ваш отзыв в нашем канале?
     [Да, опубликовать] [Только для вас]

Юзер: Да

Бот: Спасибо! Отзыв уже на модерации, опубликуем в течение часа.

Вся цепочка — 4 сообщения, 30 секунд времени юзера.

Реализация на aiogram FSM

from aiogram.fsm.state import StatesGroup, State
from aiogram.fsm.context import FSMContext

class Review(StatesGroup):
    score = State()
    reason = State()
    publish = State()


@router.message(F.text == "/review")
async def start_review(message: Message, state: FSMContext):
    await state.set_state(Review.score)
    await message.answer(
        "Оцените нас от 0 до 10",
        reply_markup=score_kb(),
    )


@router.callback_query(Review.score, F.data.startswith("score:"))
async def on_score(cb: CallbackQuery, state: FSMContext):
    score = int(cb.data.split(":")[1])
    await state.update_data(score=score)
    if score >= 9:
        await cb.message.answer("Что вам особенно понравилось?", reply_markup=tags_pos_kb())
    elif score >= 7:
        await cb.message.answer("Что можем улучшить?", reply_markup=tags_neutral_kb())
    else:
        await cb.message.answer("Что пошло не так? Опишите подробнее.")
        await state.set_state(Review.reason)
        return
    await state.set_state(Review.reason)

NPS-логика: 9–10 — промоутер, 7–8 — нейтральный, 0–6 — детрактор. Каждой группе — свой следующий шаг.

Эскалация недовольных

Когда юзер ставит ≤6 — это критичный сигнал. Бот сразу:

  1. Приносит извинения.
  2. Просит детали (кнопки причин + свободный текст).
  3. Создаёт тикет в саппорт-чате с тегом urgent.
  4. Уведомляет руководителя в личку.
async def escalate(user, score, reason):
    await bot.send_message(
        SUPPORT_CHAT_ID,
        f"⚠️ Низкий NPS\n"
        f"Юзер: {user.full_name} (@{user.username})\n"
        f"Оценка: {score}/10\n"
        f"Причина: {reason}",
        message_thread_id=URGENT_TOPIC_ID,
    )
    await bot.send_message(
        MANAGER_ID,
        f"Срочно перезвоните: @{user.username}",
    )

Реакция в течение часа на негатив возвращает в продукт 40–60% детракторов.

Публикация положительных отзывов

Промоутеры (NPS 9–10), которые согласились публиковать, попадают в очередь модерации:

async def publish_review(review_id: int):
    r = await reviews.get(review_id)
    if r.status != "approved":
        return
    text = (
        f"⭐ Оценка: {r.score}/10\n"
        f"<b>{r.user_name}</b>\n\n"
        f"{r.text}\n\n"
        f"#отзыв #{r.tag}"
    )
    await bot.send_message(
        REVIEWS_CHANNEL_ID,
        text,
        parse_mode="HTML",
    )
    await reviews.mark_published(review_id)

Поток отзывов в канале даёт постоянный «социальный пруф» для новых клиентов.

Антиспам

Главные проблемы:

  • Конкуренты пишут негатив.
  • Один клиент пишет 10 отзывов с разных аккаунтов.
  • Бывшие сотрудники мстят.

Меры:

ПроблемаРешение
Чужие негативыпривязка отзыва к заказу (через QR в чеке или ссылку из CRM)
Multi-accпроверка tg_id + телефона + email в CRM
Спамrate-limit 1 отзыв на услугу на пользователя
Боты-фейкипроверка возраста аккаунта, наличие аватара

Основной приём — deeplink-привязка: после оплаты CRM генерирует уникальный URL t.me/yourbot?start=review_<order_id>_<hash>. Только по нему можно оставить отзыв на этот заказ.

Интеграция с Яндекс/2GIS/Google Maps

Положительные отзывы хочется размножить на публичных площадках. Сценарий:

  1. После публикации в канале бот пишет юзеру: «Если вам не сложно, скопируйте отзыв на Яндекс.Карты — это поможет нам».
  2. Кнопка «Открыть на Я.Картах» с deeplink на карточку организации.
  3. Бот предлагает скопировать готовый текст в буфер обмена.

Полностью автоматизировать публикацию нельзя (нужен живой клик юзера на площадке), но конверсия в перенос отзыва — 30–50%, что отлично работает.

Метрики

МетрикаФормулаНорма
Response rateответили / спросили30–50%
NPS(% промоутеров − % детракторов) × 100от 30 для здорового сервиса
CSATсредняя оценкаот 8.5 / 10
Time-to-reviewвремя между услугой и отзывомменее 24 часов
Publish rateопубликованных / промоутеров60–80%
Recovery rateдетракторы, ставшие нейтральными40–60%

Топ-5 ошибок

  1. Просят отзыв через 7 дней после услуги — клиент уже забыл детали.
  2. Не сегментируют по NPS — публикуют негативы наравне с позитивами.
  3. Не привязывают отзыв к заказу — невозможно отличить настоящего клиента от подставного.
  4. Шлют один и тот же текст всем — отвечают 5%.
  5. Игнорируют негатив или отвечают шаблоном — клиент уходит ещё злее.

Итого

Сбор отзывов через Telegram-бота — самый быстрый путь от услуги до публичного социального доказательства. NPS-шкала + сегментация + автопубликация в канал + эскалация недовольных дают 30–50% response rate, NPS 40–60 в нормальном бизнесе и десятки органических отзывов в неделю на публичных площадках. Главное — спрашивать сразу после услуги и реагировать на негатив в течение часа.

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

Когда лучше всего просить отзыв?

Через 30 минут — 4 часа после оказания услуги, пока эмоции свежие. Для b2b — на следующий рабочий день после демо или внедрения. Через 7+ дней response rate падает в 3 раза. Сценарий триггерится по событию из CRM: «статус сделки = выполнено» → запуск отзыв-бота.

Что делать с откровенно матерными отзывами?

Не публиковать, отправить руководителю на ручной разбор. Никогда не отвечать клиенту в том же тоне — даже в личке бота. Если оскорбления переходят в угрозы — фиксируйте скриншоты на случай претензий через Роспотребнадзор.

Как мотивировать оставить отзыв?

Скидка 5–10% на следующую покупку, бесплатная доставка, баллы лояльности. Не давайте подарок «за положительный отзыв» — это нарушает закон о рекламе. Формулировка «бонус за участие в опросе, независимо от оценки» легальна и работает не хуже.

Сколько вопросов можно задавать в одном опросе?

Максимум 4–5. Каждый дополнительный вопрос снижает completion rate на 10–15%. Ядро — NPS, причина, согласие на публикацию. Остальное (демография, источник) — необязательное, в свободном поле.

Можно ли не показывать отзыв клиенту, если он плохой?

Внутренне — да, оставляйте на ручной модерации. Публично — нет, удаление негатива с площадок типа Яндекс.Карт нарушает их правила. На своём канале вы решаете сами, но если будете публиковать только хорошее, потеряете доверие — аудитория замечает «5 звёзд у всех».

Как считать NPS правильно?

NPS = (% промоутеров − % детракторов) × 100, где промоутеры — оценка 9–10, детракторы — 0–6. Нейтральные (7–8) не учитываются. Норма для retail/b2c — выше 30, для b2b SaaS — выше 40, для премиум-сервисов — выше 60. Считается на ежемесячной выборке от 100 ответов.

Как защититься от накруток конкурентами?

Привязка отзыва к подтверждённому заказу через deeplink с хешем. Дополнительно — проверка tg_id против таблицы клиентов CRM: если юзера нет в базе клиентов, отзыв принимается, но помечается как «непроверенный» и не публикуется автоматически. Так фейки видит только модератор.