Kommo + Notion: автоматический проект в базе данных при закрытии сделки

Mомент закрытия сделки в Kommo - это точка передачи от продаж к команде доставки. Именно здесь чаще всего теряется контекст: менеджер закрыл сделку, но project manager в Notion создаёт проект вручную, переспрашивает детали по Slack и тратит первый день онбординга на сбор информации, которая уже есть в CRM.

Notion - популярный инструмент для управления проектами в командах разработки, консалтинга и digital agencies. Если ваши продажи ведутся в Kommo, а проекты трекируются в Notion - разрыв между закрытием сделки и стартом проекта неизбежен без автоматизации.

В этой статье покажем, как при переходе сделки в статус «Успешно реализовано» в Kommo автоматически создавать страницу проекта в Notion Database со всеми нужными полями: название клиента, стоимость, контакт, ответственный менеджер, дата старта.

Почему нет нативной интеграции

Notion не имеет официальной интеграции с Kommo. В Notion Gallery интеграций есть Slack, Figma, GitHub и несколько других - CRM-систем не представлено. Zapier поддерживает и Kommo, и Notion, но цепочка Zapier ненадёжна для передачи структурированных данных: нет контроля типов, нет обработки ошибок, нет идемпотентности.

Notion API в 2025 году получил поддержку webhook-подписок для отслеживания изменений в базах данных. Это открыло возможность полноценной двусторонней интеграции: Kommo -> Notion при закрытии сделки и Notion -> Kommo при обновлении статуса проекта.

Подготовка: структура Notion Database

Создайте базу данных «Проекты» в Notion со следующими свойствами:

СвойствоТипНазначение
NametitleНазвание проекта / клиента
StatusselectСтатус: Backlog, In Progress, Completed
Deal ValuenumberСтоимость сделки (из Kommo)
Start DatedateДата закрытия сделки
Managerrich_textИмя ответственного менеджера
Kommo Lead IDrich_textID сделки для обратной ссылки
Client EmailemailEmail основного контакта

ID базы данных - 32-символьная строка из URL страницы в Notion: notion.so/workspace/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX?v=...

Реализация

Шаг 1 - обработка Kommo webhook при закрытии сделки:

from flask import Flask, request
import requests

app = Flask(__name__)

NOTION_TOKEN = "secret_..."   # Internal Integration Token из Notion Developers
NOTION_DB_ID = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"  # ID вашей базы «Проекты»
NOTION_BASE  = "https://api.notion.com/v1"

KOMMO_DOMAIN = "yourdomain.kommo.com"
KOMMO_TOKEN  = "your_kommo_token"
KOMMO_BASE   = f"https://{KOMMO_DOMAIN}/api/v4"

KOMMO_WON_STATUS = 142  # «Успешно реализовано» в Kommo (стандартный ID)

def notion_headers():
    return {
        "Authorization":  f"Bearer {NOTION_TOKEN}",
        "Content-Type":   "application/json",
        "Notion-Version": "2022-06-28"
    }

@app.route("/kommo/webhook", methods=["POST"])
def kommo_webhook():
    data = request.json
    leads = data.get("leads", {})
    for items in leads.get("status_changed", []):
        if items.get("status_id") == KOMMO_WON_STATUS:
            handle_deal_won(items.get("id"))
    return "ok", 200

Шаг 2 - получить детали сделки из Kommo:

def get_lead_details(lead_id: int) -> dict:
    hs = requests.Session()
    hs.headers.update({
        "Authorization": f"Bearer {KOMMO_TOKEN}",
        "Content-Type":  "application/json"
    })

    r = hs.get(f"{KOMMO_BASE}/leads/{lead_id}",
               params={"with": "contacts,responsible_user"})
    lead = r.json()

    # Имя ответственного менеджера
    responsible_id = lead.get("responsible_user_id")
    r2 = hs.get(f"{KOMMO_BASE}/users/{responsible_id}")
    manager_name = r2.json().get("name", "") if r2.status_code == 200 else ""

    # Email основного контакта
    contacts = lead.get("_embedded", {}).get("contacts", [])
    client_email = ""
    client_name  = ""
    if contacts:
        c = contacts[0]
        client_name = c.get("name", "")
        for field in c.get("custom_fields_values") or []:
            if field.get("field_type") == "EMAIL":
                vals = field.get("values", [])
                if vals:
                    client_email = vals[0].get("value", "")
                    break

    import datetime
    return {
        "lead_id":     lead_id,
        "name":        lead.get("name", ""),
        "deal_value":  lead.get("price", 0),
        "manager":     manager_name,
        "client_email": client_email,
        "client_name":  client_name,
        "start_date":   datetime.date.today().isoformat(),
    }

Шаг 3 - создать страницу в Notion Database:

def create_notion_project(details: dict) -> str:
    """Create project page in Notion Database. Returns Notion page ID."""
    n = requests.Session()
    n.headers.update(notion_headers())

    project_name = (
        f"{details['client_name']} - {details['name']}"
        if details["client_name"] else details["name"]
    )

    payload = {
        "parent":     {"database_id": NOTION_DB_ID},
        "properties": {
            "Name": {
                "title": [{"text": {"content": project_name}}]
            },
            "Status": {
                "select": {"name": "Backlog"}
            },
            "Deal Value": {
                "number": details["deal_value"]
            },
            "Start Date": {
                "date": {"start": details["start_date"]}
            },
            "Manager": {
                "rich_text": [{"text": {"content": details["manager"]}}]
            },
            "Kommo Lead ID": {
                "rich_text": [{"text": {"content": str(details["lead_id"])}}]
            },
            "Client Email": {
                "email": details["client_email"] or None
            }
        }
    }

    r = n.post(f"{NOTION_BASE}/pages", json=payload)
    r.raise_for_status()
    return r.json()["id"]

