Перейти к содержанию

Интеграция Trello и n8n: карточки, webhooks и защита от дублей

Обновлено: 2026-05-30

AI summary: Problem/Solution-гайд по Trello и n8n: как превращать заявки, письма и события в карточки Trello без дублей, потери labels, checklist и ответственного.
Готовый blueprint для внедрения

Импортируйте JSON в n8n, замените credentials, URL API, project/list IDs, поля и лимиты под вашу инфраструктуру.

Проблема: Trello легко использовать как простую kanban-доску, но автоматизация “создать карточку на каждый webhook” быстро даёт дубли, неправильные lists и описания без контекста.

Решение: Настройте n8n как слой синхронизации: нормализуйте входное событие, соберите external_id, найдите существующую карточку, обновите labels/checklist и только потом создавайте новую карточку в нужном list.

Схема интеграции Trello и n8n для карточек без дублей
Схема показывает путь события от webhook до созданной или обновлённой карточки Trello.

Проблема: почему простая интеграция создаёт дубли и ручной хаос

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"
}

Пошаговая настройка связки

  1. Создайте отдельный board/list для production-сценария и выпишите idList.
  2. Импортируйте workflow JSON и замените Trello API key/token или credential.
  3. Настройте поиск карточки по external_id до создания новой карточки.
  4. Сопоставьте labels и members с реальными правилами команды.
  5. Отправьте тестовый 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
  1. Повторный payload не создаёт дубль и возвращает тот же output key.
  2. Некорректный mapping останавливается до запроса к внешнему API.
  3. Пустые необязательные поля не ломают workflow.
  4. Ошибка API уходит в alert или DLQ с безопасным payload.
  5. Execution data не содержит секретов, токенов и лишних персональных данных.

Production-риски

  • Поиск по названию. Ручное переименование карточки ломает дедупликацию.
  • list_id приходит из формы. Пользователь может отправить карточку в неправильный список.
  • Checklist создаётся каждый раз заново. Повтор webhook плодит одинаковые пункты.
  • Секреты в description. Не кладите токены, полный webhook и приватные payload в карточку.
  • Нет DLQ. Ошибка Trello API потеряет заявку, если workflow просто завершится с failed execution.
Карточка результата Trello и n8n с labels, checklist и external_id
Пример результата: одна карточка содержит источник, дедупликацию, labels и checklist.

Критерии готовности

  1. Повторный entity_id обновляет existing card, а не создаёт дубль.
  2. list_id и labels берутся из allowlist.
  3. Due date валидируется до запроса к Trello API.
  4. Checklist не дублирует уже созданные пункты.
  5. Ошибки Trello API уходят в alert или DLQ.
Нужна Trello-автоматизация без хаоса?

Nodbot настроит Trello + n8n: карточки без дублей, labels, checklist, due date, алерты и понятные правила обновления.

Обсудить Trello-интеграцию