Интеграция Trello и n8n: карточки, webhooks и защита от дублей ¶
Обновлено: 2026-05-30
Импортируйте JSON в n8n, замените credentials, URL API, project/list IDs, поля и лимиты под вашу инфраструктуру.
Проблема: Trello легко использовать как простую kanban-доску, но автоматизация “создать карточку на каждый webhook” быстро даёт дубли, неправильные lists и описания без контекста.
Решение: Настройте n8n как слой синхронизации: нормализуйте входное событие, соберите external_id, найдите существующую карточку, обновите labels/checklist и только потом создавайте новую карточку в нужном list.
Проблема: почему простая интеграция создаёт дубли и ручной хаос ¶
Trello часто подключают к формам, CRM, почте и Telegram как лёгкий операционный слой. Боль появляется после первых повторных событий: клиент дважды отправил форму, письмо пришло в треде, статус в CRM изменился повторно, а на доске появились две одинаковые карточки.
Для команды важны не только title и description. Нужны board, list, labels, due date, checklist, assignee, ссылка на исходную сущность и машинный ключ дедупликации. Если эти поля лежат только в тексте карточки, автоматизация продаж, поддержки или контента быстро превращается в ручную сортировку.
Архитектура workflow для n8n ¶
| Блок | Задача | Production-проверка |
|---|---|---|
| Webhook event | принимает заявку, письмо или событие из внешней системы | source, entity_id, event_type |
| Normalize Trello fields | готовит name, desc, due, labels и checklist | валидный due date и обязательный external_id |
| Find existing card | ищет карточку по external_id в desc или custom field | поиск выполняется до create |
| Create or update card | создаёт карточку или обновляет найденную | idList, labels, members, checklist |
| Add checklist/comment | фиксирует историю и следующие шаги | без секретов и PII в комментариях |
| Respond / alert | возвращает статус или отправляет ошибку | понятный 200, alert и DLQ |
Если Trello используется как production-доска, external_id лучше хранить в Custom Fields или в первой строке description в формате, который можно найти API-запросом. Так карточка переживает ручные изменения названия.
Контракт входных данных ¶
{
"source": "support_form",
"event_type": "new_request",
"entity_id": "ticket-4821",
"title": "Проверить заявку клиента по интеграции",
"description": "Клиент просит настроить передачу заявок в CRM без дублей",
"board_id": "64f000000000000000000001",
"list_id": "64f000000000000000000010",
"labels": [
"support",
"crm",
"high-priority"
],
"due_date": "2026-06-04T12:00:00.000Z",
"checklist": [
"Проверить payload",
"Назначить ответственного",
"Ответить клиенту"
],
"source_url": "https://crm.example.ru/tickets/4821"
}Минимальный контракт: source, entity_id, title и list_id. Labels, due date и checklist повышают пользу карточки, но не должны заменять ключ дедупликации.
Code Node: нормализация, mapping и guard-условия ¶
const src = $json.body ?? $json;
const source = String(src.source ?? 'external').trim().toLowerCase();
const entityId = String(src.entity_id ?? src.id ?? '').trim();
if (!entityId) throw new Error('No entity_id for Trello card sync');
const title = String(src.title ?? '').trim();
if (title.length < 5) throw new Error('Trello card title is too short');
const due = String(src.due_date ?? '').trim();
if (due && Number.isNaN(Date.parse(due))) throw new Error(`Invalid Trello due date: ${due}`);
const labels = Array.isArray(src.labels) ? src.labels.slice(0, 8).map(String) : [];
const checklist = Array.isArray(src.checklist) ? src.checklist.map(String).filter(Boolean) : [];
const externalId = `trello-sync:${source}:${entityId}`;
return [{ json: {
external_id: externalId,
trello: {
idList: src.list_id,
name: title.slice(0, 160),
desc: `[external_id:${externalId}]
${String(src.description ?? '').trim()}
Source: ${src.source_url ?? ''}`,
due: due || null,
labels,
checklist
},
search_query: externalId,
source_url: src.source_url ?? '',
received_at: new Date().toISOString()
}}];
Почему external_id лучше, чем поиск по названию
Название карточки люди меняют вручную. External ID стабилен и позволяет безопасно обновлять одну карточку при повторных webhook-событиях, даже если заголовок уже отредактирован менеджером.
Готовый workflow JSON: скачать и импортировать ¶
Скачать готовый workflow JSON Скачать тестовый payload
{
"name": "Nodbot - Trello card sync with dedupe",
"nodes": [
{
"name": "Webhook Trello event",
"type": "n8n-nodes-base.webhook",
"purpose": "Принять событие"
},
{
"name": "Normalize Trello fields",
"type": "n8n-nodes-base.code",
"purpose": "Подготовить card payload"
},
{
"name": "Find existing card",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Найти карточку по external_id"
},
{
"name": "Create or update card",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Создать или обновить карточку"
},
{
"name": "Add checklist/comment",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Добавить checklist и историю"
},
{
"name": "Respond",
"type": "n8n-nodes-base.respondToWebhook",
"purpose": "Вернуть статус"
}
],
"connections": "Webhook Trello event → Normalize Trello fields → Find existing card → Create or update card → Add checklist/comment → Respond"
}
Пошаговая настройка связки ¶
- Создайте отдельный board/list для production-сценария и выпишите idList.
- Импортируйте workflow JSON и замените Trello API key/token или credential.
- Настройте поиск карточки по external_id до создания новой карточки.
- Сопоставьте labels и members с реальными правилами команды.
- Отправьте тестовый payload дважды и проверьте, что карточка не дублируется.
Тесты перед production ¶
curl -X POST "https://YOUR-N8N-DOMAIN/webhook/integration-trello-n8n-card-sync" \
-H "Content-Type: application/json" \
--data @integration-trello-n8n-card-sync-payload.json- Повторный payload не создаёт дубль и возвращает тот же output key.
- Некорректный mapping останавливается до запроса к внешнему API.
- Пустые необязательные поля не ломают workflow.
- Ошибка API уходит в alert или DLQ с безопасным payload.
- Execution data не содержит секретов, токенов и лишних персональных данных.
Production-риски ¶
- Поиск по названию. Ручное переименование карточки ломает дедупликацию.
- list_id приходит из формы. Пользователь может отправить карточку в неправильный список.
- Checklist создаётся каждый раз заново. Повтор webhook плодит одинаковые пункты.
- Секреты в description. Не кладите токены, полный webhook и приватные payload в карточку.
- Нет DLQ. Ошибка Trello API потеряет заявку, если workflow просто завершится с failed execution.
Полезные ссылки и смежные материалы ¶
Критерии готовности ¶
- Повторный entity_id обновляет existing card, а не создаёт дубль.
- list_id и labels берутся из allowlist.
- Due date валидируется до запроса к Trello API.
- Checklist не дублирует уже созданные пункты.
- Ошибки Trello API уходят в alert или DLQ.
Nodbot настроит Trello + n8n: карточки без дублей, labels, checklist, due date, алерты и понятные правила обновления.
Обсудить Trello-интеграцию