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 со следующими свойствами:
| Свойство | Тип | Назначение |
|---|---|---|
| Name | title | Название проекта / клиента |
| Status | select | Статус: Backlog, In Progress, Completed |
| Deal Value | number | Стоимость сделки (из Kommo) |
| Start Date | date | Дата закрытия сделки |
| Manager | rich_text | Имя ответственного менеджера |
| Kommo Lead ID | rich_text | ID сделки для обратной ссылки |
| Client Email | Email основного контакта |
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. Настроим под вашу структуру базы данных и воронки.