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

Бот для B2B-лидогенерации в MAX: квалификация, скоринг, передача в продажи

Как сделать B2B-лидогена в MAX: квалификация по BANT/SPIN, скоринг лида, передача в CRM, follow-up, интеграция с менеджерами и метрики воронки.

  • MAX
  • B2B
  • продажи

B2B-продажи в РФ 2026 года всё больше уходят в мессенджеры — именно туда переезжают LPR (лица, принимающие решения) после ухода LinkedIn и западных каналов. Бот в MAX закрывает важный кусок воронки: первичная квалификация, сбор контактов, передача горячего лида менеджеру в готовом для звонка виде. В этой статье — как построить B2B-лидогенерацию через бот в MAX: квалификация по BANT, скоринг, передача в CRM, follow-up неотвеченных, дашборды воронки и метрики.

Зачем нужен бот в B2B-воронке

ЗадачаЧто делает бот
Первичная квалификацияОтсеивает «неподходящих» (компания не той отрасли/размера)
Сбор контактовФИО, должность, email, телефон, компания
СкорингОценка «готовности» 1–100
Передача в CRMСоздание сделки в amoCRM/Bitrix с заполненными полями
ПрогревСерия касаний (контент, кейсы, вебинары)
Reminder«Менеджер не дозвонился, удобно сейчас?»
АналитикаВоронка по источникам, конверсии, LTV

Цель — менеджер получает лид с полностью заполненным профилем, оценкой и историей касаний. Не «парень из бота, перезвоните».

Квалификация: BANT vs MEDDIC

BANT (Budget, Authority, Need, Timing) — простая, для коротких сделок. MEDDIC (Metrics, Economic Buyer, Decision Criteria, Decision Process, Identify Pain, Champion) — для энтерпрайз. Для бота — лучше BANT в виде 4–6 вопросов.

QUESTIONS = [
    {
        "key": "industry",
        "q": "В какой отрасли работаете?",
        "type": "buttons",
        "options": ["Ритейл", "Финансы", "Производство", "Услуги", "Другое"],
    },
    {
        "key": "size",
        "q": "Размер компании?",
        "type": "buttons",
        "options": ["1-10", "11-50", "51-200", "201-1000", "1000+"],
    },
    {
        "key": "role",
        "q": "Ваша роль?",
        "type": "buttons",
        "options": ["Собственник", "ИТ-директор", "Маркетинг", "Продажи", "Другое"],
    },
    {
        "key": "budget",
        "q": "Какой ориентировочный бюджет на проект?",
        "type": "buttons",
        "options": ["До 500 тыс.", "0.5–2 млн", "2–10 млн", "10+ млн", "Не определён"],
    },
    {
        "key": "timing",
        "q": "Когда планируете запуск?",
        "type": "buttons",
        "options": ["В этом месяце", "1–3 месяца", "3–6 месяцев", "Дольше"],
    },
    {
        "key": "use_case",
        "q": "Кратко опишите задачу:",
        "type": "text",
    },
]

Не больше 5–7 вопросов — после этого drop-off растёт экспоненциально.

Скоринг лида

SCORE_RULES = {
    "industry": {"Ритейл": 20, "Финансы": 25, "Производство": 15, "Услуги": 15, "Другое": 5},
    "size":     {"1-10": 5, "11-50": 15, "51-200": 25, "201-1000": 30, "1000+": 25},
    "role":     {"Собственник": 30, "ИТ-директор": 25, "Маркетинг": 15, "Продажи": 15, "Другое": 5},
    "budget":   {"До 500 тыс.": 10, "0.5–2 млн": 25, "2–10 млн": 35, "10+ млн": 30, "Не определён": 5},
    "timing":   {"В этом месяце": 35, "1–3 месяца": 25, "3–6 месяцев": 10, "Дольше": 0},
}

def score_lead(answers: dict) -> int:
    return sum(SCORE_RULES[k].get(v, 0) for k, v in answers.items() if k in SCORE_RULES)

