Kommo + GanttPRO: проект из выигранной сделки без ручного создания задач

Kommo + GanttPRO: проект из выигранной сделки без ручного создания задач

Когда сделка переходит в «Выиграно», интеграция Kommo и GanttPRO автоматически создаёт проект по шаблону: название клиента, сроки из сделки, ответственные из карточки. Менеджер не открывает GanttPRO вручную, PM не ждёт письма от продаж.

GanttPRO - инструмент управления проектами с диаграммой Ганта, популярный среди агентств, IT-компаний и сервисного B2B. Разрыв между продажами (Kommo) и доставкой (GanttPRO) - классическая проблема: проект создаётся с задержкой, данные о клиенте переносятся вручную, сроки из контракта не попадают в задачи автоматически.

В проектах по интеграции Kommo для сервисных компаний мы видим одну и ту же точку боли: при переходе сделки в «Выиграно» PM получает письмо или сообщение в мессенджере с описанием клиента, а дальше вручную создаёт проект в GanttPRO - копирует название, бюджет, дедлайн, назначает исполнителей. При 8-15 новых проектах в месяц это занимает несколько часов в неделю и регулярно приводит к ошибкам: неправильные сроки, пропущенные поля, задержка старта на 1-3 дня. Кастомный webhook, который срабатывает на смену статуса в воронке Kommo, полностью убирает эту ручную точку. Ниже - архитектура и детали реализации.

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

GanttPRO не имеет готовой интеграции с Kommo. Zapier-коннектор для GanttPRO существует, но поддерживает только базовые действия: создать задачу, обновить статус. Создать полноценный проект по шаблону с иерархией задач, milestone, ресурсами и зависимостями - через Zapier нельзя.

Дополнительная проблема: GanttPRO работает с понятием «шаблон проекта» - набором задач с относительными дедлайнами («задача A начинается через 3 дня после старта проекта»). Zapier не умеет использовать шаблоны - он создаёт только одиночные задачи с фиксированными датами. При 10-20 задачах в проекте это означает 10-20 отдельных Zapier-шагов и плату за каждый.

Синхронизация в обратную сторону (обновление дедлайна в GanttPRO -> уведомление в Kommo) через Zapier невозможна вообще - GanttPRO не поддерживает триггер на изменение задачи в стандартном Zapier-коннекторе.

Что реализовывается - архитектура решения

Kommo (сделка -> «Выиграно»)
        |
        v
  Сервер-оркестратор:
  - читает данные сделки (название, сумма, клиент, сроки, ответственный)
  - определяет шаблон проекта по типу сделки
        |
        v
  GanttPRO API:
  - создать проект из шаблона
  - установить дату старта
  - назначить ответственных на задачи
  - добавить клиента как stakeholder
        |
        v
  Kommo API:
  - записать ganttpro_project_id в поле сделки
  - добавить заметку со ссылкой на проект

  ---

GanttPRO (задача просрочена / milestone достигнут)
        |
        v
  GanttPRO Webhook -> Сервер
        |
        v
  Kommo API:
  - добавить заметку в сделку
  - если просрочена ключевая задача -> задача для менеджера

Основная ценность - использование шаблонов GanttPRO. Вместо создания задач по одной, API создаёт проект из готового шаблона, который PM настроил заранее под конкретный тип работ.

Технические детали

GanttPRO API v1 использует JWT-токен для аутентификации. Токен генерируется в Account Settings -> API. Основные эндпоинты для интеграции: POST /projects (создать проект), POST /projects/{id}/from-template (создать из шаблона), GET /projects/{id}/tasks (получить задачи). Webhook для уведомлений настраивается через API или в разделе Integrations интерфейса.

import requests
from datetime import datetime, timedelta
from flask import Flask, request, jsonify

app = Flask(__name__)

GANTTPRO_API_BASE = "https://api.ganttpro.com/v1"
GANTTPRO_TOKEN = "your_ganttpro_jwt_token"

# Маппинг типов сделок на шаблоны GanttPRO
DEAL_TYPE_TO_TEMPLATE = {
    "website": "tmpl_website_development",
    "integration": "tmpl_integration_project",
    "audit": "tmpl_seo_audit",
    "default": "tmpl_generic_project"
}

