Интеграция Asana и n8n: синхронизация задач, дедлайны и защита от дублей ¶
Обновлено: 2026-05-30
Импортируйте JSON в n8n, замените credentials, URL API, project/list IDs, поля и лимиты под вашу инфраструктуру.
Проблема: Asana удобна как рабочая доска, но простая автоматизация через webhook быстро создаёт одинаковые задачи, теряет assignee, не переносит due date и ломает отчётность по проектам.
Решение: Настройте интеграцию Asana и n8n как контролируемый task sync: нормализуйте входные поля, соберите external_id, найдите существующую задачу, обновите custom fields и только потом создавайте новую задачу в нужном project/section.
Проблема: почему простая интеграция создаёт дубли и ручной хаос ¶
Команды часто подключают Asana к формам, CRM, Slack или почте по принципу “создай задачу на каждый webhook”. Это работает в первый день, но ломается на повторных событиях: одна заявка создаёт несколько задач, дедлайн остаётся в тексте описания, а ответственный не назначается из-за несовпадения email.
Для production важнее не сам факт создания задачи, а качество синхронизации. Задача должна иметь стабильный ключ, понятный источник, project, section, due date, assignee, ссылку на исходную сущность и статус обработки. Тогда Asana становится операционным слоем, а не ещё одним местом ручной сортировки.
Архитектура workflow для n8n ¶
| Блок | Задача | Production-проверка |
|---|---|---|
| Webhook event | принимает заявку из CRM, формы, Slack или внутреннего сервиса | source, entity_id, event_type |
| Normalize task fields | приводит title, due date, assignee email и custom fields | валидные даты и обязательный external_id |
| Find existing task | ищет задачу по external_id/custom field | не создаём дубль при повторном событии |
| Create or update Asana task | создаёт задачу или обновляет найденную | project_gid, section_gid, assignee_gid |
| Post comment | добавляет историю изменения | без токенов и персональных данных |
| Respond / alert | возвращает статус или отправляет ошибку | понятный 200/4xx и DLQ |
Если external_id нельзя хранить в custom field, добавьте его в начало description в машинно-читаемом виде. Но для долгосрочной поддержки custom field надёжнее: по нему проще искать и строить отчёты.
Контракт входных данных ¶
{
"source": "crm",
"event_type": "deal_stage_changed",
"entity_id": "deal-5581",
"title": "Подготовить КП для клиента",
"description": "Клиент запросил коммерческое предложение после созвона",
"assignee_email": "manager@example.ru",
"due_date": "2026-06-03",
"project_gid": "1200123456789",
"section_gid": "1200987654321",
"priority": "high",
"source_url": "https://crm.example.ru/deals/5581"
}Минимальный контракт: title, entity_id, source и project_gid. Остальные поля полезны, но не должны заменять ключ дедупликации.
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 Asana task sync');
const title = String(src.title ?? '').trim();
if (title.length < 5) throw new Error('Task title is too short');
const dueDate = String(src.due_date ?? '').trim();
if (dueDate && !/^\d{4}-\d{2}-\d{2}$/.test(dueDate)) throw new Error(`Invalid Asana due_date: ${dueDate}`);
const assigneeEmail = String(src.assignee_email ?? '').trim().toLowerCase();
const externalId = `asana-sync:${source}:${entityId}`;
return [{ json: { external_id: externalId, task: {
name: title.slice(0, 120),
notes: `${src.description ?? ''}\n\nSource: ${source}\nEntity: ${entityId}\nURL: ${src.source_url ?? ''}`,
projects: [String(src.project_gid ?? '').trim()].filter(Boolean),
memberships: src.section_gid ? [{ section: String(src.section_gid) }] : [],
due_on: dueDate || undefined,
assignee_email: assigneeEmail || undefined,
custom_fields: { external_id: externalId, priority: String(src.priority ?? 'normal') }
}} }];
Почему Asana sync лучше простого create task
При повторном событии create task создаёт дубль. Sync с external_id позволяет обновлять существующую задачу, добавлять комментарий и сохранять одну правду для команды.
Готовый workflow JSON: скачать и импортировать ¶
Скачать готовый workflow JSON Скачать тестовый payload
{
"name": "Nodbot - Asana task sync with dedupe",
"nodes": [
{
"name": "Webhook task event",
"type": "n8n-nodes-base.webhook",
"purpose": "Принять событие из CRM/формы"
},
{
"name": "Normalize Asana fields",
"type": "n8n-nodes-base.code",
"purpose": "Собрать external_id и task payload"
},
{
"name": "Find existing Asana task",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Найти задачу по custom field или текстовому ключу"
},
{
"name": "Create or update task",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Создать/обновить задачу"
},
{
"name": "Post task comment",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Добавить историю изменения"
},
{
"name": "Respond",
"type": "n8n-nodes-base.respondToWebhook",
"purpose": "Вернуть статус"
}
],
"connections": "Webhook task event → Normalize Asana fields → Find existing Asana task → Create or update task → Post task comment → Respond"
}
Пошаговая настройка связки ¶
- Создайте Asana project и section для входящих задач.
- Подготовьте custom field для external_id, priority и source.
- Импортируйте workflow JSON и замените personal access token или OAuth credential.
- Укажите project_gid, section_gid и правила assignee mapping.
- Отправьте тестовый payload дважды и убедитесь, что вторая отправка не создаёт дубль.
Тесты перед production ¶
curl -X POST "https://YOUR-N8N-DOMAIN/webhook/integration-asana-n8n-task-sync" \
-H "Content-Type: application/json" \
--data @integration-asana-n8n-task-sync-payload.json- Повтор одного entity_id обновляет существующую задачу.
- Невалидная дата останавливает workflow до запроса в Asana.
- Заявка без assignee создаётся в fallback-section.
- Ошибка API Asana уходит в alert или DLQ.
- Комментарий не содержит токены и лишние персональные данные.
Production-риски ¶
- Нет external_id. Повторные события создают одинаковые задачи.
- Assignee ищется по имени. Имена меняются; используйте email/GID mapping.
- Дедлайн лежит в описании. Asana не сможет строить календарь и напоминания.
- Слишком длинный title. Команда не видит суть задачи в списке.
- Нет журнала обновлений. Непонятно, почему задача изменилась.
Полезные ссылки и смежные материалы ¶
- Asana Webhooks guide
- Asana Create a task API
- n8n Asana node
- Webhook idempotency в Postgres
- Slack-алерты для ошибок workflow
Критерии готовности ¶
- У каждой задачи есть external_id или custom field для дедупликации.
- Due date, assignee и project/section передаются отдельными полями.
- Повторный webhook не создаёт вторую задачу.
- Ошибки API Asana попадают в retry/DLQ.
- В описании задачи есть ссылка на исходную сущность и владелец процесса.
Nodbot настроит Asana + n8n: task sync, custom fields, дедупликацию, SLA, комментарии, алерты и безопасную обработку ошибок.
Обсудить Asana-интеграцию