Kommo + Trello: автоматическое создание задач из выигранных сделок без Zapier

Kommo + Trello: автоматическое создание задач из выигранных сделок без Zapier

Трелло — простейший канбан для операционных команд. Без интеграции с Kommo продажи закрывают сделку и пишут в общий чат «новый клиент, займитесь онбордингом» — карточка в Trello создаётся вручную, данные копируются, ничего не связано. С интеграцией Won в Kommo мгновенно создаёт Trello-карточку с полными данными клиента в нужном списке, а когда команда завершает онбординг — это отражается в карточке сделки.

Почему нативная интеграция через Zapier не устраивает

Zapier-связка Kommo -> Trello работает, но имеет ограничения:
— Задержка 5–15 минут (polling-интервал бесплатного тарифа)
— Нельзя передать данные из кастомных полей Kommo без платного тарифа Zapier ($49+/мес)
— Нельзя создать checklists и labels программно
— Обратная связь (Trello -> Kommo) — отдельный Zap

Кастомная интеграция устраняет эти ограничения: карточка создаётся за секунды, включает все нужные поля и checklist, а события в Trello мгновенно попадают в историю сделки.

Аналогично интеграции Kommo + Jira для dev-команд — Trello закрывает ту же задачу для операционных команд без Jira.

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

Kommo -> Trello:
— Won -> создать карточку в списке «Новые клиенты» с именем, email, тарифом, суммой
— Won -> добавить checklist онбординга к карточке
— Won -> назначить карточку на ответственного (по маппингу менеджер Kommo -> участник Trello)

Trello -> Kommo:
— Карточка перемещена в «Done» -> Note: «Trello: онбординг завершён»
— Комментарий добавлен к карточке -> Note в сделку
— Карточка заархивирована -> Note: «Trello: карточка закрыта»

Архитектура

Kommo Webhook: сделка перешла в Won
  ↓ Backend
  1. GET /api/v4/leads/{id} + contacts
     -> email, имя, тариф, сумма, ответственный менеджер
  2. Trello API: POST /cards
     -> idList = список «Новые клиенты» на доске онбординга
     -> name = «{client_name} - {plan}»
     -> desc = «Email: {email}\nСумма: {amount}\nKommo: {deal_link}»
  3. Trello API: POST /cards/{card_id}/checklists
     -> шаблонный checklist онбординга
  4. Trello API: POST /cards/{card_id}/members
     -> idMember = Trello-участник по маппингу менеджера
  5. Kommo: PATCH /leads/{id}
     -> кастомное поле trello_card_id = card_id
  6. Kommo: POST /leads/{id}/notes
     -> «Trello: карточка создана - онбординг запущен»

Trello Webhook: updateCard (listAfter = Done)
  ↓ Backend
  1. Найти сделку по trello_card_id
  2. Kommo: POST /leads/{deal_id}/notes
     -> «Trello: онбординг завершён (карточка перемещена в Done)»

Trello API: ключевые запросы

Base URL: https://api.trello.com/1/.
Аутентификация: query params key и token.
Получить ключ: Trello -> Developer Settings -> Power-Ups.
Получить токен: https://trello.com/1/authorize?expiration=never&scope=read,write&response_type=token&key={api_key}.

Создать карточку:

import requests

TRELLO_API_KEY = "your_api_key"
TRELLO_TOKEN = "your_token"
TRELLO_LIST_ID = "id_of_new_clients_list"

BASE_URL = "https://api.trello.com/1"

def trello_params(**kwargs) -> dict:
    return {"key": TRELLO_API_KEY, "token": TRELLO_TOKEN, **kwargs}

def create_trello_card(name: str, description: str, list_id: str, label_ids: list = None) -> dict:
    params = trello_params(
        name=name,
        desc=description,
        idList=list_id,
    )
    if label_ids:
        params["idLabels"] = ",".join(label_ids)
    resp = requests.post(f"{BASE_URL}/cards", params=params)
    resp.raise_for_status()
    return resp.json()

def add_checklist(card_id: str, checklist_name: str, items: list) -> dict:
    resp = requests.post(
        f"{BASE_URL}/cards/{card_id}/checklists",
        params=trello_params(name=checklist_name)
    )
    resp.raise_for_status()
    checklist_id = resp.json()["id"]

    for item in items:
        requests.post(
            f"{BASE_URL}/checklists/{checklist_id}/checkItems",
            params=trello_params(name=item)
        )
    return resp.json()

def assign_member(card_id: str, member_id: str) -> None:
    requests.post(
        f"{BASE_URL}/cards/{card_id}/idMembers",
        params=trello_params(value=member_id)
    )

ONBOARDING_CHECKLIST = [
    "Отправить welcome-письмо",
    "Провести вводный звонок",
    "Настроить доступы",
    "Провести обучение команды",
    "Получить подтверждение запуска",
]

MANAGER_TO_TRELLO = {
    "alice@company.com": "trello_member_id_alice",
    "bob@company.com":   "trello_member_id_bob",
}

