Kommo + Height: современное управление проектами из выигранных сделок

Kommo + Height: современное управление проектами из выигранных сделок

Height — современный инструмент управления задачами и проектами ориентированный на инженерные и продуктовые команды: AI-автоматизация рутинных задач, гибкие workflow без жёстких ограничений, чистый UX. Позиционируется как альтернатива Linear для команд которым нужна большая гибкость чем Linear, но меньше overhead чем Jira. Нативной интеграции с Kommo нет — разбираем правильную архитектуру: Won -> автоматическое создание проекта и задач в Height; завершение задач -> Note в Kommo.

Height vs Linear vs Asana для команд рядом с CRM

ПараметрHeightLinearAsana
AI-автоматизация задачДа (нативная)ЧастичнаяЧерез Rules
Целевая аудиторияИнженеры + productИнженерыВсе команды
Гибкость workflowВысокаяСредняяВысокая
APIREST (OAuth 2.0)GraphQLREST
Ценаот $6.99/user/месот $8/user/месот $10.99/user/мес
Нативная KommoНетНетНет

Height выбирают tech-команды где delivery-процесс плотно связан с продажами: агентства, SaaS с custom-разработкой под клиента, IT-сервисные компании.

Архитектура: что синхронизируется

Kommo -> Height:
— Won -> создать List (проект) в Height с задачами по шаблону
— Изменение бюджета/дедлайна -> обновить Height project attributes
— Kommo Note -> Height task comment (для важных клиентских сообщений)

Height -> Kommo:
task.completed -> Note в Kommo: «Задача «{name}» выполнена»
list.completed (все задачи закрыты) -> смена этапа + Note: «Проект завершён»
task.created с флагом -> Task в Kommo (для менеджера по продажам)

Height REST API: аутентификация и базовые запросы

Height использует OAuth 2.0. Для server-side интеграции: Personal Access Token из Height -> Settings -> API. Base URL: https://api.height.app.

import requests

HEIGHT_TOKEN = "your_height_access_token"
HEIGHT_BASE  = "https://api.height.app"
HEIGHT_HEADERS = {
    "Authorization": f"api-key {HEIGHT_TOKEN}",
    "Content-Type":  "application/json",
}

def get_height_workspace() -> dict:
    resp = requests.get(
        f"{HEIGHT_BASE}/workspace",
        headers=HEIGHT_HEADERS,
    )
    resp.raise_for_status()
    return resp.json()

def create_height_list(name: str, description: str = "",
                        color: str = "blue") -> dict:
    # Создать List (проект/папку задач)
    payload = {
        "name":        name,
        "description": description,
        "color":       color,
        "type":        "list",
    }
    resp = requests.post(
        f"{HEIGHT_BASE}/lists",
        headers=HEIGHT_HEADERS,
        json=payload,
    )
    resp.raise_for_status()
    return resp.json()

def create_height_task(list_id: str, name: str,
                        description: str = "",
                        assignee_ids: list = None,
                        due_at: str = "") -> dict:
    # due_at формат: "2025-12-31T00:00:00.000Z"
    payload = {
        "name":        name,
        "description": description,
        "listIds":     [list_id],
        "assigneeIds": assignee_ids or [],
    }
    if due_at:
        payload["dueAt"] = due_at
    resp = requests.post(
        f"{HEIGHT_BASE}/tasks",
        headers=HEIGHT_HEADERS,
        json=payload,
    )
    resp.raise_for_status()
    return resp.json()

def add_task_comment(task_id: str, message: str) -> dict:
    resp = requests.post(
        f"{HEIGHT_BASE}/activities",
        headers=HEIGHT_HEADERS,
        json={"taskId": task_id, "message": message, "type": "comment"},
    )
    resp.raise_for_status()
    return resp.json()

Won -> создание проекта в Height

DELIVERY_TEMPLATE = [
    {"name": "Kickoff встреча с клиентом",      "days_offset": 3},
    {"name": "Техническое задание (ТЗ)",         "days_offset": 7},
    {"name": "Дизайн / прототип",               "days_offset": 14},
    {"name": "Разработка - итерация 1",          "days_offset": 28},
    {"name": "Тестирование и QA",               "days_offset": 35},
    {"name": "Сдача клиенту",                   "days_offset": 42},
]

from datetime import datetime, timezone, timedelta

def on_kommo_deal_won(lead: dict, contact: dict):
    deal_name  = lead.get("name", f"Deal #{lead['id']}")
    budget     = lead.get("price", 0)
    description = (
        f"Клиент: {contact.get('name', '')}\n"
        f"Бюджет: {budget}\n"
        f"Kommo deal ID: {lead['id']}"
    )

    height_list = create_height_list(
        name=f"[{deal_name}]",
        description=description,
        color="green",
    )
    list_id = height_list.get("id")

    now = datetime.now(timezone.utc)
    for tmpl in DELIVERY_TEMPLATE:
        due = (now + timedelta(days=tmpl["days_offset"])).strftime(
            "%Y-%m-%dT00:00:00.000Z"
        )
        create_height_task(
            list_id=list_id,
            name=tmpl["name"],
            due_at=due,
        )

    # Сохранить height_list_id в Kommo
    save_to_kommo_deal(lead["id"], {"height_list_id": list_id})
    create_kommo_note(
        lead["id"],
        f"Height: создан проект [{deal_name}] с {len(DELIVERY_TEMPLATE)} задачами",
    )