Категоризация:

  • 0–30: cold (рассылка контента);
  • 31–60: warm (касание менеджера через 24 ч);
  • 61+: hot (звонок менеджера в течение часа).

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

@bot.message_handler(commands=["start"])
async def on_start(msg):
    text = (
        "Привет! 👋 Я помогу подобрать решение под вашу задачу за 2 минуты.\n\n"
        "5 коротких вопросов — и подключу менеджера с готовым предложением."
    )
    kb = InlineKeyboardMarkup([[InlineKeyboardButton("🚀 Начать", callback_data="qual:start")]])
    await bot.send_message(msg.chat.id, text, reply_markup=kb)

@bot.callback_query_handler(lambda c: c.data == "qual:start")
async def start_qual(call):
    await set_state(call.from_user.id, "qual:0", payload={"answers": {}})
    await ask_q(call.message.chat.id, 0)

async def ask_q(chat_id: int, idx: int):
    if idx >= len(QUESTIONS):
        return await finalize_lead(chat_id)
    q = QUESTIONS[idx]
    if q["type"] == "buttons":
        rows = [[InlineKeyboardButton(opt, callback_data=f"qa:{idx}:{i}")] for i, opt in enumerate(q["options"])]
        await bot.send_message(chat_id, q["q"], reply_markup=InlineKeyboardMarkup(rows))
    else:
        await bot.send_message(chat_id, q["q"])

Передача в CRM

async def finalize_lead(chat_id: int, user_id: int):
    state = await get_state(user_id)
    answers = state.payload["answers"]
    score = score_lead(answers)
    contact = await get_contact_info(user_id)   # name, phone, email из MAX-профиля + допросов

    deal_id = await crm.create_deal({
        "name": f"{contact.company or contact.name} — заявка из MAX",
        "responsible_user_id": pick_manager(score, answers["industry"]),
        "tags": ["MAX", "bot_lead", f"score_{score//10*10}"],
        "fields": {
            "Источник": "Бот MAX",
            "Отрасль": answers["industry"],
            "Размер": answers["size"],
            "Бюджет": answers["budget"],
            "Срок": answers["timing"],
            "Задача": answers.get("use_case"),
            "Скоринг": score,
        },
        "contacts": [{"name": contact.name, "phone": contact.phone, "email": contact.email}],
    })
    
    # Уведомление менеджеру
    await notify_manager(deal_id, score, answers)

    # Подтверждение пользователю
    await bot.send_message(chat_id, build_thank_you(score))

pick_manager — роутинг по отрасли (один менеджер ведёт ритейл, другой — финансы) и по нагрузке (round-robin или least-loaded).

Подтверждение и SLA

В зависимости от скора — разный текст:

def build_thank_you(score: int) -> str:
    if score >= 61:
        return ("🎯 Спасибо! Передал заявку менеджеру.\n\n"
                "Ольга свяжется в течение 1 часа в рабочее время.\n"
                "Кстати, вот наш кейс по похожей задаче: https://example.ru/case-x")
    if score >= 31:
        return ("✅ Спасибо! Менеджер подберёт решение и свяжется в течение 24 часов.\n\n"
                "Пока — бесплатный гайд «Как выбрать платформу X»: https://...")
    return ("Спасибо за интерес! Подпишу вас на полезные материалы. "
            "Если понадобится решение — пишите, отвечу.")

SLA по обработке хот-лида публично озвучивается, что повышает доверие.

Follow-up

Менеджер не дозвонился? Бот напоминает:

async def cron_follow_up():
    # Лид > 24 часов, статус "не дозвонились"
    rows = await db.fetch_all("""
        SELECT * FROM leads 
        WHERE status='no_answer' 
          AND created_at < now() - interval '24 hours'
          AND followup_count < 2
    """)
    for r in rows:
        await bot.send_message(
            r.user_id,
            "Менеджер пытался дозвониться. Когда удобно перезвонить?",
            reply_markup=InlineKeyboardMarkup([
                [InlineKeyboardButton("Через 1 час", callback_data=f"fu:1h:{r.id}")],
                [InlineKeyboardButton("Завтра утром", callback_data=f"fu:tomorrow:{r.id}")],
                [InlineKeyboardButton("Не интересно", callback_data=f"fu:no:{r.id}")],
            ]),
        )

