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-обработчик.