def create_project_from_deal(deal_data: dict) -> dict:
    headers = {
        "Authorization": f"Bearer {GANTTPRO_TOKEN}",
        "Content-Type": "application/json"
    }
    
    deal_type = deal_data.get("deal_type", "default")
    template_id = DEAL_TYPE_TO_TEMPLATE.get(deal_type, DEAL_TYPE_TO_TEMPLATE["default"])
    
    # Дата старта - завтра от даты закрытия сделки
    start_date = (datetime.now() + timedelta(days=1)).strftime("%Y-%m-%d")
    
    # Дедлайн из поля сделки или +90 дней
    deadline_field = deal_data.get("project_deadline")
    if deadline_field:
        end_date = deadline_field
    else:
        end_date = (datetime.now() + timedelta(days=90)).strftime("%Y-%m-%d")
    
    payload = {
        "templateId": template_id,
        "name": f"{deal_data['company_name']} - {deal_data['deal_name']}",
        "startDate": start_date,
        "endDate": end_date,
        "description": f"Kommo deal #{deal_data['lead_id']}. Budget: {deal_data['price']} {deal_data.get('currency', 'USD')}",
        "members": [
            {
                "email": deal_data["responsible_email"],
                "role": "manager"
            }
        ]
    }
    
    resp = requests.post(
        f"{GANTTPRO_API_BASE}/projects/from-template",
        json=payload,
        headers=headers
    )
    resp.raise_for_status()
    return resp.json()

@app.route("/kommo/webhook", methods=["POST"])
def kommo_webhook():
    data = request.json
    # Событие: сделка перешла в «Выиграно» (lost = false, status = success)
    for lead_update in data.get("leads", {}).get("status", []):
        if lead_update.get("pipeline_id") and lead_update.get("status_id") == WON_STATUS_ID:
            handle_won_deal(lead_update["id"])
    return jsonify({"ok": True})

def handle_won_deal(lead_id: int):
    lead = kommo_api.get_lead(lead_id)
    contact = kommo_api.get_lead_contact(lead_id)
    responsible = kommo_api.get_user(lead.get("responsible_user_id"))
    
    deal_data = {
        "lead_id": lead_id,
        "deal_name": lead["name"],
        "company_name": lead.get("company_name", "Client"),
        "price": lead.get("price", 0),
        "currency": lead.get("custom_fields", {}).get("currency", "USD"),
        "deal_type": lead.get("custom_fields", {}).get("deal_type", "default"),
        "project_deadline": lead.get("custom_fields", {}).get("project_deadline"),
        "responsible_email": responsible.get("email", "")
    }
    
    project = create_project_from_deal(deal_data)
    project_id = project["id"]
    project_url = f"https://app.ganttpro.com/projects/{project_id}"
    
    kommo_api.update_lead(lead_id, {"ganttpro_project_id": str(project_id)})
    kommo_api.add_note(
        lead_id,
        f"GanttPRO проект создан: {project_url}\n"
        f"Шаблон: {deal_data['deal_type']}\n"
        f"Дедлайн: {deal_data.get('project_deadline', 'не указан')}"
    )

Пошаговая реализация

Шаг 1. Создайте шаблоны проектов в GanttPRO

Подготовьте шаблоны под каждый тип ваших проектов. Важно: используйте относительные даты в задачах («начало через N дней после старта проекта»), а не абсолютные. Это позволит системе правильно распределить задачи при любой дате старта. Запишите ID каждого шаблона.

Шаг 2. Добавьте кастомные поля в Kommo

Необходимые поля: deal_type (список: website/integration/audit/…), project_deadline (дата), ganttpro_project_id (текст), ganttpro_project_url (ссылка). Поле deal_type заполняется при создании сделки или квалификации.

Шаг 3. Настройте webhook Kommo на «Выиграно»

Кommo отправляет webhook при смене статуса сделки. Нужно отфильтровать именно переход в статус «Выиграно» (pipeline_id + status_id соответствующего этапа). Это делается на стороне сервера-обработчика.

Шаг 4. Настройте обратные уведомления