Прогрев холодных

Лиды со скором < 30 — серия касаний:

  • День 1: «Спасибо за интерес, вот гайд по теме».
  • День 7: кейс клиента из вашей отрасли.
  • День 14: вебинар-приглашение.
  • День 30: повторная квалификация «Что-то изменилось у вас в задаче?».

Если после 30 дней нет реакции — в архив. Через 6 месяцев — повторное касание.

Интеграция с amoCRM / Bitrix24

Подробно — в статье «Интеграция бота MAX с 1С/amoCRM/Bitrix24». Минимум:

import httpx

async def amocrm_create_lead(data: dict, contact: dict) -> int:
    async with httpx.AsyncClient() as cli:
        # Контакт
        c = await cli.post(
            f"{AMO_BASE}/api/v4/contacts",
            json={"name": contact["name"], "custom_fields_values": [...]},
            headers={"Authorization": f"Bearer {AMO_TOKEN}"},
        )
        contact_id = c.json()["_embedded"]["contacts"][0]["id"]
        # Сделка
        d = await cli.post(
            f"{AMO_BASE}/api/v4/leads",
            json={
                "name": data["name"],
                "responsible_user_id": data["responsible_user_id"],
                "_embedded": {"contacts": [{"id": contact_id}]},
                "custom_fields_values": [...],
            },
            headers={"Authorization": f"Bearer {AMO_TOKEN}"},
        )
        return d.json()["_embedded"]["leads"][0]["id"]

Метрики воронки

МетрикаБенчмарк
Conversion start → start_qualification60–80%
Conversion start_qual → completed50–70%
Среднее время квалификации90–180 секунд
Hot leads / total20–40%
Conversion lead → customer5–20% (B2B индустрия)
Среднее время до первого контакта менеджера (hot)< 1 час
Cost per qualified lead500–5 000 ₽

Антифрод и защита от ботов

В B2B типичная проблема — конкуренты или боты заполняют форму, чтобы выкачать контент / выявить ваших менеджеров. Меры:

  • captcha на входе для трафика с подозрительных источников;
  • проверка email на disposable (mailinator, 10minutemail);
  • проверка телефона на validity (REST API телефонной валидации);
  • лимит 1 заявка с user_id в 7 дней;
  • анализ времени прохождения квалификации — < 10 секунд = бот.

Common pitfalls

  1. 20 вопросов вместо 5 — drop-off 80%.
  2. Нет SLA реакции — лид через час остыл.
  3. Ручная передача в CRM — менеджер забывает, лиды теряются.
  4. Скоринг = средний по больнице — не отделяет hot от cold.
  5. Только текст, без кнопок — пользователь печатает «10», вы парсите regex.
  6. Менеджер не видит истории касаний — звонит «вслепую».

Итого

B2B-бот для лидогенерации в MAX: 5–7 квалификационных вопросов по BANT с inline-кнопками, скоринг 0–100 по правилам по отрасли/размеру/роли/бюджету/срокам, автоматическая передача в amoCRM/Bitrix24 с заполненными полями и тегами, роутинг на менеджера по отрасли и нагрузке, разный thank-you и SLA по сегменту (hot — звонок за час, warm — 24 часа, cold — прогрев), follow-up неотвеченных, прогрев холодных серией контента, метрики воронки (conv start→qual 60–80%, hot share 20–40%). MVP — 4–6 недель и 700–1500 тыс. ₽; полный с прогревом, скорингом, интеграцией CRM, дашбордами — 8–12 недель и 1.5–3 млн ₽. ROI обычно 5–15× за счёт того, что менеджеры тратят время только на готовых лидов с заполненным профилем, а не на «расскажите кто вы и что нужно».

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

