This workflow corresponds to n8n.io template #11863 — we link there as the canonical source.
This workflow follows the Agent → Agenttool recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "86tynDhnAdS9X9df",
"name": "Intelligent Project Delivery and Task Management System",
"tags": [],
"nodes": [
{
"id": "b87457a2-e5d3-47a3-8500-69ed888ca70a",
"name": "Daily Project Check",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-2720,
48
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 9
}
]
}
},
"typeVersion": 1.3
},
{
"id": "147b17ac-20a0-469b-97de-606fc36a2dce",
"name": "Workflow Configuration",
"type": "n8n-nodes-base.set",
"position": [
-2496,
48
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "id-1",
"name": "projectApiUrl",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__Project Management API URL__>"
},
{
"id": "id-2",
"name": "teamApiUrl",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__Team Profiles API URL__>"
},
{
"id": "id-3",
"name": "notificationWebhook",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__Notification Webhook URL__>"
},
{
"id": "id-4",
"name": "delayThresholdDays",
"type": "number",
"value": 2
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "1d33d40e-aaf2-46e3-8c5b-62b7ddf654ee",
"name": "Fetch Project Data",
"type": "n8n-nodes-base.httpRequest",
"position": [
-2272,
-48
],
"parameters": {
"url": "={{ $('Workflow Configuration').first().json.projectApiUrl }}",
"options": {},
"authentication": "predefinedCredentialType"
},
"typeVersion": 4.3
},
{
"id": "106d7081-827e-4631-8b13-53215ac0843f",
"name": "Fetch Team Profiles",
"type": "n8n-nodes-base.httpRequest",
"position": [
-2272,
144
],
"parameters": {
"url": "={{ $('Workflow Configuration').first().json.teamApiUrl }}",
"options": {},
"authentication": "predefinedCredentialType"
},
"typeVersion": 4.3
},
{
"id": "0e32aef2-0c01-4310-850d-9f3243e5a0ec",
"name": "Merge Project and Team Data",
"type": "n8n-nodes-base.code",
"position": [
-2080,
48
],
"parameters": {
"jsCode": "// Get project data from first input\nconst projectData = $input.first().json;\n\n// Get team profiles from second input\nconst teamProfiles = $input.last().json;\n\n// Merge into a single object\nconst mergedData = {\n projectData: projectData,\n teamProfiles: teamProfiles\n};\n\n// Return the merged data\nreturn [{ json: mergedData }];"
},
"typeVersion": 2
},
{
"id": "2a773809-56d3-4f8a-bb03-61bc73ff75a7",
"name": "Project Orchestrator Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-1200,
16
],
"parameters": {
"text": "={{ $json }}",
"options": {
"systemMessage": "You are a Project Delivery Orchestrator that coordinates specialized AI agents to manage project delivery.\n\nYour task is to:\n1. Call the Task Breakdown Agent Tool to decompose the project into actionable tasks\n2. Call the Effort Estimation Agent Tool to estimate effort for each task\n3. Call the Task Assignment Agent Tool to assign tasks based on team skill profiles\n4. Call the Progress Monitoring Tool to check current task progress\n5. Call the Delay Detection Tool to identify any delays or risks\n6. Return a comprehensive project plan with tasks, estimates, assignments, and status\n\nCoordinate these tools in sequence and combine their outputs into a structured project delivery plan."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3
},
{
"id": "1052debb-374e-43db-9376-8526bb6b1b02",
"name": "Anthropic Model - Orchestrator",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
-1920,
240
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-sonnet-4-5-20250929",
"cachedResultName": "Claude Sonnet 4.5"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "4a156d80-fa0f-4592-8e26-668605d02752",
"name": "Task Breakdown Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-672,
240
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"projectPlan\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"properties\": {\n\t\t\t\t\"tasks\": {\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"assignments\": {\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"delays\": {\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"status\": {\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}"
},
"typeVersion": 1.3
},
{
"id": "27ccd285-71b0-4864-a776-3a3efc78d2ed",
"name": "Task Breakdown Agent Tool",
"type": "@n8n/n8n-nodes-langchain.agentTool",
"position": [
-1792,
240
],
"parameters": {
"text": "={{ $fromAI('projectData', 'The project information to break down into tasks') }}",
"options": {
"systemMessage": "You are a Task Breakdown Specialist. Analyze the project information and break it down into specific, actionable tasks.\n\nFor each task, identify:\n- Task name and description\n- Dependencies on other tasks\n- Estimated complexity (low, medium, high)\n- Required skills\n- Milestone association\n\nReturn a structured list of tasks with all details."
},
"hasOutputParser": true,
"toolDescription": "Breaks down projects into actionable tasks with dependencies and milestones"
},
"typeVersion": 2.2
},
{
"id": "82210b7c-9f3e-49c0-9ae7-27e7d5ea5b91",
"name": "Anthropic Model - Task Breakdown",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
-1776,
448
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-sonnet-4-5-20250929",
"cachedResultName": "Claude Sonnet 4.5"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "527e1b25-0970-4fee-9ce9-90a64a63f17a",
"name": "Task List Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-1632,
448
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"tasks\": {\n\t\t\t\"type\": \"array\",\n\t\t\t\"items\": {\n\t\t\t\t\"type\": \"object\",\n\t\t\t\t\"properties\": {\n\t\t\t\t\t\"taskId\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"taskName\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"description\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"complexity\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"requiredSkills\": {\n\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"dependencies\": {\n\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}"
},
"typeVersion": 1.3
},
{
"id": "c5250fb1-c90a-4efa-b38a-df77316fe7df",
"name": "Effort Estimation Agent Tool",
"type": "@n8n/n8n-nodes-langchain.agentTool",
"position": [
-1504,
240
],
"parameters": {
"text": "={{ $fromAI('tasks', 'The list of tasks to estimate effort for') }}",
"options": {
"systemMessage": "You are an Effort Estimation Specialist. Analyze each task and provide realistic effort estimates.\n\nFor each task, estimate:\n- Duration in hours\n- Number of people required\n- Start date (based on dependencies)\n- End date\n- Risk level (low, medium, high)\n\nConsider task complexity, dependencies, and typical team velocity. Return structured estimates for all tasks."
},
"hasOutputParser": true,
"toolDescription": "Estimates effort and duration for each task based on complexity and team capacity"
},
"typeVersion": 2.2
},
{
"id": "7cefd3c1-fb09-4649-93b7-9a67213a6406",
"name": "Anthropic Model - Effort Estimation",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
-1504,
448
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-sonnet-4-5-20250929",
"cachedResultName": "Claude Sonnet 4.5"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "60f09225-c3a2-44e4-b27e-28f5f2a88d9f",
"name": "Effort Estimates Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-1344,
448
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"estimates\": {\n\t\t\t\"type\": \"array\",\n\t\t\t\"items\": {\n\t\t\t\t\"type\": \"object\",\n\t\t\t\t\"properties\": {\n\t\t\t\t\t\"taskId\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"durationHours\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"peopleRequired\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"startDate\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"endDate\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"riskLevel\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}"
},
"typeVersion": 1.3
},
{
"id": "0f6aa280-290e-43ff-a9de-6e5a6355a789",
"name": "Task Assignment Agent Tool",
"type": "@n8n/n8n-nodes-langchain.agentTool",
"position": [
-1216,
240
],
"parameters": {
"text": "={{ $fromAI('tasksAndTeam', 'Tasks with estimates and team member profiles') }}",
"options": {
"systemMessage": "You are a Task Assignment Specialist. Match tasks to team members based on their skills and availability.\n\nFor each task, assign:\n- Team member ID and name\n- Assignment rationale (why this person)\n- Workload percentage\n- Backup assignee (if applicable)\n\nConsider:\n- Skill match with required skills\n- Current workload and availability\n- Task dependencies and timing\n- Team member preferences and strengths\n\nReturn structured assignments for all tasks."
},
"hasOutputParser": true,
"toolDescription": "Assigns tasks to team members based on skills, availability, and workload"
},
"typeVersion": 2.2
},
{
"id": "01741980-dc2f-400d-837f-8b400e58733c",
"name": "Anthropic Model - Task Assignment",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
-1216,
448
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-sonnet-4-5-20250929",
"cachedResultName": "Claude Sonnet 4.5"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "a1f01a3e-1c98-45a0-8cda-00471bac9562",
"name": "Task Assignments Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-1072,
448
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"assignments\": {\n\t\t\t\"type\": \"array\",\n\t\t\t\"items\": {\n\t\t\t\t\"type\": \"object\",\n\t\t\t\t\"properties\": {\n\t\t\t\t\t\"taskId\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"assignedTo\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"assignedToName\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"rationale\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"workloadPercentage\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"backupAssignee\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}"
},
"typeVersion": 1.3
},
{
"id": "4752fe2b-1da9-41a3-b625-bf199636f29d",
"name": "Progress Monitoring Tool",
"type": "@n8n/n8n-nodes-langchain.toolCode",
"position": [
-928,
240
],
"parameters": {
"jsCode": "// Fetch task progress from project management system and calculate completion metrics\nconst projectData = query;\n\n// Parse the project data if it's a string\nlet data;\ntry {\n data = typeof projectData === 'string' ? JSON.parse(projectData) : projectData;\n} catch (error) {\n return 'Error: Invalid project data format';\n}\n\n// Calculate progress metrics\nconst tasks = data.tasks || [];\nconst totalTasks = tasks.length;\n\nif (totalTasks === 0) {\n return 'No tasks found in the project';\n}\n\nconst completedTasks = tasks.filter(task => task.status === 'completed').length;\nconst inProgressTasks = tasks.filter(task => task.status === 'in_progress').length;\nconst notStartedTasks = tasks.filter(task => task.status === 'not_started').length;\n\nconst completionPercentage = ((completedTasks / totalTasks) * 100).toFixed(2);\n\n// Calculate progress by assignee\nconst progressByAssignee = {};\ntasks.forEach(task => {\n const assignee = task.assignee || 'Unassigned';\n if (!progressByAssignee[assignee]) {\n progressByAssignee[assignee] = {\n total: 0,\n completed: 0,\n inProgress: 0,\n notStarted: 0\n };\n }\n progressByAssignee[assignee].total++;\n if (task.status === 'completed') progressByAssignee[assignee].completed++;\n if (task.status === 'in_progress') progressByAssignee[assignee].inProgress++;\n if (task.status === 'not_started') progressByAssignee[assignee].notStarted++;\n});\n\n// Format the report\nconst report = {\n overallProgress: {\n totalTasks,\n completedTasks,\n inProgressTasks,\n notStartedTasks,\n completionPercentage: `${completionPercentage}%`\n },\n progressByAssignee\n};\n\nreturn JSON.stringify(report, null, 2);",
"description": "Monitors current progress of assigned tasks and calculates completion percentages"
},
"typeVersion": 1.3
},
{
"id": "5c8c76d6-59c9-44c4-bbfa-900d4ffd4fb6",
"name": "Delay Detection Tool",
"type": "@n8n/n8n-nodes-langchain.toolCode",
"position": [
-800,
240
],
"parameters": {
"jsCode": "// Detect tasks that are delayed or at risk of delay\n// Input: query should contain task data with progress, deadlines, and planned schedule\n\nconst DELAY_THRESHOLD_DAYS = 2; // Tasks delayed by more than 2 days are flagged\n\ntry {\n const taskData = JSON.parse(query);\n const currentDate = new Date();\n const delayedTasks = [];\n const atRiskTasks = [];\n\n // Process each task to detect delays\n if (Array.isArray(taskData.tasks)) {\n taskData.tasks.forEach(task => {\n const deadline = new Date(task.deadline);\n const plannedCompletion = task.plannedCompletionPercentage || 100;\n const actualProgress = task.actualProgress || 0;\n const daysUntilDeadline = Math.ceil((deadline - currentDate) / (1000 * 60 * 60 * 24));\n \n // Calculate expected progress based on timeline\n const totalDuration = task.estimatedDuration || 1;\n const elapsedTime = task.elapsedTime || 0;\n const expectedProgress = (elapsedTime / totalDuration) * 100;\n \n // Check if task is delayed\n if (actualProgress < expectedProgress - 10) {\n const delayDays = Math.ceil((expectedProgress - actualProgress) / 100 * totalDuration);\n \n if (delayDays > DELAY_THRESHOLD_DAYS) {\n delayedTasks.push({\n taskId: task.id,\n taskName: task.name,\n assignedTo: task.assignedTo,\n expectedProgress: expectedProgress.toFixed(1),\n actualProgress: actualProgress,\n delayDays: delayDays,\n daysUntilDeadline: daysUntilDeadline,\n severity: delayDays > 5 ? 'high' : 'medium'\n });\n } else {\n atRiskTasks.push({\n taskId: task.id,\n taskName: task.name,\n assignedTo: task.assignedTo,\n expectedProgress: expectedProgress.toFixed(1),\n actualProgress: actualProgress,\n delayDays: delayDays,\n daysUntilDeadline: daysUntilDeadline,\n severity: 'low'\n });\n }\n }\n });\n }\n\n const result = {\n analysisDate: currentDate.toISOString(),\n delayThresholdDays: DELAY_THRESHOLD_DAYS,\n delayedTasks: delayedTasks,\n atRiskTasks: atRiskTasks,\n summary: {\n totalDelayed: delayedTasks.length,\n totalAtRisk: atRiskTasks.length,\n highSeverity: delayedTasks.filter(t => t.severity === 'high').length\n }\n };\n\n return JSON.stringify(result, null, 2);\n \n} catch (error) {\n return JSON.stringify({\n error: 'Failed to analyze delays',\n message: error.message,\n delayedTasks: [],\n atRiskTasks: []\n });\n}",
"description": "Detects tasks that are delayed or at risk of delay based on progress and deadlines"
},
"typeVersion": 1.3
},
{
"id": "04c703e7-c803-4816-b5a5-0ce470448e87",
"name": "Parse Agent Output",
"type": "n8n-nodes-base.code",
"position": [
-512,
144
],
"parameters": {
"jsCode": "// Extract the projectPlan object from the agent output\nconst items = $input.all();\nconst outputItems = [];\n\nfor (const item of items) {\n // The agent output should contain the projectPlan in the response\n const agentOutput = item.json;\n \n // Extract projectPlan from the agent's output\n let projectPlan;\n \n if (agentOutput.output) {\n // If output is a string, try to parse it as JSON\n if (typeof agentOutput.output === 'string') {\n try {\n projectPlan = JSON.parse(agentOutput.output);\n } catch (e) {\n projectPlan = agentOutput.output;\n }\n } else {\n projectPlan = agentOutput.output;\n }\n } else if (agentOutput.projectPlan) {\n projectPlan = agentOutput.projectPlan;\n } else {\n // If no specific structure, use the whole output\n projectPlan = agentOutput;\n }\n \n // Prepare data for delay checking\n outputItems.push({\n json: {\n projectPlan: projectPlan,\n hasDelays: false,\n delayedTasks: [],\n timestamp: new Date().toISOString()\n }\n });\n}\n\nreturn outputItems;"
},
"typeVersion": 2
},
{
"id": "ca925b01-9324-49fc-b3d3-d577038c27bc",
"name": "Check for Delays",
"type": "n8n-nodes-base.if",
"position": [
-352,
144
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": false,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "id-1",
"operator": {
"type": "array",
"operation": "lengthGt"
},
"leftValue": "={{ $('Parse Agent Output').item.json.delays }}",
"rightValue": "0"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "3993313a-7a7d-4d3a-86da-2d410dce9f0a",
"name": "Reallocation Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-112,
128
],
"parameters": {
"text": "={{ $json }}",
"options": {
"systemMessage": "You are a Task Reallocation Specialist. When delays are detected, you reassign tasks to optimize delivery.\n\nAnalyze:\n- Delayed tasks and their impact\n- Team member current workload\n- Available team members with matching skills\n- Task dependencies and critical path\n\nProvide:\n- Recommended task reassignments\n- Rationale for each change\n- Expected impact on timeline\n- Risk mitigation strategies\n\nReturn structured reallocation recommendations."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3
},
{
"id": "3562c929-40bf-4d0a-9917-ee505b0b9497",
"name": "Anthropic Model - Reallocation",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
-96,
352
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-sonnet-4-5-20250929",
"cachedResultName": "Claude Sonnet 4.5"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "8e5418f2-4724-4282-9dc4-6fce4e52dd8d",
"name": "Reallocation Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
32,
352
],
"parameters": {
"jsonSchemaExample": "{\n\t\"reallocations\": [\n\t\t{\n\t\t\t\"taskId\": \"string\",\n\t\t\t\"fromAssignee\": \"string\",\n\t\t\t\"toAssignee\": \"string\",\n\t\t\t\"rationale\": \"string\",\n\t\t\t\"timelineImpact\": \"string\"\n\t\t}\n\t]\n}"
},
"typeVersion": 1.3
},
{
"id": "ccc40fae-b484-47ed-95be-fdf7b052fbc2",
"name": "Update Task Assignments",
"type": "n8n-nodes-base.httpRequest",
"position": [
320,
128
],
"parameters": {
"url": "<__PLACEHOLDER_VALUE__Task Assignment Update API URL__>",
"method": "POST",
"options": {},
"jsonBody": "={{ $json }}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType"
},
"typeVersion": 4.3
},
{
"id": "70935e81-f240-44c5-b202-e5b9eca8f36a",
"name": "Generate Milestone Report",
"type": "n8n-nodes-base.code",
"position": [
480,
272
],
"parameters": {
"jsCode": "// Generate Comprehensive Milestone Report\n\n// Get input data from previous nodes\nconst items = $input.all();\n\n// Initialize report structure\nconst report = {\n reportDate: new Date().toISOString(),\n projectStatus: {\n totalTasks: 0,\n completedTasks: 0,\n inProgressTasks: 0,\n pendingTasks: 0,\n completionPercentage: 0\n },\n teamUtilization: [],\n delays: [],\n reallocations: [],\n milestones: [],\n summary: \"\"\n};\n\n// Process each item to extract relevant information\nfor (const item of items) {\n const data = item.json;\n \n // Extract task information if available\n if (data.tasks) {\n const tasks = Array.isArray(data.tasks) ? data.tasks : [data.tasks];\n \n report.projectStatus.totalTasks = tasks.length;\n \n tasks.forEach(task => {\n if (task.status === 'completed') {\n report.projectStatus.completedTasks++;\n } else if (task.status === 'in_progress') {\n report.projectStatus.inProgressTasks++;\n } else {\n report.projectStatus.pendingTasks++;\n }\n \n // Check for delays\n if (task.isDelayed || task.delayed) {\n report.delays.push({\n taskId: task.id || task.taskId,\n taskName: task.name || task.title,\n assignedTo: task.assignedTo || task.assignee,\n delayDays: task.delayDays || 0,\n reason: task.delayReason || 'Not specified'\n });\n }\n });\n }\n \n // Extract team utilization data\n if (data.teamMembers || data.team) {\n const team = data.teamMembers || data.team;\n const teamArray = Array.isArray(team) ? team : [team];\n \n teamArray.forEach(member => {\n report.teamUtilization.push({\n name: member.name || member.memberName,\n role: member.role || member.position,\n assignedTasks: member.assignedTasks || 0,\n completedTasks: member.completedTasks || 0,\n utilizationPercentage: member.utilization || 0,\n availability: member.availability || 'Unknown'\n });\n });\n }\n \n // Extract reallocation information\n if (data.reallocations) {\n const reallocations = Array.isArray(data.reallocations) ? data.reallocations : [data.reallocations];\n \n reallocations.forEach(realloc => {\n report.reallocations.push({\n taskId: realloc.taskId,\n taskName: realloc.taskName,\n fromMember: realloc.from || realloc.previousAssignee,\n toMember: realloc.to || realloc.newAssignee,\n reason: realloc.reason || 'Optimization',\n timestamp: realloc.timestamp || new Date().toISOString()\n });\n });\n }\n \n // Extract milestone information\n if (data.milestones) {\n const milestones = Array.isArray(data.milestones) ? data.milestones : [data.milestones];\n \n milestones.forEach(milestone => {\n report.milestones.push({\n name: milestone.name || milestone.title,\n dueDate: milestone.dueDate || milestone.deadline,\n status: milestone.status || 'pending',\n completionPercentage: milestone.completion || 0,\n dependencies: milestone.dependencies || []\n });\n });\n }\n}\n\n// Calculate completion percentage\nif (report.projectStatus.totalTasks > 0) {\n report.projectStatus.completionPercentage = Math.round(\n (report.projectStatus.completedTasks / report.projectStatus.totalTasks) * 100\n );\n}\n\n// Generate summary\nconst delayCount = report.delays.length;\nconst reallocationCount = report.reallocations.length;\nconst avgUtilization = report.teamUtilization.length > 0 \n ? Math.round(report.teamUtilization.reduce((sum, member) => sum + member.utilizationPercentage, 0) / report.teamUtilization.length)\n : 0;\n\nreport.summary = `Project Status Report - ${new Date().toLocaleDateString()}\\n\\n` +\n `Overall Progress: ${report.projectStatus.completionPercentage}% complete\\n` +\n `Tasks: ${report.projectStatus.completedTasks}/${report.projectStatus.totalTasks} completed, ` +\n `${report.projectStatus.inProgressTasks} in progress, ${report.projectStatus.pendingTasks} pending\\n` +\n `Team Utilization: ${avgUtilization}% average\\n` +\n `Delays: ${delayCount} task(s) delayed\\n` +\n `Reallocations: ${reallocationCount} task(s) reallocated\\n\\n` +\n (delayCount > 0 ? `\u26a0\ufe0f Action Required: ${delayCount} delayed task(s) need attention\\n` : '\u2705 All tasks on track\\n');\n\n// Add recommendations\nreport.recommendations = [];\n\nif (delayCount > 0) {\n report.recommendations.push('Review delayed tasks and consider resource reallocation');\n}\n\nif (avgUtilization > 90) {\n report.recommendations.push('Team utilization is high - consider adding resources or adjusting timelines');\n} else if (avgUtilization < 50) {\n report.recommendations.push('Team utilization is low - consider optimizing task distribution');\n}\n\nif (report.projectStatus.completionPercentage < 30 && report.milestones.length > 0) {\n report.recommendations.push('Project progress is behind - review milestone deadlines');\n}\n\n// Return the comprehensive report\nreturn [{ json: report }];"
},
"typeVersion": 2
},
{
"id": "557a73cb-5c89-4c05-bf10-eab736660247",
"name": "Send Report Notification",
"type": "n8n-nodes-base.httpRequest",
"position": [
656,
272
],
"parameters": {
"url": "={{ $('Workflow Configuration').first().json.notificationWebhook }}",
"method": "POST",
"options": {},
"jsonBody": "={{ $json }}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType"
},
"typeVersion": 4.3
},
{
"id": "33acac00-1029-464b-8cd9-ec9e25a3d0ae",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2752,
-384
],
"parameters": {
"width": 784,
"height": 192,
"content": "## How It Works\nAutomates daily project monitoring by fetching project data, analyzing tasks and team capacity with anthropic models, and generating resource optimization recommendations. Target audience: project managers, engineering leads, and resource planners managing complex team assignments. Problem solved: manual capacity planning misses bottlenecks; AI analysis identifies effort mismatches and delays proactively. Workflow runs daily checks, merges project and team profiles, analyzes tasks via multiple anthropic agents (breakdown, estimation, assignment), calculates effort allocation, detects delays, generates rebalancing recommendations, notifies stakeholders, and tracks milestones.\n"
},
"typeVersion": 1
},
{
"id": "78b0ad3a-e707-4ef2-8d71-3c1a6fa1d847",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1920,
-384
],
"parameters": {
"color": 3,
"width": 336,
"height": 208,
"content": "## Setup Steps\n1. Configure daily trigger schedule. \n2. Connect project management system APIs. \n3. Set anthropic API keys with task analysis prompts. \n4. Enable email notifications for managers. \n5. Connect reporting database for tracking."
},
"typeVersion": 1
},
{
"id": "906caeeb-360f-4fbe-80e3-16761e5ea19d",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1552,
-384
],
"parameters": {
"color": 4,
"width": 448,
"height": 208,
"content": "## Prerequisites\nAnthropic API access, project management tool credentials, team capacity database \n\n## Use Cases\nSaaS teams managing feature backlogs, consulting firms balancing client projects "
},
"typeVersion": 1
},
{
"id": "4eae4021-3fc4-4b5f-93f7-187170494abe",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1088,
-384
],
"parameters": {
"color": 5,
"width": 368,
"height": 208,
"content": "## Customization\nAdjust effort estimation models. Add Slack notifications for urgency. \n\n## Benefits\nDetects delays 2-3 weeks early, improves team utilization by 25% "
},
"typeVersion": 1
},
{
"id": "6142cc21-19ab-4319-8f0c-4f9cf8439ecd",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
240,
-144
],
"parameters": {
"color": 7,
"width": 544,
"height": 880,
"content": "## Reporting & Notifications\n**What:** Generate milestone reports, send status updates, track progress metrics.\n**Why:** Stakeholder visibility enables proactive intervention before projects slip."
},
"typeVersion": 1
},
{
"id": "72a8c1d7-a3b2-4431-a5ce-53a9b7cc80c8",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-528,
-144
],
"parameters": {
"color": 7,
"width": 736,
"height": 896,
"content": "## Intelligent Rebalancing\n**What:** Parse agent outputs, detect delays, flag bottlenecks, generate assignment recommendations.\n**Why:** Automated rebalancing prevents schedule overruns and optimizes team utilization."
},
"typeVersion": 1
},
{
"id": "1705206e-a6da-48f3-b7ff-7061bccdf492",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1936,
-160
],
"parameters": {
"color": 7,
"width": 1392,
"height": 928,
"content": "## Parallel AI Analysis\n**What:** Anthropic agents analyze tasks (breakdown, effort estimation, optimal assignments) simultaneously.\n**Why:** Parallel processing accelerates insights; multiple perspectives improve allocation accuracy."
},
"typeVersion": 1
},
{
"id": "36acb0af-ac5b-4713-9b63-1fdd90006afb",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2768,
-160
],
"parameters": {
"color": 7,
"width": 816,
"height": 432,
"content": "## Data Integration\n**What:** Daily triggers fetch project dates, team profiles, and task inventory from multiple sources.\n**Why:** Real-time data ensures analysis reflects current project state and team capacity."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "21723703-146d-418f-a601-5dcb8acff0d8",
"connections": {
"Check for Delays": {
"main": [
[
{
"node": "Reallocation Agent",
"type": "main",
"index": 0
}
],
[
{
"node": "Generate Milestone Report",
"type": "main",
"index": 0
}
]
]
},
"Task List Parser": {
"ai_outputParser": [
[
{
"node": "Task Breakdown Agent Tool",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Fetch Project Data": {
"main": [
[
{
"node": "Merge Project and Team Data",
"type": "main",
"index": 0
}
]
]
},
"Parse Agent Output": {
"main": [
[
{
"node": "Check for Delays",
"type": "main",
"index": 0
}
]
]
},
"Reallocation Agent": {
"main": [
[
{
"node": "Update Task Assignments",
"type": "main",
"index": 0
}
]
]
},
"Daily Project Check": {
"main": [
[
{
"node": "Workflow Configuration",
"type": "main",
"index": 0
}
]
]
},
"Fetch Team Profiles": {
"main": [
[
{
"node": "Merge Project and Team Data",
"type": "main",
"index": 0
}
]
]
},
"Delay Detection Tool": {
"ai_tool": [
[
{
"node": "Project Orchestrator Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Workflow Configuration": {
"main": [
[
{
"node": "Fetch Project Data",
"type": "main",
"index": 0
},
{
"node": "Fetch Team Profiles",
"type": "main",
"index": 0
}
]
]
},
"Effort Estimates Parser": {
"ai_outputParser": [
[
{
"node": "Effort Estimation Agent Tool",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Task Assignments Parser": {
"ai_outputParser": [
[
{
"node": "Task Assignment Agent Tool",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Update Task Assignments": {
"main": [
[
{
"node": "Generate Milestone Report",
"type": "main",
"index": 0
}
]
]
},
"Progress Monitoring Tool": {
"ai_tool": [
[
{
"node": "Project Orchestrator Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Generate Milestone Report": {
"main": [
[
{
"node": "Send Report Notification",
"type": "main",
"index": 0
}
]
]
},
"Task Breakdown Agent Tool": {
"ai_tool": [
[
{
"node": "Project Orchestrator Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Project Orchestrator Agent": {
"main": [
[
{
"node": "Parse Agent Output",
"type": "main",
"index": 0
}
]
]
},
"Reallocation Output Parser": {
"ai_outputParser": [
[
{
"node": "Reallocation Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Task Assignment Agent Tool": {
"ai_tool": [
[
{
"node": "Project Orchestrator Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Merge Project and Team Data": {
"main": [
[
{
"node": "Project Orchestrator Agent",
"type": "main",
"index": 0
}
]
]
},
"Effort Estimation Agent Tool": {
"ai_tool": [
[
{
"node": "Project Orchestrator Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Task Breakdown Output Parser": {
"ai_outputParser": [
[
{
"node": "Project Orchestrator Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Anthropic Model - Orchestrator": {
"ai_languageModel": [
[
{
"node": "Project Orchestrator Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Anthropic Model - Reallocation": {
"ai_languageModel": [
[
{
"node": "Reallocation Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Anthropic Model - Task Breakdown": {
"ai_languageModel": [
[
{
"node": "Task Breakdown Agent Tool",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Anthropic Model - Task Assignment": {
"ai_languageModel": [
[
{
"node": "Task Assignment Agent Tool",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Anthropic Model - Effort Estimation": {
"ai_languageModel": [
[
{
"node": "Effort Estimation Agent Tool",
"type": "ai_languageModel",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
anthropicApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Automates daily project monitoring by fetching project data, analyzing tasks and team capacity with anthropic models, and generating resource optimization recommendations. Target audience: project managers, engineering leads, and resource planners managing complex team…
Source: https://n8n.io/workflows/11863/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow automates end-to-end marketing campaign management for digital marketing teams and agencies executing multi-channel strategies. It solves the complex challenge of coordinating personaliz
This workflow automates end-to-end ESG (Environmental, Social, and Governance) sustainability reporting for enterprise sustainability teams, compliance officers, and green governance leads. It solves
This workflow automates engineering governance by deploying a multi-agent AI system that validates designs, checks compliance, optimises safety, and predicts maintenance needs. Designed for engineerin
This workflow automates intelligent routing of user queries to optimal AI models (Anthropic, OpenAI) based on complexity analysis, then validates outputs through multi-stage quality assessment. Design
This workflow automates enterprise budget monitoring and cost optimization using Anthropic Claude as the core AI engine across multiple specialist agents. It targets finance teams, operations managers