Kommo + Wrike: автоматическое создание проектов из выигранных сделок
Wrike — enterprise-платформа управления проектами: шаблоны папок, зависимости задач, time tracking, resource management, Gantt-chart. Для команд, где продажи ведутся в Kommo, а delivery и customer success — в Wrike, отсутствие синхронизации означает ручное создание проекта при каждом Won и ручное обновление CRM при завершении работ. Кастомная интеграция устраняет оба шага: Won -> проект создан; проект завершён -> Kommo обновлён.
Wrike vs Jira, Asana, Monday для delivery-интеграции
| Платформа | Сильная сторона | Интеграция с Kommo |
|---|---|---|
| Wrike | Enterprise, Gantt, resource mgmt | REST API + Webhook |
| Jira | Dev-команды, Agile | REST API v3, ADF |
| Asana | Простота, шаблоны | REST API |
| Monday | Визуальность, GraphQL | GraphQL API |
Wrike выбирают при enterprise-требованиях: множественные зависимости, resource load balancing, детальная отчётность по времени для клиентских проектов.
Что синхронизируется
Kommo -> Wrike:
— Won -> создать папку-проект из шаблона с именем клиента
— Won -> добавить кастомные поля в папку (тариф, сумма, дата начала)
— Won -> назначить ответственного (по маппингу менеджер Kommo -> член Wrike)
— Won -> создать набор задач из стандартного onboarding-шаблона
Wrike -> Kommo:
— Задача переведена в Completed -> Note в сделку: «Wrike: {task} завершена»
— Папка-проект переведена в статус Completed -> Note + смена этапа в Kommo
— Комментарий к задаче -> Note в сделку (если содержит маркер @kommo)
Архитектура
Kommo Webhook: сделка перешла в Won
↓ Backend
1. GET /api/v4/leads/{id} + contacts
-> клиент, тариф, сумма, ответственный
2. Wrike API: POST /folders/{space_id}/folders
-> создать папку из sharedIds (blueprint/template)
-> title = "Онбординг: {client_name}"
3. Wrike API: PUT /folders/{folder_id}
-> customFields: тариф, сумма, kommo_deal_id
4. Wrike API: POST /folders/{folder_id}/tasks (для каждой задачи онбординга)
5. Kommo: PATCH /leads/{id}
-> кастомное поле wrike_folder_id = folder_id
6. Kommo: POST /leads/{id}/notes
-> «Wrike: проект создан, папка {folder_id}»
Wrike Webhook: task status -> Completed
↓ Backend
1. Из payload: taskId, folderId, status
2. Найти сделку по wrike_folder_id
3. Kommo: POST /notes -> «Wrike: задача "{title}" завершена»
Wrike API: ключевые запросы
Base URL: https://www.wrike.com/api/v4/.
Аутентификация: Bearer token (Permanent Access Token из Wrike Settings -> Apps & Integrations -> API).
import requests
WRIKE_TOKEN = "your_permanent_access_token"
WRIKE_BASE_URL = "https://www.wrike.com/api/v4"
WRIKE_SPACE_ID = "IEAABCDE" # ID пространства (Space) - из URL
headers = {
"Authorization": f"Bearer {WRIKE_TOKEN}",
"Content-Type": "application/json"
}
def create_project_folder(parent_folder_id: str, title: str,
blueprint_id: str = None) -> dict:
payload = {"title": title}
if blueprint_id:
# Создать из шаблона (Blueprint)
payload["copyDescendants"] = True
payload["copyWorkflow"] = True
resp = requests.post(
f"{WRIKE_BASE_URL}/folders/{blueprint_id}/copy",
headers=headers,
json={"parent": parent_folder_id, "title": title}
)
else:
resp = requests.post(
f"{WRIKE_BASE_URL}/folders/{parent_folder_id}/folders",
headers=headers,
json=payload
)
resp.raise_for_status()
return resp.json()["data"][0]
def set_custom_fields(folder_id: str, custom_fields: list) -> None:
# custom_fields: [{"id": "IEABCFID", "value": "Growth"}]
resp = requests.put(
f"{WRIKE_BASE_URL}/folders/{folder_id}",
headers=headers,
json={"customFields": custom_fields}
)
resp.raise_for_status()
def create_task(folder_id: str, title: str,
assignee_id: str = None, due_date: str = None) -> dict:
payload = {"title": title}
if assignee_id:
payload["responsibles"] = [assignee_id]
if due_date:
payload["dates"] = {"due": due_date}
resp = requests.post(
f"{WRIKE_BASE_URL}/folders/{folder_id}/tasks",
headers=headers,
json=payload
)
resp.raise_for_status()
return resp.json()["data"][0]
ONBOARDING_TASKS = [
"Вводный звонок с клиентом",
"Настройка доступов",
"Миграция данных",
"Обучение команды",
"Приёмка и подписание акта",
]
MANAGER_TO_WRIKE = {
"alice@company.com": "WRIKE_USER_ID_ALICE",
"bob@company.com": "WRIKE_USER_ID_BOB",
}
def on_deal_won(lead: dict, contact: dict):
client_name = contact["name"]
plan = get_custom_field(lead, PLAN_FIELD_ID) or "Starter"
amount = lead.get("price", 0)
manager_email = get_manager_email(lead)
folder = create_project_folder(
parent_folder_id=WRIKE_ONBOARDING_SPACE_ID,
title=f"Онбординг: {client_name}",
blueprint_id=WRIKE_ONBOARDING_BLUEPRINT_ID # None если без шаблона
)
folder_id = folder["id"]
set_custom_fields(folder_id, [
{"id": WRIKE_FIELD_PLAN, "value": plan},
{"id": WRIKE_FIELD_AMOUNT, "value": str(amount)},
{"id": WRIKE_FIELD_DEAL_ID, "value": str(lead["id"])},
])
assignee = MANAGER_TO_WRIKE.get(manager_email)
for task_title in ONBOARDING_TASKS:
create_task(folder_id, task_title, assignee_id=assignee)
update_kommo_deal(lead["id"], {"wrike_folder_id": folder_id})
create_kommo_note(lead["id"],
f"Wrike: проект «Онбординг: {client_name}» создан")
Регистрация Wrike Webhook:
def register_wrike_webhook(account_id: str, hook_url: str, events: list) -> dict:
resp = requests.post(
f"{WRIKE_BASE_URL}/webhooks",
headers=headers,
json={
"accountId": account_id,
"hookUrl": hook_url,
"events": events # ["TaskStatusChanged", "FolderStatusChanged", "CommentAdded"]
}
)
resp.raise_for_status()
return resp.json()["data"][0]
Обработка Wrike Webhook:
from flask import Flask, request
app = Flask(__name__)
@app.route("/webhooks/wrike", methods=["POST"])
def wrike_webhook():
events = request.json # Wrike присылает массив событий
for event in events:
event_type = event.get("Type")
folder_id = event.get("FolderId") or event.get("ParentFolderId")
deal_id = find_deal_by_field("wrike_folder_id", folder_id)
if not deal_id:
continue
if event_type == "TaskStatusChanged":
task_id = event.get("TaskId")
new_status = event.get("NewValue") # "Completed", "In Progress" etc.
if new_status == "Completed":
task_title = get_wrike_task_title(task_id)
create_kommo_note(deal_id,
f"Wrike: задача «{task_title}» завершена")
elif event_type == "FolderStatusChanged":
new_status = event.get("NewValue")
if new_status == "Completed":
update_kommo_deal(deal_id, {"stage_id": STAGE_DELIVERY_DONE})
create_kommo_note(deal_id,
"Wrike: проект завершён - клиент передан в support")
return "", 200
Blueprints: создание из шаблона
Wrike Blueprint (шаблон) — папка с задачами, зависимостями и ролями. При копировании (POST /folders/{blueprint_id}/copy) Wrike создаёт полную структуру с задачами. Это мощнее ручного создания задач через API — все зависимости и статусы наследуются.
Blueprint ID найти: Wrike UI -> нужная шаблонная папка -> URL содержит IEAXXXXX — это и есть ID.
Реальный кейс
IT-консалтинг (EU, 15–20 проектов в месяц, Kommo + Wrike):
- До: менеджер по продажам закрывал сделку -> писал в Slack project-менеджеру -> тот создавал проект в Wrike вручную (15–20 минут на настройку). Project-менеджер не обновлял Kommo — CRM не знал о прогрессе.
- После: Won -> проект из Blueprint создан за 10 секунд. Все задачи, зависимости, назначения — из шаблона. При завершении milestone -> Note в Kommo. Менеджер видит прогресс без переключения систем.
- Дополнительно:
FolderStatusChanged -> Completed-> смена этапа Kommo «Проект завершён» -> триггер NPS-опроса клиенту.
Для кого актуально
- Агентства и консалтинг с Wrike как основным PM-инструментом
- SaaS с enterprise onboarding — длинные проекты с зависимостями задач
- Команды, которым нужен resource planning и time tracking по клиентским проектам
- 10+ параллельных проектов — при меньшем объёме Trello или Notion достаточно
Часто задаваемые вопросы
Wrike Permanent Token vs OAuth — что выбрать для интеграции?
Permanent Access Token проще: создаётся в Wrike Settings -> API, не истекает. OAuth нужен только если интеграция работает от имени разных пользователей (мультитенант). Для одного аккаунта — Permanent Token.
Wrike Blueprint — в каком тарифе доступен?
Blueprint доступен с тарифа Business ($24.80/пользователь/мес и выше). На бесплатном и Professional — создавать из шаблона через API нельзя, только ручное создание задач.
Как получить ID пространства (Space) в Wrike?
GET /spaces — возвращает список Space с ID. Или из URL: wrike.com/workspace.htm#path=folder&id=IEABCDE — IEABCDE и есть folder/space ID. Space ID и Folder ID в Wrike — одного формата.
Wrike поддерживает вложенные папки и зависимости через API?
Да. Вложенные папки: POST /folders/{parent_id}/folders. Зависимости задач: POST /tasks/{id}/dependencies с указанием predecessor, successor и типа зависимости (FS, FF, SS, SF).
Итого
- Wrike API: Bearer token (Permanent),
https://www.wrike.com/api/v4/ - Создать папку из Blueprint:
POST /folders/{blueprint_id}/copy - Создать задачу:
POST /folders/{folder_id}/tasks - Webhook:
POST /webhooks— событияTaskStatusChanged,FolderStatusChanged - Хранить
wrike_folder_idв кастомном поле Kommo для обратного поиска - Blueprint (Business+) — самый быстрый способ создать полный проект из шаблона
Если вы используете Wrike и Kommo и хотите автоматизировать создание проектов при Won — опишите структуру вашего шаблона. Exceltic.dev настроит интеграцию с Blueprint и обработку webhook.