Сколько вопросов в квалификации B2B-бота?

Оптимально 5–7. До 5 — недостаточно для скоринга, после 7 — drop-off растёт экспоненциально (с каждым вопросом теряете 5–10% лидов). Минимум: отрасль, размер компании, роль контакта, ориентировочный бюджет, срок запуска. Опционально — задача в свободной форме (1 текстовое поле). Всё через inline-кнопки, кроме последнего — это снижает трение и даёт чистые данные для скоринга. Среднее время прохождения — 90–180 секунд.

Как считать скоринг лида?

Простая аддитивная модель: каждому варианту ответа — балл (отрасль 5–25, размер 5–30, роль 5–30, бюджет 5–35, срок 0–35). Сумма 0–100. Категоризация: 0–30 cold, 31–60 warm, 61+ hot. Веса калибруются по реальной конверсии: смотрите, какие ответы коррелируют со сделкой, поднимайте им вес. Через ML (логистическая регрессия / градиентный бустинг) можно сильно поднять точность скоринга при наличии 500+ закрытых сделок для обучения.

Какой SLA реакции на горячий лид?

Хот-лид (61+ score) — звонок менеджера в течение 1 часа в рабочее время. Это критично: исследования показывают, что conversion падает в 5–10 раз при задержке более 1 часа. Warm (31–60) — 24 часа. Cold (0–30) — серия писем без звонка. SLA должен быть публично озвучен в подтверждении пользователю — это повышает доверие и удерживает на линии. Нарушение SLA — алерт менеджеру и эскалация руководителю.

Как роутить лиды между менеджерами?

Двухуровневый роутинг: по отрасли (ритейл — Ольга, финансы — Сергей) и по нагрузке (round-robin или least-loaded по количеству активных сделок). Дополнительно — приоритет хот-лидов перед warm-лидами в очереди распределения. Если у профильного менеджера загрузка > N сделок — fallback на старшего менеджера или дежурного. Ночью и в выходные — отложенная передача с follow-up в начале рабочего дня.

Как обработать ситуацию «менеджер не дозвонился»?

Cron раз в 6 часов проверяет лиды со статусом no_answer старше 24 часов. Бот шлёт сообщение «Менеджер пытался дозвониться. Когда удобно перезвонить?» с inline-кнопками «через час / завтра утром / не интересно». На основе ответа — запись в задачу менеджеру с правильным дедлайном. Не более 2 follow-up через бот, дальше — в архив. Это спасает 15–30% лидов, которые иначе потерялись бы из-за неудачного времени звонка.

Как защитить B2B-бот от конкурентов и ботов-скрейперов?

Captcha на старте для подозрительного трафика (Yandex SmartCaptcha с invisible режимом). Проверка email на disposable домены (mailinator, 10minutemail и т.п. — отбиваем). Проверка телефона на validity через REST API (NUMVERIFY, Twilio Lookup). Лимит 1 заявка с user_id в 7 дней. Анализ времени прохождения — < 10 секунд это явно бот, отбрасываем. Скоринг с понижающим коэффициентом для подозрительных IP (TOR, дата-центры). Внутренний blacklist user_id и компаний по результатам ручного ревью.

Сколько стоит и сколько занимает разработка?

MVP с квалификацией, скорингом, передачей в CRM, базовым follow-up — 4–6 недель и 700–1500 тыс. ₽. Полная версия с прогревом холодных, ML-скорингом, дашбордами воронки, A/B-тестами вопросов, интеграцией с amoCRM/Bitrix24/RetailCRM — 8–12 недель и 1.5–3 млн ₽. Поддержка инфры — 5–15 тыс. ₽/мес. ROI обычно 5–15× в первые 6 месяцев: менеджеры тратят время только на квалифицированных лидов с заполненным профилем, конверсия в сделку растёт в 2–3 раза, cost per qualified lead снижается на 40–70%.