<!-- source: https://nodbot.ru/integrations/clickup/; markdown: /llms/pages/generated/integrations-clickup.md; type: IntegrationGuide -->
---
title: "ClickUp и n8n: задачи и статусы без дублей | Nodbot"
source_url: "https://nodbot.ru/integrations/clickup/"
canonical_url: "https://nodbot.ru/integrations/clickup/"
language: "ru"
content_type: "IntegrationGuide"
section: "integrations"
generated_at: "2026-05-30"
word_count_source: 914
---

## AI summary

Problem/Solution-гайд по ClickUp и n8n: как создавать и обновлять задачи в ClickUp из CRM, форм и внутренних событий без дублей, потери статусов и ручного разбора списков.

## Best used for

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

## Key topics

- ClickUp
- n8n
- task automation
- webhook
- custom fields
- list routing
- status transitions
- dedupe key
- priority
- production workflow

# Интеграция ClickUp и n8n: задачи, статусы, custom fields и защита от дублей

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

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

- Проблема и решение

- Архитектура workflow

- Контракт данных

- Code Node и проверки

- Готовый workflow JSON

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

- Тесты перед production

- Production-риски

- Полезные ссылки

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

Проблема: ClickUp гибкий, но из-за этой гибкости интеграции часто пишут задачи не в тот List, теряют custom fields, создают дубли и не соблюдают правила статусов команды.

Решение: Используйте n8n как слой маршрутизации: определите list_id по типу события, нормализуйте приоритет и due date, проверьте idempotency key, запишите custom fields и обновляйте статус только по разрешённым переходам.


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

ClickUp часто становится единым местом для маркетинга, разработки, поддержки и операционки. Но если интеграция просто делает POST create task, в одном List оказываются заявки, баги, счета и внутренние поручения без статусов, владельцев и источников.

Правильная настройка ClickUp и n8n начинается не с API-запроса, а с контракта: какие события превращаются в задачи, какие статусы разрешены, какие custom fields обязательны, кто владелец и как повтор события влияет на уже созданную задачу.


## Архитектура workflow для n8n

| Блок | Задача | Production-проверка |

| --- | --- | --- |

| Webhook input | принимает событие из формы, CRM или backend | event_type, entity_id, source |

| Route list | выбирает ClickUp List по типу задачи | list_id и fallback |

| Normalize task | готовит name, description, due_date, priority | валидные статусы и custom fields |

| Check idempotency | ищет ранее созданную задачу | dedupe_key в Data Store/Postgres |

| Create/update task | создаёт задачу или обновляет статус | allowed transitions |

| Notify owner | отправляет ссылку в Slack/Telegram | короткий alert без PII |

Для ClickUp критично отделять routing от mapping. Если list_id меняется в нескольких местах workflow, поддержка быстро становится опасной.


## Контракт входных данных

```json
{
  "source": "support",
  "event_type": "new_bug_report",
  "entity_id": "ticket-7712",
  "title": "Пользователь не получил письмо после оплаты",
  "description": "Нужно проверить webhook ЮKassa и SMTP",
  "priority": "urgent",
  "team": "support",
  "due_at": "2026-06-01T12:00:00+03:00",
  "customer_url": "https://helpdesk.example.ru/tickets/7712",
  "labels": [
    "payment",
    "email"
  ]
}
```

Поля event_type и entity_id нужны для routing и дедупликации. Не пытайтесь определять тип задачи по словам в title.


## Code Node: нормализация, mapping и guard-условия

