Kommo + Monday.com: автоматическое создание проектов из выигранных сделок

Kommo + Monday.com: автоматическое создание проектов из выигранных сделок

Monday.com использует GraphQL API — не REST. Это важно для архитектуры интеграции: все запросы идут на один endpoint https://api.monday.com/v2, тело — JSON с полем query. Связка с Kommo автоматизирует операционный момент: сделка Won -> item в нужном board с именем клиента, суммой и дедлайном -> по мере выполнения статус возвращается в Kommo.

Kommo + Monday.com vs Kommo + Asana: когда что выбирать

Оба инструмента закрывают задачу «создать проект из CRM-сделки». Выбор зависит от того, как команда работает с задачами:

| Параметр | Monday.com | Asana |
|—|—|—|—|
| API | GraphQL | REST |
| Шаблоны | Board Templates | Project Templates |
| Визуализация | Board / Timeline / Map | Board / List / Timeline |
| Экосистема | 200+ интеграций | 300+ интеграций |
| Цена (Basic) | $9/мес/польз. | $10.99/мес/польз. |

Monday выигрывает по гибкости board-структуры и визуализации. Для команд, которые уже используют Monday — выбор очевиден. Аналогичная интеграция с Asana и Kommo реализована через REST API.

Что синхронизируется

Kommo -> Monday.com:
— Название сделки -> item name
— Имя и email контакта -> текстовые колонки
— Сумма сделки -> колонка типа Numbers
— Дедлайн из кастомного поля -> колонка типа Date
— ID сделки Kommo -> колонка для обратной трассировки
— Ответственный менеджер -> колонка People (по маппингу)

Monday.com -> Kommo:
— Смена статуса item на «Delivered» / «Done» -> обновление этапа в Kommo
— Дата завершения -> Note на сделке

Архитектура

Kommo Webhook: сделка Won
  ↓ Backend
  1. GET /api/v4/leads/{id} + contacts
     -> имя клиента, email, сумма, дедлайн, менеджер
  2. Monday.com GraphQL: create_item mutation
     -> board_id + item_name + column_values
     -> получить item_id
  3. Kommo: PATCH /leads/{id}
     -> обновить поле monday_item_id

Monday.com Webhook: column_values_updated (статус -> Done)
  ↓ Backend
  1. Извлечь item_id из payload
  2. Monday.com GraphQL: items query
     -> найти колонку с kommo_deal_id
  3. Kommo: PATCH /leads/{deal_id}
     -> этап -> 'Доставлено'
  4. Kommo: POST /notes
     -> дата завершения + ссылка на item

Monday.com GraphQL API: ключевые запросы

Monday.com API работает через POST на https://api.monday.com/v2. Аутентификация — API Token в заголовке Authorization.

Создание item с данными сделки:

import requests
import json

MONDAY_TOKEN = 'your_api_token'
BOARD_ID = 1234567890  # ID board'а в Monday.com

headers = {
    'Authorization': MONDAY_TOKEN,
    'Content-Type': 'application/json'
}

def create_monday_item(deal_name, client_email, amount, deadline_str, kommo_deal_id):
    # column_values - JSON-строка, ключи - ID колонок
    column_values = {
        'text_email': client_email,           # колонка типа Text
        'numbers_amount': amount,             # колонка типа Numbers
        'date_deadline': {'date': deadline_str},  # 'YYYY-MM-DD'
        'text_deal_id': str(kommo_deal_id),   # для обратной трассировки
        'status': {'label': 'In Progress'}   # статус
    }

    query = '''
    mutation ($boardId: ID!, $itemName: String!, $columnValues: JSON!) {
        create_item(
            board_id: $boardId,
            item_name: $itemName,
            column_values: $columnValues
        ) {
            id
            name
        }
    }
    '''

    variables = {
        'boardId': BOARD_ID,
        'itemName': deal_name,
        'columnValues': json.dumps(column_values)
    }

    response = requests.post(
        'https://api.monday.com/v2',
        headers=headers,
        json={'query': query, 'variables': variables}
    )
    data = response.json()
    return data['data']['create_item']['id']

Получение ID колонок board’а:

def get_board_columns(board_id):
    query = '''
    query ($boardId: [ID!]) {
        boards(ids: $boardId) {
            columns {
                id
                title
                type
            }
        }
    }
    '''
    response = requests.post(
        'https://api.monday.com/v2',
        headers=headers,
        json={'query': query, 'variables': {'boardId': [board_id]}}
    )
    return response.json()['data']['boards'][0]['columns']

Регистрация webhook в Monday.com:

def create_monday_webhook(board_id, callback_url):
    mutation = '''
    mutation ($boardId: ID!, $url: String!, $event: WebhookEventType!) {
        create_webhook(
            board_id: $boardId,
            url: $url,
            event: $event
        ) {
            id
            board_id
        }
    }
    '''
    requests.post(
        'https://api.monday.com/v2',
        headers=headers,
        json={
            'query': mutation,
            'variables': {
                'boardId': board_id,
                'url': callback_url,
                'event': 'change_status_column_value'  # или change_column_value
            }
        }
    )