Height Webhooks -> Kommo

Height поддерживает webhooks через Settings -> Developer -> Webhooks.

@app.route("/webhooks/height", methods=["POST"])
def height_webhook():
    payload = request.json
    event   = payload.get("type", "")
    data    = payload.get("data", {})

    if event == "task.completed":
        task_name = data.get("task", {}).get("name", "")
        list_ids  = data.get("task", {}).get("listIds", [])

        for list_id in list_ids:
            lead_id = find_kommo_deal_by_custom_field("height_list_id", list_id)
            if lead_id:
                create_kommo_note(lead_id,
                    f"Height: задача «{task_name}» выполнена")
                break

    elif event == "list.completed":
        list_id = data.get("list", {}).get("id", "")
        lead_id = find_kommo_deal_by_custom_field("height_list_id", list_id)
        if lead_id:
            create_kommo_note(lead_id, "Height: все задачи по проекту выполнены")
            move_kommo_deal_to_stage(lead_id, DELIVERED_STAGE_ID)

    return "", 200

AI-автоматизация Height + Kommo

Height встраивает AI для автоматического создания подзадач из описания задачи. Для интеграции с Kommo: при создании проекта передавать детальное описание из Kommo Note -> Height AI разбивает его на подзадачи автоматически.

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

IT-агентство (EU, 12 человек, Kommo + Height):

  • До: Won -> менеджер вручную создавал проект в Height, копировал детали сделки, назначал задачи по шаблону. 30–40 минут. Если забывал — проект стартовал с задержкой.
  • После: Won -> Python webhook -> Height проект + 6 задач с дедлайнами за 3 секунды. task.completed -> Note в Kommo -> менеджер видит прогресс без входа в Height.
  • Дополнительно: при изменении бюджета сделки в Kommo -> автоматическое обновление описания проекта в Height через PATCH /lists/{id}.

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

  • IT-агентства и SaaS с custom-разработкой: Won -> старт delivery
  • Продуктовые компании где продажи и разработка используют разные инструменты
  • Команды которые перешли с Asana/Trello на Height и хотят сохранить связь с Kommo
  • Менеджеры по продажам которым нужна видимость прогресса проекта в CRM без входа в проектный инструмент

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

Height vs Linear — когда выбирать Height для интеграции с Kommo?

Linear ориентирован на software engineers с жёсткой Issue-based структурой. Height гибче — поддерживает произвольные списки задач, цветовые метки, любые workflow. Для агентств и сервисных компаний где проект = набор задач для клиента, Height удобнее. Для продуктовых компаний со строгим sprint-процессом — Linear подойдёт лучше.

Height поддерживает шаблоны проектов (Templates)?

Да. Height -> Templates позволяет создать List-шаблон с задачами. В API: POST /lists с templateId параметром создаёт List по шаблону. Для интеграции с Kommo это удобнее чем создавать задачи по массиву DELIVERY_TEMPLATE — шаблон редактируется в Height UI без изменений в коде интеграции.

Как синхронизировать ответственных (assignees) между Kommo и Height?

В Kommo у лида есть responsible_user_id. В Height — assigneeIds. Маппинг: {kommo_user_id: height_user_id} хранить в конфиге. Получить список Height пользователей: GET /users. Получить список Kommo пользователей: GET /users в Kommo API. Маппинг по email совпадению — если email совпадает, автоматически назначать.

Height webhook верификация — нужна ли?

Height отправляет заголовок X-Height-Signature с HMAC-SHA256 подписью (ключ из настроек webhook). Верификация рекомендована: hmac.new(secret.encode(), request.data, sha256).hexdigest(). Без верификации endpoint открыт для спуфинга — любой может отправить фейковое task.completed событие.

Итого

  • API: api-key {token} заголовок, base URL https://api.height.app
  • Won -> POST /lists (проект) + POST /tasks с шаблоном задач и дедлайнами
  • Webhook -> task.completed / list.completed -> Note в Kommo + смена этапа
  • Templates: используй Height шаблоны через templateId вместо hardcoded массива задач
  • Маппинг пользователей: по email между Kommo responsible_user и Height assignee

Если у вас агентство или SaaS с Kommo и вы хотите автоматически стартовать проект в Height после Won — опишите ваш шаблон задач. Exceltic.dev настроит интеграцию за 1–2 рабочих дня.

Ещё статьи

Все →