```javascript
const src = $json.body ?? $json;
const eventType = String(src.event_type ?? '').trim().toLowerCase();
const entityId = String(src.entity_id ?? '').trim();
if (!eventType || !entityId) throw new Error('event_type and entity_id are required');
const listMap = { new_bug_report: 'CLICKUP_BUGS_LIST_ID', content_request: 'CLICKUP_CONTENT_LIST_ID', sales_followup: 'CLICKUP_SALES_LIST_ID' };
const listId = listMap[eventType] ?? 'CLICKUP_INBOX_LIST_ID';
const priorityMap = { low: 4, normal: 3, high: 2, urgent: 1 };
const priority = priorityMap[String(src.priority ?? 'normal').toLowerCase()] ?? 3;
const dueAt = src.due_at ? Date.parse(src.due_at) : null;
if (src.due_at && Number.isNaN(dueAt)) throw new Error(`Invalid ClickUp due_at: ${src.due_at}`);
const dedupeKey = `clickup:${eventType}:${entityId}`;
return [{ json: { dedupe_key: dedupeKey, list_id: listId, task: {
  name: String(src.title ?? 'New task').trim().slice(0, 180),
  description: `${src.description ?? ''}\n\nSource: ${src.source ?? 'external'}\nEntity: ${entityId}\nURL: ${src.customer_url ?? ''}`,
  priority,
  due_date: dueAt || undefined,
  tags: Array.isArray(src.labels) ? src.labels.slice(0, 10) : [],
  custom_fields: [{ id: 'external_id_field', value: dedupeKey }, { id: 'source_field', value: String(src.source ?? 'external') }]
}} }];
```

В разных List наборы статусов отличаются. Перед update status нужна таблица разрешённых переходов, иначе workflow поставит задачу в несуществующий или неправильный статус.


## Готовый workflow JSON: скачать и импортировать

Скачать готовый workflow JSON Скачать тестовый payload

```json
{
  "name": "Nodbot - ClickUp task automation with routing",
  "nodes": [
    {
      "name": "Webhook task input",
      "type": "n8n-nodes-base.webhook",
      "purpose": "Принять событие"
    },
    {
      "name": "Route and normalize ClickUp task",
      "type": "n8n-nodes-base.code",
      "purpose": "Выбрать list_id и собрать payload"
    },
    {
      "name": "Check idempotency",
      "type": "n8n-nodes-base.httpRequest",
      "purpose": "Найти dedupe_key"
    },
    {
      "name": "Create or update ClickUp task",
      "type": "n8n-nodes-base.httpRequest",
      "purpose": "Создать/обновить задачу"
    },
    {
      "name": "Notify owner",
      "type": "n8n-nodes-base.httpRequest",
      "purpose": "Отправить ссылку владельцу"
    },
    {
      "name": "Respond",
      "type": "n8n-nodes-base.respondToWebhook",
      "purpose": "Вернуть статус"
    }
  ],
  "connections": "Webhook task input → Route and normalize ClickUp task → Check idempotency → Create or update ClickUp task → Notify owner → Respond"
}
```


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

- Опишите event_type → list_id mapping в одном месте.

- Создайте custom fields для external_id, source и customer_url.

- Импортируйте workflow JSON и замените ClickUp API token/credentials.

- Настройте Postgres/Data Store для dedupe_key.

- Проверьте правила priority и due date на тестовых событиях.


## Тесты перед production

```bash
curl -X POST "https://YOUR-N8N-DOMAIN/webhook/integration-clickup-n8n-task-automation" \
  -H "Content-Type: application/json" \
  --data @integration-clickup-n8n-task-automation-payload.json
```

- Один entity_id создаёт одну задачу.

- Событие неизвестного типа попадает в Inbox list, а не теряется.

- due_at в ISO-формате превращается в timestamp ClickUp.

- Невалидный статус не отправляется в API.

- Ошибка ClickUp API уходит в retry/DLQ.


## Production-риски

- Routing захардкожен в нескольких нодах. Смена List ломает часть событий.

- Нет dedupe_key. Повтор webhook создаёт повторную задачу.

- Custom fields не заполнены. Фильтры и отчёты ClickUp не работают.

- Приоритет маппится текстом. API ждёт конкретный формат.

- Нет fallback list. Неизвестные события теряются.


## Полезные ссылки и смежные материалы

- ClickUp Tasks API

- ClickUp Webhooks

- n8n ClickUp node

- Slack для owner-уведомлений

- Retry и DLQ для API-запросов


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

- event_type → list_id mapping зафиксирован и задокументирован.

- Дедупликация работает до create task.

- Priority, due date и custom fields проходят тесты.

- У неизвестных событий есть fallback list и alert.

- Rate limits ClickUp API покрыты retry/DLQ.

Nodbot настроит ClickUp + n8n: routing, custom fields, статусы, dedupe, owner-уведомления, retry и monitoring.