Маппинг менеджера Kommo -> People в Monday.com

Монday.com People-колонка принимает ID пользователей Monday. Нужен маппинг:

# Маппинг Kommo user_id -> Monday.com user_id
OWNER_MAP = {
    12345: 67890123,  # Kommo ID -> Monday user ID
    12346: 67890124,
}

def get_monday_user_id(kommo_owner_id):
    return OWNER_MAP.get(kommo_owner_id)

# В column_values:
'people_owner': {'personsAndTeams': [{'id': monday_user_id, 'kind': 'person'}]}

ID пользователей Monday.com получаются через запрос query { users { id name email } }.

Создание из шаблона (Board Template)

Для сложных проектов вместо создания item’а лучше создавать целый board из шаблона:

def create_board_from_template(deal_name, template_id, folder_id=None):
    mutation = '''
    mutation ($name: String!, $templateId: ID!) {
        duplicate_board(
            board_id: $templateId,
            duplicate_type: duplicate_board_with_pulses_and_updates,
            board_name: $name
        ) {
            board {
                id
                name
            }
        }
    }
    '''
    response = requests.post(
        'https://api.monday.com/v2',
        headers=headers,
        json={'query': mutation, 'variables': {'name': deal_name, 'templateId': template_id}}
    )
    return response.json()['data']['duplicate_board']['board']['id']

Этот подход используют когда каждый клиент получает отдельный board — например, для агентств с индивидуальными проектами.

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

Маркетинговое агентство (EU-рынок, 10–15 клиентов одновременно, команда 12 человек):

  • До: менеджер по продажам выигрывал сделку в Kommo, отправлял письмо head of delivery с данными клиента. Тот вручную создавал board в Monday.com. Среднее время от Won до старта проекта — 2 дня.
  • После: Won в Kommo -> через минуту в Monday.com готов board из шаблона с именем клиента, суммой и дедлайном -> ссылка на board появляется в карточке Kommo -> delivery команда начинает работу сразу.
  • Дополнительный эффект: руководитель видит все активные клиентские проекты в одном Monday.com Portfolio view — без дополнительных статус-апдейтов от менеджеров.

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

  • Monday.com используется для управления проектами, Kommo — для продаж
  • Есть разрыв между закрытием сделки и стартом проекта — данные передаются вручную
  • Команда delivery и команда продаж работают в разных инструментах
  • Объём: 5+ новых проектов в месяц
  • Нужна трассировка: в каком проекте что происходит — видно в Kommo без перехода в Monday.com

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

Monday.com GraphQL — сложнее ли чем REST API?

GraphQL отличается структурой запросов, но не сложнее. Один endpoint, тело — строка с query/mutation. Основная сложность — правильно сформировать column_values JSON: ключи должны совпадать с ID колонок конкретного board’а. ID колонок получаются отдельным запросом к API или из URL в интерфейсе Monday.com.

Как узнать ID колонок без программирования?

В Monday.com: открыть board -> любой item -> через три точки на колонке -> Copy column ID. Или через GraphQL-запрос boards { columns { id title } } — возвращает все колонки board’а с ID и типами.

Нужен ли специальный API-план Monday.com?

API доступен на всех платных тарифах (Basic и выше). На Basic-плане — 100,000 запросов/мин. Для типового объёма интеграции с Kommo этого более чем достаточно. Webhooks доступны на Standard и выше.

Можно ли создавать подзадачи (subitems) автоматически?

Да. Monday.com API поддерживает create_subitem mutation: create_subitem(parent_item_id: ID!, item_name: String!, column_values: JSON!). Используется когда из сделки нужно создать структуру: item-проект с subitems-задачами (дизайн, разработка, QA, запуск).

Как обработать отмену проекта (сделка перешла в Lost)?

Через Kommo Webhook на событие смены этапа: если новый этап — «Потеряна» -> обновить статус item’а в Monday.com через change_column_value mutation. Или заархивировать board если проект так и не начался.

Итого

  • Monday.com API — GraphQL, endpoint https://api.monday.com/v2, аутентификация через API Token
  • Создание item: create_item mutation с board_id, item_name, column_values (JSON-строка с ID колонок)
  • Webhook на смену статуса -> обновление этапа в Kommo
  • Для агентств: duplicate_board mutation создаёт board из шаблона на каждого клиента
  • Типовой срок разработки — 2–3 недели

Если вы используете Monday.com и Kommo и хотите автоматизировать передачу сделок в delivery — опишите структуру вашего board’а и какие данные сделки нужны. Exceltic.dev разберёт маппинг колонок и предложит архитектуру.

Ещё статьи

Все →