Библиотека · Маркетинг, продажи и аналитика на AI

CRM на автопилоте — HubSpot + AI, сделки без менеджера

Строитель65 минОбновлено: октябрь 2026
67 из 105 в библиотеке

Время: ~25 мин теории + 40 мин практики


Суть урока

CRM — это кладбище данных, которые никто не вносит. Менеджер звонит, кивает, записывает на бумажку и забывает. В системе — пустые поля, устаревшие статусы, сделки зависшие в "переговорах" с 2022 года.

Claude превращает CRM из кладбища в живой организм: сам читает переписку, сам обновляет поля, сам пишет follow-up, сам видит кто готов купить прямо сейчас.

🎨 Образ: Представь идеального ассистента, который сидит рядом с каждым менеджером 24/7. Слушает каждый разговор, сам заполняет карточку клиента, сам ставит напоминание через 3 дня, сам предлагает что сказать, если клиент молчит. Вот что делает Claude + HubSpot MCP.


Ключевые концепции

  • 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 делает сам, без участия менеджера. Важные шаги (перенос сделки на другой этап, письма клиентам) разумно оставлять на подтверждение человека.

python
# 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 data

AI Lead Scoring: кто готов купить прямо сейчас

Не все лиды одинаковы. Один смотрит из любопытства, другой звонит потому что директор сказал "купи до конца квартала". Claude различает их по сигналам в переписке.

Сигналы высокой готовности:

  • Спрашивает про конкретные сроки ("когда можно начать?")
  • Упоминает конкурентов ("сравниваю вас с X")
  • Задаёт вопросы про интеграцию ("у нас SAP, как подключить?")
  • Называет бюджет или спрашивает про цены прямо

Сигналы низкой готовности:

  • "Просто изучаем рынок"
  • Нет конкретики по срокам
  • Несколько недель не отвечает на письма
python
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: "Немедленно подтвердить встречу с директором, подготовить КП"

🎨 Образ: Это как опытный продажник, который за 30 секунд видит "этот купит" или "этот просто тратит наше время". Только AI делает это для всех 500 лидов одновременно и не ошибается из-за настроения. Ошибаться он всё равно может, поэтому время от времени проверяй его оценки.

Follow-up автоматизация: клиент не ответил

Самый частый сценарий потери сделки: клиент сказал "подумаю" — и тишина. Менеджер стесняется писать снова. Или забывает.

Claude пишет follow-up сам, через нужное время, с нужным тоном:

python
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 еженедельно сканирует пайплайн и находит "зомби-сделки":

python
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 ....

  1. Создай Service Key (или используй существующий токен приложения) с правами (scopes): crm.objects.contacts.read, crm.objects.contacts.write, crm.objects.deals.read, crm.objects.deals.write, а для заметок и задач ещё права на соответствующие объекты
  2. Скопируй токен и сохрани в .env файл (никогда не коммить его в Git)
bash
# .env
HUBSPOT_ACCESS_TOKEN=<токен из HubSpot>
ANTHROPIC_API_KEY=sk-ant-...

Шаг 2: Создать скрипт обработки входящих писем

python
# 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="ivan@company.ru",
        email_subject="Хотим внедрить вашу систему",
        email_body="""
        Добрый день!

        Мы рассматриваем несколько решений для автоматизации продаж.
        Ваш продукт нас заинтересовал. У нас команда 15 менеджеров,
        бюджет обсуждаем, хотелось бы начать уже в этом квартале.

        Можем ли мы провести демо на следующей неделе?

        Иван Петров, Директор по продажам
        """
    )
    print(json.dumps(result, ensure_ascii=False, indent=2))

Шаг 3: Протестировать

bash
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-ассистента который никогда не устаёт и ничего не забывает.


Следующий урок

→ SEO-машина — полный стек с Claude Code

Отметка хранится только в этом браузере и никуда не отправляется. Мой прогресс