Суть урока
CRM — это кладбище данных, которые никто не вносит. Менеджер звонит, кивает, записывает на бумажку и забывает. В системе — пустые поля, устаревшие статусы, сделки зависшие в "переговорах" с 2022 года.
Claude превращает CRM из кладбища в живой организм: сам читает переписку, сам обновляет поля, сам пишет follow-up, сам видит кто готов купить прямо сейчас.
Ключевые концепции
- HubSpot MCP — Claude напрямую читает и пишет в HubSpot через инструменты
- Auto-fill CRM — письмо пришло → Claude извлёк данные → поля обновились сами
- AI Lead Scoring — оценка 0-100: кто готов купить, кто просто смотрит
- Follow-up автоматизация — клиент не ответил 3 дня → Claude сам пишет
- Pipeline automation — сделка застряла → Claude видит и предлагает план выхода
- Pipedrive как альтернатива — для тех кто предпочитает другой CRM
Теория
Проблема: почему CRM не работают
Многие CRM превращаются в дорогой блокнот. Менеджеры вносят данные только когда на них кричат. Результат:
- Руководитель не знает реальный статус сделок
- Лиды теряются — написал в пятницу, в понедельник забыл
- Нет аналитики, потому что нет данных
- Клиент получает одно и то же письмо трижды ("здравствуйте, мы не связались")
Традиционное решение — заставить менеджеров заполнять. Это не работает никогда.
HubSpot MCP: Claude как CRM-оператор
У HubSpot есть MCP-сервер, через который Claude работает с CRM. Какие действия доступны (только чтение или ещё и запись), зависит от версии сервера и выданных прав: смотри документацию HubSpot. При достаточных правах Claude может:
- Читать контакты — кто этот человек, история взаимодействий
- Обновлять поля — должность, бюджет, этап сделки
- Создавать задачи — "позвонить через 2 дня"
- Добавлять заметки — резюме разговора
- Двигать сделки — переносить между этапами пайплайна
Ключевое: рутину Claude делает сам, без участия менеджера. Важные шаги (перенос сделки на другой этап, письма клиентам) разумно оставлять на подтверждение человека.
# HubSpot через Claude + API
import os
import time
import anthropic
import requests
HUBSPOT_TOKEN = os.environ["HUBSPOT_ACCESS_TOKEN"]
def update_crm_from_email(email_text: str, contact_id: str):
client = anthropic.Anthropic()
# Шаг 1: Claude извлекает структурированные данные из письма
extraction = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=500,
messages=[{
"role": "user",
"content": f"""Извлеки из письма клиента следующие данные в JSON:
- contact_name: имя клиента
- company: компания
- interest: что конкретно интересует
- budget_hint: намёк на бюджет (если есть)
- next_step: что нужно сделать дальше
- urgency: срочность (low/medium/high)
Письмо: {email_text}
Верни только JSON, без пояснений."""
}]
)
import json
data = json.loads("".join(b.text for b in extraction.content if b.type == "text"))
# Шаг 2: Обновляем контакт в HubSpot
headers = {
"Authorization": f"Bearer {HUBSPOT_TOKEN}",
"Content-Type": "application/json"
}
# Обновляем свойства контакта.
# Поле notes_last_contacted HubSpot заполняет сам (только чтение), поэтому
# резюме письма сохраняем заметкой (см. практику ниже), а не в свойстве.
update_payload = {
"properties": {
"hs_lead_status": "IN_PROGRESS"
}
}
response = requests.patch(
f"https://api.hubapi.com/crm/v3/objects/contacts/{contact_id}",
headers=headers,
json=update_payload
)
# Шаг 3: Создаём задачу на follow-up если высокая срочность
if data.get("urgency") == "high":
task_payload = {
"properties": {
"hs_task_subject": f"Срочный follow-up: {data.get('contact_name')}",
"hs_timestamp": str(int(time.time() * 1000)), # срок задачи, обязательное поле
"hs_task_status": "NOT_STARTED",
"hs_task_priority": "HIGH",
"hubspot_owner_id": "owner_id_здесь"
}
}
requests.post(
"https://api.hubapi.com/crm/v3/objects/tasks",
headers=headers,
json=task_payload
)
return dataAI Lead Scoring: кто готов купить прямо сейчас
Не все лиды одинаковы. Один смотрит из любопытства, другой звонит потому что директор сказал "купи до конца квартала". Claude различает их по сигналам в переписке.
Сигналы высокой готовности:
- Спрашивает про конкретные сроки ("когда можно начать?")
- Упоминает конкурентов ("сравниваю вас с X")
- Задаёт вопросы про интеграцию ("у нас SAP, как подключить?")
- Называет бюджет или спрашивает про цены прямо
Сигналы низкой готовности:
- "Просто изучаем рынок"
- Нет конкретики по срокам
- Несколько недель не отвечает на письма
def score_lead(contact_history: str) -> dict:
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=300,
messages=[{
"role": "user",
"content": f"""Оцени готовность лида к покупке по шкале 0-100.
История взаимодействий:
{contact_history}
Верни JSON:
{{
"score": число от 0 до 100,
"reasoning": "краткое объяснение",
"recommended_action": "что делать прямо сейчас",
"hot_signals": ["список сигналов готовности"],
"risk_signals": ["список тревожных сигналов"]
}}"""
}]
)
import json
return json.loads("".join(b.text for b in response.content if b.type == "text"))
# Пример использования
history = """
- 15 апреля: первый звонок, спросили про функционал
- 18 апреля: прислали список требований
- 22 апреля: попросили демо
- 25 апреля: после демо спросили "какие минимальные сроки внедрения?"
- 28 апреля: написали "наш директор хочет встретиться на следующей неделе"
"""
result = score_lead(history)
# score: 87
# recommended_action: "Немедленно подтвердить встречу с директором, подготовить КП"Follow-up автоматизация: клиент не ответил
Самый частый сценарий потери сделки: клиент сказал "подумаю" — и тишина. Менеджер стесняется писать снова. Или забывает.
Claude пишет follow-up сам, через нужное время, с нужным тоном:
def generate_followup(
contact_name: str,
last_interaction: str,
days_since_contact: int,
deal_stage: str
) -> str:
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=400,
messages=[{
"role": "user",
"content": f"""Напиши follow-up письмо клиенту.
Контекст:
- Имя: {contact_name}
- Последний контакт: {last_interaction}
- Дней без ответа: {days_since_contact}
- Стадия сделки: {deal_stage}
Требования:
- Короткое (3-4 предложения)
- Не давящее, не умоляющее
- Добавь ценность (статья, инсайт, кейс)
- Один чёткий призыв к действию
- Русский язык, деловой но живой тон"""
}]
)
return "".join(b.text for b in response.content if b.type == "text")Pipeline Automation: сделка застряла
Сделки застревают. Это нормально. Ненормально — когда никто этого не видит месяцами.
Claude еженедельно сканирует пайплайн и находит "зомби-сделки":
def audit_pipeline(deals: list) -> list:
client = anthropic.Anthropic()
deals_text = "\n".join([
f"- {d['name']}: стадия '{d['stage']}', "
f"последнее действие {d['days_stale']} дней назад, "
f"сумма {d['amount']}"
for d in deals
])
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=800,
messages=[{
"role": "user",
"content": f"""Проанализируй пайплайн продаж и выдели проблемные сделки.
Сделки:
{deals_text}
Для каждой проблемной сделки (застряла >14 дней) дай:
1. Диагноз: почему застряла
2. План выхода: конкретные 2-3 шага
3. Рекомендацию: продолжать или закрыть как потерянную
Формат: список с заголовками по каждой сделке."""
}]
)
return "".join(b.text for b in response.content if b.type == "text")Pipedrive как альтернатива
Если HubSpot кажется дорогим или сложным — посмотри Pipedrive: он проще и заточен под продажи. Тарифы и наличие бесплатного плана проверяй на сайтах обоих сервисов.
| Параметр | HubSpot | Pipedrive |
|---|---|---|
| Бесплатный план | ✅ Есть (с ограничениями) | Смотри на сайте |
| MCP поддержка | ✅ Есть MCP-сервер | ⚠️ Проверь в документации, API доступен всегда |
| Цена | Смотри на hubspot.com | Смотри на pipedrive.com |
| Сложность | Высокая | Средняя |
| Лучше для | Маркетинг + продажи | Только продажи |
Pipedrive API очень простой — Claude легко с ним работает через стандартные HTTP запросы, даже без MCP.
Практика
Задача: настроить auto-update CRM при новом входящем письме
Что строим: Когда приходит письмо от клиента → Claude читает → сам обновляет карточку в HubSpot → создаёт задачу если нужно.
Шаг 1: Получить HubSpot API токен
На октябрь 2026 HubSpot отключает создание приложений старого типа (Private Apps): для новых аккаунтов с 28.09.2026, для существующих с 26.10.2026. Для интеграций «сервер — сервер» теперь рекомендован Service Key (на октябрь 2026 в публичной бете, создаётся через платформу разработчика HubSpot). Точные шаги в интерфейсе меняются, поэтому следуй актуальной документации на developers.hubspot.com. Если у тебя уже есть старое приложение, его токен работает так же: в заголовке Authorization: Bearer ....
- Создай Service Key (или используй существующий токен приложения) с правами (scopes):
crm.objects.contacts.read,crm.objects.contacts.write,crm.objects.deals.read,crm.objects.deals.write, а для заметок и задач ещё права на соответствующие объекты - Скопируй токен и сохрани в
.envфайл (никогда не коммить его в Git)
# .env
HUBSPOT_ACCESS_TOKEN=<токен из HubSpot>
ANTHROPIC_API_KEY=sk-ant-...Шаг 2: Создать скрипт обработки входящих писем
# email_processor.py
import os
import json
import time
import anthropic
import requests
from dotenv import load_dotenv
load_dotenv()
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
HUBSPOT_TOKEN = os.environ["HUBSPOT_ACCESS_TOKEN"]
def process_incoming_email(
email_from: str,
email_subject: str,
email_body: str
):
"""Обрабатывает входящее письмо и обновляет CRM"""
print(f"Обрабатываю письмо от: {email_from}")
# 1. Claude анализирует письмо
analysis = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=600,
messages=[{
"role": "user",
"content": f"""Проанализируй входящее письмо клиента.
Тема: {email_subject}
От: {email_from}
Текст: {email_body}
Верни JSON без дополнительного текста:
{{
"intent": "inquiry/complaint/purchase_ready/follow_up/other",
"summary": "краткое резюме в 1-2 предложения",
"key_points": ["список важных моментов"],
"urgency": "low/medium/high",
"sentiment": "positive/neutral/negative",
"next_action": "конкретное следующее действие",
"follow_up_days": число дней когда написать если нет ответа
}}"""
}]
)
data = json.loads("".join(b.text for b in analysis.content if b.type == "text"))
print(f"Анализ: {data['intent']}, срочность: {data['urgency']}")
# 2. Ищем контакт в HubSpot по email
headers = {
"Authorization": f"Bearer {HUBSPOT_TOKEN}",
"Content-Type": "application/json"
}
search_response = requests.post(
"https://api.hubapi.com/crm/v3/objects/contacts/search",
headers=headers,
json={
"filterGroups": [{
"filters": [{
"propertyName": "email",
"operator": "EQ",
"value": email_from
}]
}],
"properties": ["email", "firstname", "lastname", "hs_lead_status"]
}
)
contacts = search_response.json().get("results", [])
if contacts:
contact_id = contacts[0]["id"]
contact_name = (
contacts[0]["properties"].get("firstname", "") + " " +
contacts[0]["properties"].get("lastname", "")
).strip() or email_from
# 3. Обновляем контакт
update_response = requests.patch(
f"https://api.hubapi.com/crm/v3/objects/contacts/{contact_id}",
headers=headers,
json={
"properties": {
"hs_lead_status": "IN_PROGRESS" if data["intent"] == "purchase_ready" else "OPEN"
}
}
)
# 4. Добавляем заметку
note_response = requests.post(
"https://api.hubapi.com/crm/v3/objects/notes",
headers=headers,
json={
"properties": {
"hs_note_body": f"Email анализ:\n{data['summary']}\n\nКлючевые моменты:\n" +
"\n".join(f"• {p}" for p in data["key_points"]),
"hs_timestamp": str(int(time.time() * 1000))
},
"associations": [{
"to": {"id": contact_id},
"types": [{"associationCategory": "HUBSPOT_DEFINED", "associationTypeId": 202}]
}]
}
)
# 5. Создаём задачу если высокая срочность
if data["urgency"] == "high" or data["intent"] == "purchase_ready":
task_response = requests.post(
"https://api.hubapi.com/crm/v3/objects/tasks",
headers=headers,
json={
"properties": {
"hs_task_subject": f"[ГОРЯЧИЙ] Ответить: {contact_name} — {email_subject}",
"hs_timestamp": str(int(time.time() * 1000)),
"hs_task_status": "NOT_STARTED",
"hs_task_priority": "HIGH",
"hs_task_body": data["next_action"]
}
}
)
print(f"Создана срочная задача для {contact_name}")
print(f"CRM обновлён для {contact_name}")
return {"status": "updated", "contact": contact_name, "analysis": data}
else:
# Контакт не найден — создаём новый
print(f"Новый контакт: {email_from}")
create_response = requests.post(
"https://api.hubapi.com/crm/v3/objects/contacts",
headers=headers,
json={
"properties": {
"email": email_from,
"hs_lead_status": "NEW"
}
}
)
return {"status": "created", "contact": email_from, "analysis": data}
# Тест
if __name__ == "__main__":
result = process_incoming_email(
email_from="[email protected]",
email_subject="Хотим внедрить вашу систему",
email_body="""
Добрый день!
Мы рассматриваем несколько решений для автоматизации продаж.
Ваш продукт нас заинтересовал. У нас команда 15 менеджеров,
бюджет обсуждаем, хотелось бы начать уже в этом квартале.
Можем ли мы провести демо на следующей неделе?
Иван Петров, Директор по продажам
"""
)
print(json.dumps(result, ensure_ascii=False, indent=2))Шаг 3: Протестировать
python email_processor.pyШаг 4: Подключить к реальным письмам
Варианты интеграции:
- Gmail: Google Apps Script → вызывает ваш скрипт при новом письме
- Outlook: Power Automate → HTTP запрос → ваш endpoint
- Собственный почтовый сервер: hook при получении письма
- Webhook сервис: Zapier / n8n → следит за почтой → вызывает скрипт
⚠️ Письма клиентов содержат персональные данные. Отправляй в Claude только то, что нужно для задачи, и сверься с уроком Регулирование AI и соответствие требованиям.
Инструменты и ресурсы
- HubSpot — hubspot.com (есть бесплатный CRM для начала)
- HubSpot API документация — developers.hubspot.com
- Pipedrive — pipedrive.com (проще HubSpot, платный)
- python-dotenv — для безопасного хранения ключей
- Модели Claude — названия в коде даны на октябрь 2026; актуальные цены и версии: Актуальное сейчас
- n8n — для оркестрации без кода (урок n8n + AI)
- Zapier — для интеграции с Gmail/Outlook без программирования
Ключевые выводы
CRM умирает не от плохого ПО — от ручного ввода. Claude берёт на себя большую часть ручного ввода: читает письма, предлагает обновления полей, создаёт задачи. Менеджер фокусируется на разговорах с клиентами, не на заполнении карточек, а результат работы AI стоит выборочно проверять.
Lead scoring превращает интуицию в систему: вместо "кажется, этот готов" — конкретная оценка 87/100 с обоснованием и рекомендацией.
Самое важное: это работает не как замена менеджеров, а как их суперсила. Каждый менеджер получает AI-ассистента который никогда не устаёт и ничего не забывает.
Следующий урок
Отметка хранится только в этом браузере и никуда не отправляется. Мой прогресс