def on_deal_won(lead: dict, contact: dict):
    name = contact["name"]
    email = get_contact_email(contact)
    plan = get_custom_field(lead, PLAN_FIELD_ID) or "Starter"
    amount = lead.get("price", 0)
    manager_email = get_manager_email(lead)
    deal_link = f"https://your-domain.kommo.com/leads/detail/{lead['id']}"

    desc = (
        f"**Email:** {email}\n"
        f"**Тариф:** {plan}\n"
        f"**Сумма:** ${amount}\n"
        f"**Kommo:** {deal_link}"
    )

    card = create_trello_card(
        name=f"{name} - {plan}",
        description=desc,
        list_id=TRELLO_LIST_ID
    )
    card_id = card["id"]

    add_checklist(card_id, "Онбординг", ONBOARDING_CHECKLIST)

    trello_member = MANAGER_TO_TRELLO.get(manager_email)
    if trello_member:
        assign_member(card_id, trello_member)

    update_kommo_deal(lead["id"], {"trello_card_id": card_id})
    create_kommo_note(lead["id"],
        f"Trello: карточка создана для {name}, список «Новые клиенты»")

Регистрация Trello Webhook:

def register_trello_webhook(callback_url: str, model_id: str) -> dict:
    # model_id = id доски или конкретной карточки
    resp = requests.post(
        f"{BASE_URL}/webhooks",
        params=trello_params(
            callbackURL=callback_url,
            idModel=model_id,
            description="Kommo integration"
        )
    )
    resp.raise_for_status()
    return resp.json()

Обработка Trello Webhook:

from flask import Flask, request

app = Flask(__name__)

@app.route("/webhooks/trello", methods=["HEAD", "POST"])
def trello_webhook():
    if request.method == "HEAD":
        return "", 200  # Trello верифицирует endpoint через HEAD

    payload = request.json
    action_type = payload.get("action", {}).get("type")
    action_data = payload.get("action", {}).get("data", {})

    if action_type == "updateCard":
        card_id = action_data.get("card", {}).get("id")
        list_after = action_data.get("listAfter", {}).get("name", "")

        deal_id = find_deal_by_field("trello_card_id", card_id)
        if not deal_id:
            return "", 200

        if list_after.lower() in ["done", "завершено", "completed"]:
            create_kommo_note(deal_id,
                "Trello: онбординг завершён - карточка перемещена в Done")

    elif action_type == "commentCard":
        card_id = action_data.get("card", {}).get("id")
        comment_text = action_data.get("text", "")
        author = payload.get("action", {}).get("memberCreator", {}).get("fullName", "")

        deal_id = find_deal_by_field("trello_card_id", card_id)
        if deal_id:
            create_kommo_note(deal_id,
                f"Trello (комментарий от {author}): {comment_text}")

    return "", 200

Trello Webhook верификации нет — защита через секретный URL. Trello проверяет endpoint через HEAD-запрос при регистрации — важно обрабатывать оба метода.

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

SaaS (EU, 40–50 новых клиентов в месяц, продажи в Kommo, онбординг через Trello):

  • До: менеджер по продажам писал в Slack «новый Won, займитесь онбордингом». Customer Success искал данные в Kommo, создавал карточку в Trello вручную. Иногда терял. Задержка онбординга — 4–24 часа.
  • После: Won -> карточка Trello с чеклистом за 3 секунды. CS видит нового клиента без ожидания. Первый контакт — в течение часа.
  • Дополнительно: при перемещении в Done — Note в Kommo, менеджер по продажам видит что CS завершил онбординг без звонка.

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

  • Команды, где продажи в Kommo, а операционная работа в Trello
  • Онбординг, delivery, поддержка — все в Trello, нужна связь с CRM
  • 20–100 новых клиентов в месяц — при большем объёме лучше рассмотреть Jira или ClickUp
  • Малые и средние команды без Jira — Trello проще и дешевле для операций

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

Trello vs ClickUp для интеграции с Kommo?

Kommo + ClickUp интеграция даёт более гибкую структуру (подзадачи, зависимости, time tracking). Trello проще в настройке и обслуживании. Если команда уже в Trello и процессы работают — не переезжать ради интеграции.

Как получить ID нужного списка в Trello?

GET /boards/{board_id}/lists?key={key}&token={token} — возвращает все списки с ID и именами. Board ID виден в URL доски: trello.com/b/{board_id}/board-name. Сохраните нужный list ID в конфиге.

Trello Webhook: как убедиться что он работает?

При регистрации Trello делает HEAD-запрос на ваш URL. Если URL не отвечает 200 — webhook не создаётся. Проверить активные webhooks: GET /webhooks?key={key}&token={token}. Webhook автоматически удаляется если endpoint отвечает 410 три раза подряд.

Как добавить labels к карточке?

Сначала получить ID лейблов доски: GET /boards/{board_id}/labels. Затем передать в idLabels при создании карточки. Удобно делать маппинг: тариф Kommo -> цвет лейбла Trello (green = Starter, yellow = Growth, red = Scale).

Итого

  • Trello API: key + token как query params, https://api.trello.com/1/
  • Создать карточку: POST /cards, чеклист: POST /cards/{id}/checklists
  • Webhook регистрация: POST /webhooks с idModel = board_id
  • HEAD-метод на webhook endpoint — обязателен, Trello верифицирует при регистрации
  • Хранить trello_card_id в кастомном поле Kommo для обратного поиска
  • Ключевые события: updateCard (listAfter) и commentCard

Если вы хотите связать Kommo-сделки с Trello-онбордингом — опишите структуру вашей доски и этапы воронки. Exceltic.dev настроит маппинг и webhook-обработчик.

Ещё статьи

Все →