def handle_deal_won(lead_id: int):
    details    = get_lead_details(lead_id)
    notion_id  = create_notion_project(details)

    # Сохраняем ссылку на Notion-страницу обратно в Kommo
    notion_url = f"https://notion.so/{notion_id.replace('-', '')}"

    hs = requests.Session()
    hs.headers.update({
        "Authorization": f"Bearer {KOMMO_TOKEN}",
        "Content-Type":  "application/json"
    })
    hs.post(f"{KOMMO_BASE}/leads/notes", json=[{
        "entity_id": lead_id,
        "note_type":  "common",
        "params":     {"text": f"Проект создан в Notion: {notion_url}"}
    }])

Обратная синхронизация: Notion -> Kommo

C 2025 года Notion поддерживает webhook-подписки через API. Подписываемся на изменения свойств страниц в базе «Проекты»:

def setup_notion_webhook(endpoint_url: str) -> str:
    """Register Notion webhook for project database changes."""
    n = requests.Session()
    n.headers.update(notion_headers())

    r = n.post(f"{NOTION_BASE}/webhooks", json={
        "url":    endpoint_url,
        "filter": {
            "type":        "database_id",
            "database_id": NOTION_DB_ID
        },
        "events": ["page.updated"]
    })
    return r.json().get("id", "")

@app.route("/notion/webhook", methods=["POST"])
def notion_webhook():
    event   = request.json
    page_id = event.get("page_id", "")
    if not page_id:
        return "ok", 200

    # Получаем актуальные свойства страницы
    n = requests.Session()
    n.headers.update(notion_headers())
    r = n.get(f"{NOTION_BASE}/pages/{page_id}")
    page = r.json()
    props = page.get("properties", {})

    # Извлекаем Kommo Lead ID
    lead_texts = props.get("Kommo Lead ID", {}).get("rich_text", [])
    if not lead_texts:
        return "ok", 200
    lead_id = lead_texts[0].get("plain_text", "")

    # Текущий статус проекта
    status = props.get("Status", {}).get("select", {}).get("name", "")

    # Создаём заметку в Kommo о смене статуса
    hs = requests.Session()
    hs.headers.update({
        "Authorization": f"Bearer {KOMMO_TOKEN}",
        "Content-Type":  "application/json"
    })
    hs.post(f"{KOMMO_BASE}/leads/notes", json=[{
        "entity_id": int(lead_id),
        "note_type":  "common",
        "params":     {"text": f"Notion проект: статус изменён на '{status}'"}
    }])
    return "ok", 200

Реальный кейс

Digital-агентство: 15-20 закрытых сделок в месяц, проекты ведутся в Notion. До интеграции: PM тратил 30-60 минут на каждый новый проект - запрашивал данные у менеджера, создавал страницу, добавлял поля. Ошибки в названиях клиентов и суммах приходилось исправлять.

После интеграции:

  • Страница в Notion создаётся автоматически через 2-3 секунды после закрытия сделки
  • Все данные из Kommo (клиент, сумма, менеджер) заполнены корректно
  • PM получает уведомление в Notion и сразу начинает планирование
  • Ссылка на Notion-проект сохраняется в Kommo для обратного поиска

Время разработки: 1 день. Критический кейс - обработка дублей при повторных webhook-событиях (решается проверкой по Kommo Lead ID перед созданием).

Для кого актуально

Agencies, консалтинговые компании, команды разработки - все, кто ведёт продажи в Kommo и проекты в Notion. Ключевой индикатор: у вас есть чёткий момент передачи сделки от продаж к доставке.

Аналогичная интеграция для проектного менеджмента описана в Kommo + Rocketlane - там специализированная платформа для клиентского онбординга - и Kommo + GanttPRO для gantt-based планирования.

Часто задаваемые вопросы

Какие Notion тарифы поддерживают API и webhooks?

Notion API доступен на всех тарифах включая Free (с ограничением на количество API-запросов). Webhooks доступны на платных планах (Plus и выше). Для командной работы минимальный тариф - Plus ($8/user/month по состоянию на 2026 год).

Как избежать дублей если webhook отправлен несколько раз?

Добавьте проверку перед созданием: сделайте запрос к Notion Database с фильтром Kommo Lead ID = {lead_id}. Если страница уже существует - пропускаем создание. Это делает операцию идемпотентной. Notion API поддерживает фильтры через POST /v1/databases/{id}/query.

Можно ли создавать подстраницы или шаблоны в Notion через API?

Да. Notion API поддерживает POST /v1/blocks для создания блоков контента (текст, заголовки, списки) внутри страницы. Для создания из шаблона - шаблоны в Notion не экспортируются через API напрямую, но можно дублировать существующую страницу через POST /v1/pages с нужной структурой блоков.

Как связать несколько сделок с одним Notion-проектом?

Если один клиент имеет несколько сделок в Kommo, которые нужно вести в одном Notion-проекте - добавьте логику поиска существующего проекта по email клиента или названию компании перед созданием нового. При нахождении - обновляем свойства существующего проекта через PATCH /v1/pages/{id}.

Итог

Kommo + Notion интеграция закрывает разрыв между продажами и доставкой. Схема:

  • Kommo webhook status_changed со статусом won -> POST /v1/pages в Notion Database
  • Данные сделки (клиент, сумма, менеджер, дата) заполняют свойства страницы
  • Ссылка на Notion-проект сохраняется в Kommo как заметка
  • (Опционально) Notion webhook page.updated -> заметка в Kommo о смене статуса

Если ваша команда закрывает сделки в Kommo и ведёт проекты в Notion - опишите задачу команде Exceltic.dev. Настроим под вашу структуру базы данных и воронки.

Ещё статьи

Все →