В GanttPRO настройте webhook на событие просрочки задачи и завершения milestone. При получении webhook сервер находит сделку по ganttpro_project_id и добавляет заметку в Kommo.

Шаг 5. Тестирование на реальных сделках

Создайте тестовую сделку с заполненными полями deal_type и project_deadline. Переведите в «Выиграно» и проверьте: создался ли проект в GanttPRO, правильно ли заполнены дедлайны задач, добавлена ли заметка в Kommo.

Реальный кейс с цифрами

IT-интегратор из Варшавы, команда 25 человек, 8-12 новых проектов в месяц. До интеграции процесс передачи от продаж к PM выглядел так:

  • Менеджер отправлял письмо PM с описанием проекта
  • PM создавал проект в GanttPRO вручную, копируя данные из письма
  • Средняя задержка от «Выиграно» до создания проекта: 1-3 рабочих дня
  • 30-40% данных из сделки не попадали в GanttPRO (бюджет, конкретные требования из кастомных полей Kommo)

После интеграции Kommo + GanttPRO через Exceltic.dev:

  • Проект создаётся автоматически в течение 30 секунд после «Выиграно»
  • PM получает уведомление через GanttPRO и видит уже заполненный проект
  • Задержка передачи: 0
  • Данные из сделки в проекте: 100%

Время PM на создание проекта: с 45-60 минут до 10-15 минут (только проверка и уточнение деталей).

Подробнее о настройке воронки в Kommo CRM для сервисного B2B - в отдельном материале.

Для кого подходит

Интеграция Kommo + GanttPRO актуальна для:

  • Агентств и IT-компаний, где продажи закрываются в CRM, а реализация идёт в проектном инструменте
  • Команд с 5+ проектами в месяц, где ручное создание стало узким местом
  • Компаний с типовыми проектами - когда структура задач повторяется и можно использовать шаблоны
  • Компаний с PM-командой отдельно от продаж - интеграция устраняет информационный разрыв при передаче клиента

Если проекты уникальные по структуре и не поддаются шаблонизации - рассмотрите интеграцию Kommo + Notion или Kommo + ClickUp, где больше гибкости в создании структуры задач.

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

GanttPRO поддерживает API для создания проектов из шаблона?

Да. GanttPRO API v1 поддерживает создание проектов из шаблонов, управление задачами, назначение ресурсов и webhook-уведомления. Документация доступна на help.ganttpro.com/en/articles/API. API доступен на тарифах Team и выше.

Как интеграция обрабатывает случай, когда в Kommo нет всех нужных данных?

Сервер проверяет обязательные поля перед созданием проекта. Если deal_type не заполнен - используется шаблон по умолчанию. Если project_deadline отсутствует - дедлайн проекта устанавливается через 90 дней от даты создания. Менеджер получает заметку в Kommo с указанием какие поля не были заполнены - это сигнал для уточнения данных у клиента.

Можно ли синхронизировать статус проекта обратно в Kommo?

Да. При завершении проекта в GanttPRO (все задачи закрыты) webhook обновляет кастомное поле сделки в Kommo («Проект завершён») и может автоматически создать задачу для менеджера: «Запросить отзыв у клиента» или перевести сделку в специальный статус для upsell-работы.

Что если PM меняет сроки проекта в GanttPRO - как это отражается в Kommo?

Если настроить webhook на событие изменения дедлайна ключевой задачи или milestone в GanttPRO - сервер добавляет заметку в Kommo о переносе сроков. Это даёт менеджеру возможность уведомить клиента без того, чтобы следить за GanttPRO самостоятельно. Обо всех кастомных интеграциях в Kommo для управления проектами - подробнее в нашем материале.

Сколько стоит разработка интеграции Kommo + GanttPRO?

Базовый вариант (создание проекта из шаблона при выигрыше сделки + заметка в Kommo) - 2-3 недели. С обратной синхронизацией (просрочки, завершение, изменение сроков) - 3-4 недели. Оцениваем после разбора вашей структуры проектов и типов сделок.


Если разрыв между продажами в Kommo и управлением проектами в GanttPRO отнимает время вашей команды - опишите задачу команде Exceltic.dev. Разберём архитектуру и оценим объём работ.

Ещё статьи

Все →