Суть урока
Продажи — это отбор. Из сотни потенциальных клиентов (людей и компаний, которые проявили интерес; по-английски их называют лидами) покупает небольшая часть. Задача продавца: быстро найти тех, кто купит, и тратить время на них, а не на остальных.
Claude делает этот отбор системным: оценивает потенциальных клиентов по схеме BANT, ставит оценку готовности, пишет личные письма, готовит ответы на возражения. Менеджер приходит к разговору, уже зная, кто перед ним и что его волнует.
В уроке много кода на Python. Если не программируешь, бери из него тексты запросов: они работают и в обычном чате с Claude, достаточно вставить туда свои заметки о клиенте.
Ключевые концепции
- Оценка по BANT — бюджет, полномочия, потребность и сроки (Budget, Authority, Need, Timeline) с помощью AI
- Оценка готовности от 0 до 100 — кто готов купить прямо сейчас
- Личные повторные письма — каждое напоминание пишется под конкретного человека
- База ответов на возражения — Claude готовит черновик ответа на любое возражение
- Правила продаж → AI-советник — документ с правилами продаж (по-английски sales playbook) становится советником для менеджеров
- Apollo.io + Claude — холодные письма с личным подходом
Теория
Оценка по BANT: четыре вопроса, которые решают всё
BANT — давняя схема отбора потенциальных клиентов, и она работает до сих пор:
- Budget (бюджет) — есть ли деньги? Сколько готовы потратить?
- Authority (полномочия) — этот человек принимает решение или только собирает информацию?
- Need (потребность) — есть ли настоящая потребность или «просто смотрим»?
- Timeline (сроки) — когда планируют купить? В этом квартале или «когда-нибудь»?
Claude вытаскивает BANT из переписки: писем, чатов, заметок со звонков и встреч.
import anthropic
import json
client = anthropic.Anthropic()
def text_of(response) -> str:
"""Собирает текст ответа: у новых моделей перед текстом могут идти блоки «размышления»."""
return "".join(block.text for block in response.content if block.type == "text")
def qualify_lead_bant(
company_name: str,
contact_name: str,
contact_position: str,
interaction_history: str
) -> dict:
"""Оценивает потенциального клиента по BANT на основе истории общения"""
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=8000, # с запасом: «размышления» модели тоже входят в этот лимит
messages=[{
"role": "user",
"content": f"""Оцени потенциального клиента по схеме BANT на основе имеющихся данных.
Компания: {company_name}
Контакт: {contact_name}, {contact_position}
История общения:
{interaction_history}
Оцени каждый критерий BANT по шкале 0-3:
0 = нет информации
1 = слабый или сомнительный сигнал
2 = есть признаки
3 = чёткое подтверждение
Верни только JSON, без пояснений и без тройных обратных кавычек вокруг.
Вердикт: hot (горячий), warm (тёплый), cold (холодный) или disqualify (не наш клиент).
{{
"bant": {{
"budget": {{
"score": число 0-3,
"evidence": "цитата или факт из переписки",
"concern": "что настораживает",
"recommendation": "что узнать дополнительно"
}},
"authority": {{
"score": число 0-3,
"evidence": "...",
"concern": "...",
"recommendation": "..."
}},
"need": {{
"score": число 0-3,
"evidence": "...",
"concern": "...",
"recommendation": "..."
}},
"timeline": {{
"score": число 0-3,
"evidence": "...",
"concern": "...",
"recommendation": "..."
}}
}},
"total_score": число 0-12,
"qualification_verdict": "hot/warm/cold/disqualify",
"recommended_next_step": "конкретное следующее действие",
"key_questions_to_ask": ["список из 3 вопросов для следующего контакта"]
}}"""
}]
)
result = json.loads(text_of(response))
# Добавляем оценку в процентах
result["qualification_percent"] = round(result["total_score"] / 12 * 100)
return result
# Тест на выдуманных данных
history = """
15 апреля — первый звонок:
Артём спросил про наш продукт, сказал, что «рассматривают варианты для
автоматизации отдела». Он менеджер по развитию. Директор «пока не в теме».
Бюджет не обсуждали. «Хотели бы разобраться до конца года».
22 апреля — повторный звонок:
Артём пришёл с подробным списком требований. Сказал, что директор одобрил рассмотрение.
Упомянул, что у конкурента похожий продукт стоит $10 000 в год, им кажется дорого.
Хотят начать «не позже третьего квартала — привязано к бюджету».
28 апреля — письмо:
«Мы посмотрели демонстрацию. Нам нравится, но нужно понять, как это связать с нашей
1С. Также директор хочет встретиться лично. Можете на следующей неделе?»
"""
result = qualify_lead_bant(
company_name="ООО Техпром",
contact_name="Артём Власов",
contact_position="Менеджер по развитию",
interaction_history=history
)
print(f"Оценка BANT: {result['total_score']}/12 ({result['qualification_percent']}%)")
print(f"Статус: {result['qualification_verdict'].upper()}")
print(f"\nСледующий шаг: {result['recommended_next_step']}")
print(f"\nВопросы для встречи:")
for q in result['key_questions_to_ask']:
print(f" • {q}")Оценка готовности: кто горячий прямо сейчас
BANT — это основа, но готовность к покупке показывают ещё десятки сигналов. Claude смотрит на все сразу и ставит оценку от 0 до 100.
def score_lead_readiness(
contact_info: dict,
interaction_history: str,
product_type: str,
avg_deal_cycle_days: int
) -> dict:
"""Общая оценка готовности потенциального клиента к покупке"""
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=8000,
messages=[{
"role": "user",
"content": f"""Оцени готовность потенциального клиента к покупке.
Информация о контакте:
{json.dumps(contact_info, ensure_ascii=False)}
Тип продукта: {product_type}
Средний срок сделки: {avg_deal_cycle_days} дней
История:
{interaction_history}
Разбери сигналы:
ПОЛОЖИТЕЛЬНЫЕ: конкретные вопросы о деталях, спрашивает про связку с другими программами и внедрение,
называет сроки, называет бюджет, просит встречу с директором, сравнивает с конкурентами,
просит коммерческое предложение или договор
ОТРИЦАТЕЛЬНЫЕ: расплывчатые ответы, «посмотрим», долгие паузы без ответа,
говорит, что «не его решение», меняет требования, просит всё дешевле
Верни только JSON, без пояснений и без тройных обратных кавычек вокруг:
{{
"score": число 0-100,
"stage": "awareness/consideration/decision/ready_to_buy",
"hot_signals": ["список положительных сигналов из истории"],
"cold_signals": ["список тревожных сигналов"],
"estimated_close_days": число (прогноз, через сколько дней сделка),
"confidence": "low/medium/high",
"action": {{
"immediate": "что сделать прямо сейчас",
"this_week": "что сделать на этой неделе",
"if_no_response": "что делать, если ответа нет 3 дня"
}}
}}"""
}]
)
return json.loads(text_of(response))Личные повторные письма
Шаблонные письма работают плохо. «Добрый день! Мы хотели бы напомнить о нашем предложении...» обычно удаляют, не читая.
Личный подход работает. Но написать вручную 50 личных повторных писем нереально.
def generate_followup_email(
contact: dict,
last_interaction_summary: str,
days_since_last_contact: int,
followup_number: int, # Первое, второе или третье повторное письмо
product_name: str,
your_name: str
) -> dict:
"""Пишет личное повторное письмо"""
followup_tone = {
1: "дружелюбный и лёгкий, добавить пользу (статья или пример из практики)",
2: "чуть прямее, спросить, есть ли вопросы и не изменилось ли что-то",
3: "последний, дать понять, что это последнее напоминание, но без давления"
}
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=8000,
messages=[{
"role": "user",
"content": f"""Напиши личное повторное письмо клиенту.
ДАННЫЕ КОНТАКТА:
Имя: {contact.get('name')}
Компания: {contact.get('company')}
Должность: {contact.get('position')}
Интерес: {contact.get('main_interest')}
КОНТЕКСТ:
Последний контакт: {last_interaction_summary}
Дней без ответа: {days_since_last_contact}
Это повторное письмо номер: {followup_number} из 3
Тон: {followup_tone.get(followup_number, followup_tone[1])}
Продукт: {product_name}
От кого: {your_name}
ТРЕБОВАНИЯ:
- Не больше 3-5 предложений
- Первое предложение — конкретная отсылка к прошлому разговору (не шаблон)
- Добавь что-то полезное (наблюдение, настоящую статистику с источником, короткий настоящий пример); не выдумывай факты
- Один чёткий призыв к действию
- Никакого давления и напора
- Живой язык, не канцелярский
Верни только JSON, без пояснений и без тройных обратных кавычек вокруг:
{{
"subject": "тема письма",
"body": "текст письма",
"ps": "постскриптум (по желанию, только если усиливает)",
"value_add": "что полезного добавлено в письме"
}}"""
}]
)
return json.loads(text_of(response))
# Пример (данные выдуманы)
email = generate_followup_email(
contact={
"name": "Артём",
"company": "ООО Техпром",
"position": "Менеджер по развитию",
"main_interest": "Автоматизация отдела продаж, связка с 1С"
},
last_interaction_summary="Провели демонстрацию, Артёму понравилось, но он спросил про связку с 1С. Договорились, что они обсудят внутри команды.",
days_since_last_contact=4,
followup_number=1,
product_name="SalesBot Pro",
your_name="Михаил"
)
print(f"Тема: {email['subject']}")
print(f"\n{email['body']}")
if email.get('ps'):
print(f"\nP.S. {email['ps']}")База ответов на возражения: ответ на всё
У каждого продукта 10–15 типичных возражений. Опытный продавец знает ответ на каждое. Новичок теряется.
Claude помогает не теряться:
def handle_objection(
objection: str,
product_name: str,
product_key_benefits: list[str],
contact_context: str = ""
) -> str:
"""Готовит ответ на возражение в нескольких вариантах"""
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=8000,
messages=[{
"role": "user",
"content": f"""Клиент высказал возражение. Помоги с ответом.
ПРОДУКТ: {product_name}
ВЫГОДЫ: {', '.join(product_key_benefits)}
ВОЗРАЖЕНИЕ: "{objection}"
КОНТЕКСТ КЛИЕНТА: {contact_context or "Нет дополнительного контекста"}
Дай 3 варианта ответа:
1. **Прямой** — согласись с той частью возражения, которая правда, потом поверни разговор
2. **Через вопрос** — задай вопрос, который поможет клиенту самому прийти к ответу
3. **Через пример** — история настоящего клиента с похожим возражением (если такого примера нет, так и скажи, не выдумывай)
Для каждого:
- Текст ответа (2-4 предложения)
- Когда использовать
Также дай:
- Скрытая причина: что на самом деле стоит за этим возражением
- Тревожный знак: это искреннее возражение или признак, что сделки не будет?"""
}]
)
return text_of(response)
# Типичные возражения и ответы
objections = [
"Это слишком дорого для нас",
"Нам нужно обсудить с руководством",
"Мы уже пользуемся другим решением",
"Давайте вернёмся к этому в следующем квартале",
"Нам нужно подумать"
]
print("=== БАЗА ОТВЕТОВ НА ВОЗРАЖЕНИЯ ===\n")
for obj in objections[:2]: # Показываем первые два для примера
print(f"ВОЗРАЖЕНИЕ: {obj}")
print("-" * 50)
response = handle_objection(
objection=obj,
product_name="SalesBot Pro",
product_key_benefits=["Экономия 5 часов в неделю", "Связка с 1С", "Внедрение за 2 дня"],
contact_context="Клиент — компания, средний бизнес, отдел продаж 10 человек"
)
print(response)
print("\n")Правила продаж → AI-советник
Если у тебя уже есть документ с правилами продаж (кому продаём, что говорим, как отвечаем на возражения; по-английски sales playbook), Claude превращает его в советника для менеджеров.
def create_sales_advisor(playbook_content: str):
"""Создаёт советника по продажам на основе правил продаж"""
def ask_advisor(question: str, deal_context: str) -> str:
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=8000,
system=f"""Ты опытный тренер по продажам. У тебя есть правила продаж компании:
{playbook_content}
Отвечай строго по этим правилам. Если вопрос выходит за их рамки,
так и скажи. Давай конкретные фразы, которые менеджер может использовать прямо сейчас.""",
messages=[{
"role": "user",
"content": f"Ситуация с клиентом: {deal_context}\n\nВопрос: {question}"
}]
)
return text_of(response)
return ask_advisor
# Пример использования (компания и правила выдуманы)
playbook = """
# Правила продаж ООО Техсервис
## Отбор клиентов
- Минимальный бюджет для работы: от $5 000
- С кем говорим: директор / коммерческий директор / IT-директор
- Тревожный знак: если не могут конкретно назвать проблему, это не наш клиент
## Ответ на возражение «Дорого»
1. Спросить: «Дорого по сравнению с чем?»
2. Перевести в окупаемость: «Сколько часов в неделю ваши люди сейчас тратят на X?»
3. Показать пример компании похожего размера
## Как довести до сделки
- Никогда не давать скидку без повода
- Вопрос с выбором: «Вам удобнее начать 1-го или 15-го?»
"""
advisor = create_sales_advisor(playbook)
# Менеджер спрашивает совета прямо перед звонком
advice = advisor(
question="Клиент говорит, что дорого, но явно заинтересован. Что делать?",
deal_context="Компания на 50 человек, IT-директор, рассматривают 3 месяца, бюджет «обсуждаем»"
)
print(advice)Apollo.io + Claude: холодные письма с личным подходом
Apollo.io — сервис с базой контактов компаний и инструментами для холодных писем. Claude добавляет личный подход, которого не даст шаблон.
⚠️ Холодные письма и сбор контактов регулируются законами о рассылках и о персональных данных, в каждой стране своими: проверь правила своей страны и страны получателя. Сведения из LinkedIn собирай вручную: автоматический сбор данных (боты, расширения браузера) LinkedIn запрещает. Перед запуском перечитай урок Холодные письма и сообщения; подробнее о законах — в уроке библиотеки Регулирование AI и соответствие требованиям.
def personalize_cold_outreach(
prospect_data: dict, # Данные о человеке: компания, должность, что он публиковал (из Apollo и LinkedIn)
your_product: str,
your_value_prop: str
) -> dict:
"""Подстраивает холодное письмо под конкретного человека"""
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=8000,
messages=[{
"role": "user",
"content": f"""Напиши холодное письмо с личным подходом.
ИНФОРМАЦИЯ О ЧЕЛОВЕКЕ (из Apollo и LinkedIn):
{json.dumps(prospect_data, ensure_ascii=False, indent=2)}
НАШ ПРОДУКТ: {your_product}
ЧЕМ ПОЛЕЗЕН: {your_value_prop}
ПРАВИЛА:
- Первое предложение ДОЛЖНО быть о них (не о нас)
- Связать их реальный контекст (должность, компания, публикации) с нашим продуктом
- Один чёткий вопрос в конце (не призыв «купить»)
- До 100 слов
Верни только JSON, без пояснений и без тройных обратных кавычек вокруг:
{{
"subject": "тема (до 50 символов)",
"opening": "первое личное предложение",
"value": "как наш продукт решает их конкретную проблему",
"question": "вопрос, на который легко ответить",
"personalization_source": "на чём основан личный подход"
}}"""
}]
)
return json.loads(text_of(response))Практика
Задача: собрать систему отбора потенциальных клиентов с оценкой от Claude
Что строим: скрипт, который принимает данные о потенциальном клиенте и выдаёт полную оценку и план работы с ним.
Без программирования. Вставь в чат Claude заметки о своём потенциальном клиенте и текст запроса из функции full_lead_analysis() ниже. Получишь ту же оценку и план, только без файла.
С кодом. Нужны Python, библиотека anthropic (pip install anthropic) и ключ API Anthropic в переменной окружения ANTHROPIC_API_KEY. Ключ создаётся в Claude Console (platform.claude.com) и оплачивается по токенам отдельно от подписки.
В запрос к Claude уходят имя, компания, должность и заметки, но не почта и телефон: лишних личных данных не отправляй. Если работаешь с данными настоящих клиентов, проверь, что это разрешают твоя политика конфиденциальности и законы твоей страны.
# lead_qualification_system.py
import anthropic
import json
from dataclasses import dataclass
from typing import Optional
client = anthropic.Anthropic()
def text_of(response) -> str:
"""Собирает текст ответа без блоков «размышления»."""
return "".join(block.text for block in response.content if block.type == "text")
@dataclass
class Lead:
name: str
company: str
position: str
email: str
phone: Optional[str] = None
source: str = "входящий"
notes: str = ""
interaction_log: str = ""
def full_lead_analysis(lead: Lead) -> dict:
"""
Полный разбор потенциального клиента: BANT + оценка готовности + план действий
"""
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=8000,
messages=[{
"role": "user",
"content": f"""Сделай полный разбор потенциального клиента для отдела продаж.
ПОТЕНЦИАЛЬНЫЙ КЛИЕНТ:
Имя: {lead.name}
Компания: {lead.company}
Должность: {lead.position}
Откуда пришёл: {lead.source}
Заметки менеджера: {lead.notes}
ИСТОРИЯ ОБЩЕНИЯ:
{lead.interaction_log or "Первый контакт, истории нет"}
Верни только JSON, без пояснений и без тройных обратных кавычек вокруг.
Вердикт: hot (горячий), warm (тёплый), cold (холодный) или disqualify (не наш клиент).
{{
"qualification": {{
"bant_score": число 0-12,
"readiness_score": число 0-100,
"verdict": "hot/warm/cold/disqualify",
"verdict_reason": "почему такой вердикт"
}},
"bant_details": {{
"budget": {{"score": 0-3, "evidence": "...", "gap": "что неизвестно"}},
"authority": {{"score": 0-3, "evidence": "...", "gap": "..."}},
"need": {{"score": 0-3, "evidence": "...", "gap": "..."}},
"timeline": {{"score": 0-3, "evidence": "...", "gap": "..."}}
}},
"persona_analysis": {{
"decision_role": "champion/decision_maker/influencer/blocker/user",
"communication_style": "аналитик/отношения/скорость/стабильность",
"main_motivation": "что движет этим человеком"
}},
"action_plan": {{
"next_24h": "конкретное действие",
"next_week": "план на неделю",
"key_questions": ["3 вопроса для следующей встречи"],
"risks": ["что может пойти не так"],
"win_conditions": ["что нужно, чтобы довести эту сделку до конца"]
}},
"suggested_followup_timing": {{
"if_interested": "через сколько дней писать",
"if_silent": "через сколько дней напомнить",
"max_attempts": число
}}
}}"""
}]
)
return json.loads(text_of(response))
def format_lead_report(lead: Lead, analysis: dict) -> str:
"""Оформляет понятный отчёт для менеджера"""
q = analysis["qualification"]
bant = analysis["bant_details"]
action = analysis["action_plan"]
verdict_emoji = {
"hot": "🔥", "warm": "☀️", "cold": "❄️", "disqualify": "🚫"
}.get(q["verdict"], "❓")
report = f"""
╔══════════════════════════════════════════════╗
║ РАЗБОР КЛИЕНТА: {lead.name[:27]:<27} ║
╚══════════════════════════════════════════════╝
{verdict_emoji} СТАТУС: {q['verdict'].upper()} ({q['readiness_score']}/100)
📊 Оценка BANT: {q['bant_score']}/12
💡 Причина: {q['verdict_reason']}
BANT ПОДРОБНО:
💰 Бюджет: {'█' * bant['budget']['score']}{'░' * (3-bant['budget']['score'])} ({bant['budget']['score']}/3) — {bant['budget']['evidence'][:60]}
👔 Полномочия: {'█' * bant['authority']['score']}{'░' * (3-bant['authority']['score'])} ({bant['authority']['score']}/3) — {bant['authority']['evidence'][:60]}
🎯 Потребность:{'█' * bant['need']['score']}{'░' * (3-bant['need']['score'])} ({bant['need']['score']}/3) — {bant['need']['evidence'][:60]}
⏰ Сроки: {'█' * bant['timeline']['score']}{'░' * (3-bant['timeline']['score'])} ({bant['timeline']['score']}/3) — {bant['timeline']['evidence'][:60]}
ПЛАН ДЕЙСТВИЙ:
⚡ Сегодня: {action['next_24h']}
📅 На неделе: {action['next_week']}
ВОПРОСЫ ДЛЯ СЛЕДУЮЩЕЙ ВСТРЕЧИ:
"""
for q_text in action['key_questions']:
report += f" • {q_text}\n"
report += f"""
РИСКИ:
"""
for risk in action['risks']:
report += f" ⚠️ {risk}\n"
return report
# ===== ТЕСТ (человек и компания выдуманы) =====
test_lead = Lead(
name="Сергей Новиков",
company="Группа компаний Алмаз",
position="Директор по операциям",
email="[почта клиента]",
source="входящий звонок",
notes="Позвонил сам, сказал, что видел нас на конференции. Спрашивал про связку с другими программами.",
interaction_log="""
14 мая (звонок, 25 мин):
Сергей — директор по операциям, у него 3 отдела, включая продажи (12 человек).
Проблема: менеджеры не заполняют CRM (программу учёта клиентов), заявки теряются.
Рассматривают решение «до конца второго квартала» — это их внутренний срок.
Бюджет: «в рамках разумного, детали с финансовым директором». IT-директор уже в курсе.
Попросил прислать коммерческое предложение и примеры похожих компаний.
Конкурент: смотрели Битрикс24, «не очень понравился интерфейс».
Следующий шаг: встреча с финансовым директором через неделю, если материалы понравятся.
"""
)
print("Разбираю клиента...")
analysis = full_lead_analysis(test_lead)
report = format_lead_report(test_lead, analysis)
print(report)
# Сохраняем в JSON для CRM
with open(f"lead_{test_lead.name.replace(' ', '_')}.json", "w", encoding="utf-8") as f:
json.dump({
"lead": {
"name": test_lead.name,
"company": test_lead.company,
"position": test_lead.position
},
"analysis": analysis
}, f, ensure_ascii=False, indent=2)
print("\n✅ Разбор сохранён в JSON")Запускаем:
python lead_qualification_system.pyИнструменты и ресурсы
- Apollo.io — база контактов и холодные письма (тарифы и лимиты смотри на сайте)
- HubSpot CRM — программа учёта клиентов, есть бесплатный тариф (платные тарифы смотри на сайте; см. урок библиотеки CRM на автопилоте)
- Lemlist / Instantly — сервисы для рассылки холодных писем
- Notion — чтобы хранить правила продаж
- Claude API — названия моделей в коде даны на октябрь 2026; актуальные цены и версии: Актуальное сейчас
Ключевые выводы
BANT — это не бюрократия, а скорость. Быстро понять «наш клиент или нет» — это уважение и к своему времени, и к времени клиента.
Личный подход больше не роскошь, а необходимость. Людям приходит много шаблонных писем, и одно личное письмо заметно сразу.
Самое ценное в AI для продаж не скорость письма, а системность. Claude разбирает сотого клиента так же тщательно, как первого. Люди устают, AI нет.
Следующий урок
Отметка хранится только в этом браузере и никуда не отправляется. Мой прогресс