This workflow corresponds to n8n.io template #10219 — we link there as the canonical source.
This workflow follows the Agent → Emailsend 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": "KjnG4Wn0rWx8YM2N",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "AI Event & Budget Orchestration Suite",
"tags": [],
"nodes": [
{
"id": "a3da1a86-2036-4134-a947-6adc55068f04",
"name": "Orchestrate Trigger",
"type": "n8n-nodes-base.webhook",
"position": [
-560,
584
],
"parameters": {
"path": "event-orchestrate",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2
},
{
"id": "65fa224a-7f5a-49d2-9ec6-5dd24dd86f50",
"name": "Read Client Brief",
"type": "n8n-nodes-base.googleSheets",
"position": [
-336,
296
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "ClientBriefs"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.spreadsheetId || '1234567890abcdefghijklmnop' }}"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "3844dc0e-e84f-45ed-aa29-eb09ab4d7bcd",
"name": "Read Budget Estimates",
"type": "n8n-nodes-base.googleSheets",
"position": [
-336,
488
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "BudgetEstimates"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.spreadsheetId || '1234567890abcdefghijklmnop' }}"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "6545f261-99a3-4ca1-90d8-f5d514dcd68d",
"name": "Read Actual Costs",
"type": "n8n-nodes-base.googleSheets",
"position": [
-336,
680
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "ActualCosts"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.spreadsheetId || '1234567890abcdefghijklmnop' }}"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "8c47bb9f-4969-4627-8888-bf64df202de8",
"name": "Read Vendor Database",
"type": "n8n-nodes-base.googleSheets",
"position": [
-336,
872
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "VendorDatabase"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.vendorSpreadsheetId || $json.spreadsheetId }}"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "23f81562-d7e7-45c7-8c52-d42750b1b68f",
"name": "Fuse All Data",
"type": "n8n-nodes-base.merge",
"position": [
-112,
584
],
"parameters": {
"mode": "mergeByPosition"
},
"typeVersion": 3
},
{
"id": "c3ea1e44-1472-43e2-ac30-da2b19f17a6b",
"name": "Data Fusion Engine",
"type": "n8n-nodes-base.code",
"position": [
112,
584
],
"parameters": {
"jsCode": "const all = $input.all();\nconst brief = all.find(i => i.json.clientName)?.json || {};\nconst budgets = all.filter(i => i.json.budgetAmount !== undefined).map(i => i.json);\nconst actuals = all.filter(i => i.json.actualCost !== undefined).map(i => i.json);\nconst vendors = all.filter(i => i.json.vendorName).map(i => i.json);\n\n// Metadata\nconst meta = {\n eventId: brief.eventId || `EVT-${Date.now()}`,\n clientName: brief.clientName || 'Client',\n eventType: brief.eventType || 'Conference',\n attendees: parseInt(brief.attendees) || 150,\n targetBudget: parseFloat(brief.budget) || 75000,\n eventDate: brief.eventDate || 'TBD',\n plannerEmail: brief.plannerEmail || 'user@example.com',\n spreadsheetId: brief.spreadsheetId || '1234567890abcdefghijklmnop',\n teamChannel: brief.teamChannel || '#event-orchestration',\n priority: brief.priority || 'Medium'\n};\n\n// Budget aggregation\nlet totalBudgeted = 0, totalEstimated = 0, totalActual = 0;\nconst categories = {};\n\nbudgets.forEach(b => {\n const cat = b.category || 'Other';\n const budgeted = parseFloat(b.budgetAmount || 0);\n const estimated = parseFloat(b.estimatedCost || 0);\n totalBudgeted += budgeted;\n totalEstimated += estimated;\n if (!categories[cat]) categories[cat] = { budgeted: 0, estimated: 0, actual: 0, items: [] };\n categories[cat].budgeted += budgeted;\n categories[cat].estimated += estimated;\n categories[cat].items.push(b);\n});\n\nactuals.forEach(a => {\n const cat = a.category || 'Other';\n const actual = parseFloat(a.actualCost || 0);\n totalActual += actual;\n if if (categories[cat]) categories[cat].actual += actual;\n});\n\nconst variance = totalBudgeted - totalEstimated;\nconst variancePct = totalBudgeted > 0 ? ((variance / totalBudgeted) * 100).toFixed(2) : 0;\n\nreturn {\n json: {\n ...meta,\n budgets, actuals, vendors,\n totalBudgeted: totalBudgeted.toFixed(2),\n totalEstimated: totalEstimated.toFixed(2),\n totalActual: totalActual.toFixed(2),\n variance: variance.toFixed(2),\n variancePct,\n overBudget: variance < 0,\n categories: Object.values(categories),\n validation: { errors: [], warnings: [] },\n timestamp: new Date().toISOString()\n }\n};"
},
"typeVersion": 2
},
{
"id": "033b6830-f7af-4a48-be42-02d4f568d5ab",
"name": "Claude AI Core",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
408,
808
],
"parameters": {
"model": "claude-3-5-sonnet-20241022",
"options": {
"temperature": 0.3
}
},
"credentials": {
"anthropicApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "874f36ce-4862-4f15-988c-a5eb08d21594",
"name": "AI Orchestration Engine",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
336,
584
],
"parameters": {
"options": {
"systemMessage": "=You are an elite event orchestration strategist. Generate a complete event plan + budget optimization in JSON.\n\n**Client:** {{ $json.clientName }}\n**Event:** {{ $json.eventType }} | {{ $json.attendees }} guests | {{ $json.eventDate }}\n**Budget:** ${{ $json.totalBudgeted }} (Target: ${{ $json.targetBudget }}) | Variance: ${{ $json.variance }} ({{ $json.variancePct }}%)\n\n**Current Spend:** Estimated ${{ $json.totalEstimated }} | Actual ${{ $json.totalActual }}\n\n**Categories:** {{ $json.categories.map(c => `${c.category}: $${c.budgeted} \u2192 $${c.estimated}`).join(', ') }}\n\n**Vendors Available:** {{ $json.vendors.map(v => v.vendorName).join(', ') }}\n\n**Deliver JSON with:**\n- planSummary\n- optimizedTimeline (phases with dates)\n- optimizedBudgetBreakdown (category, current, recommended, savings)\n- taskList (task, owner, due, priority)\n- vendorRecommendations\n- riskAnalysis (risk, probability, impact, mitigation)\n- totalSavings, finalCost, roiImprovement\n- autoApproval: true/false"
}
},
"typeVersion": 2.2
},
{
"id": "5a91a3b7-02ac-49cf-9536-37dc72355e20",
"name": "Parse & Finalize",
"type": "n8n-nodes-base.code",
"position": [
688,
584
],
"parameters": {
"jsCode": "const ai = $input.first().json.response || $input.first().json.text;\nconst base = $('Data Fusion Engine').first().json;\nlet plan; try { plan = JSON.parse(ai.match(/\\{[\\s\\S]*\\}/)[0]); } catch { plan = { planSummary: 'AI parse failed' }; }\n\nconst savings = (plan.optimizedBudgetBreakdown || []).reduce((s, c) => s + (c.savings || 0), 0);\nconst final = base.totalEstimated - savings;\nconst roi = ((savings / base.totalEstimated) * 100).toFixed(1);\nconst riskScore = (plan.riskAnalysis || []).reduce((s, r) => s + (r.probability === 'High' ? 3 : r.probability === 'Medium' ? 2 : 1) * (r.impact === 'High' ? 3 : 2 : 1), 0);\nconst riskLevel = riskScore > 12 ? 'High' : riskScore > 6 ? 'Medium' : 'Low';\nconst autoApprove = plan.autoApproval !== false && riskLevel !== 'High' && savings > 0;\n\nreturn { json: { ...base, ...plan, totalSavings: savings.toFixed(2), finalCost: final.toFixed(2), roiImprovement: roi, riskScore, riskLevel, autoApprove, orchestratedAt: new Date().toISOString() } };"
},
"typeVersion": 2
},
{
"id": "83fbc169-9531-4ba2-9abd-8bfb8367b9b2",
"name": "Save Orchestrated Plan",
"type": "n8n-nodes-base.googleSheets",
"position": [
912,
392
],
"parameters": {
"columns": {
"value": {},
"schema": [],
"mappingMode": "autoMapInputData",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "OrchestratedPlans"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.spreadsheetId }}"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "3c2551b2-68ca-44c4-b60b-0c33b11c4f75",
"name": "Team Sync",
"type": "n8n-nodes-base.slack",
"position": [
912,
584
],
"parameters": {
"text": "=*{{ $json.eventId }}: {{ $json.clientName }} - {{ $json.eventType }}*\n\n*Status:* {{ $json.autoApprove ? 'AUTO-APPROVED' : 'REVIEW NEEDED' }}\n*Savings:* ${{ $json.totalSavings }} ({{ $json.roiImprovement }}% ROI)\n*Risk:* {{ $json.riskLevel }}\n\n{{ $json.autoApprove ? 'Proceeding to execution' : 'Team review required' }}\n\n[View Full Plan](https://docs.google.com/spreadsheets/d/{{ $json.spreadsheetId }})",
"select": "channel",
"channelId": "={{ $json.teamChannel }}",
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "0cb88543-7089-43e2-87d5-090da88bf447",
"name": "Executive Report",
"type": "n8n-nodes-base.emailSend",
"position": [
912,
776
],
"parameters": {
"options": {},
"subject": "={{ $json.autoApprove ? 'Approved' : 'Review' }}: {{ $json.eventId }} Plan & Budget",
"toEmail": "={{ $json.plannerEmail }}",
"fromEmail": "user@example.com"
},
"credentials": {
"smtp": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "90e4cb72-7890-4f58-ab49-51702e273cc1",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-592,
352
],
"parameters": {
"width": 160,
"height": 480,
"content": "Webhook (POST /event-orchestrate) or Daily @ 7 AM schedule"
},
"typeVersion": 1
},
{
"id": "f176b3a1-86c7-4d52-b928-3d64a7d7095d",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
80,
368
],
"parameters": {
"width": 160,
"height": 480,
"content": "Aggregates totals, calculates variance, validates data"
},
"typeVersion": 1
},
{
"id": "795cbb12-04b2-4540-a0b0-af0876ae2383",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
320,
368
],
"parameters": {
"width": 256,
"height": 480,
"content": "Sends structured prompt to Claude AI"
},
"typeVersion": 1
},
{
"id": "523ede3a-588a-45f2-bff7-05fc4dd0e8d0",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-144,
384
],
"parameters": {
"width": 160,
"height": 480,
"content": "Merges all sources into unified dataset"
},
"typeVersion": 1
},
{
"id": "71f0b271-cb1e-4ead-92b9-76f86fffb7c2",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-368,
-48
],
"parameters": {
"width": 160,
"height": 1104,
"content": "Pulls event metadata from ClientBriefs sheet\n\nFetches budgetAmount, estimatedCost, vendor\n\nLoads real-time spend from ActualCosts\n\nRetrieves pricing, ratings, and reliability"
},
"typeVersion": 1
},
{
"id": "abad8a6f-7029-4d85-8015-e4f332dc61ac",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
656,
368
],
"parameters": {
"width": 160,
"height": 480,
"content": "Extracts JSON, computes savings, ROI, risk, sets auto-approve"
},
"typeVersion": 1
},
{
"id": "d016d1ad-268d-4c5e-94c0-cba1694e883b",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
880,
80
],
"parameters": {
"width": 160,
"height": 848,
"content": "Writes full plan + KPIs to OrchestratedPlans\n\nPosts rich Slack message with status & link\n\nSends interactive HTML email to planner"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "0ab79068-95e9-4212-ba5c-bd692eaf49dc",
"connections": {
"Fuse All Data": {
"main": [
[
{
"node": "Data Fusion Engine",
"type": "main",
"index": 0
}
]
]
},
"Claude AI Core": {
"ai_languageModel": [
[
{
"node": "AI Orchestration Engine",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Parse & Finalize": {
"main": [
[
{
"node": "Save Orchestrated Plan",
"type": "main",
"index": 0
},
{
"node": "Team Sync",
"type": "main",
"index": 0
},
{
"node": "Executive Report",
"type": "main",
"index": 0
}
]
]
},
"Read Actual Costs": {
"main": [
[
{
"node": "Fuse All Data",
"type": "main",
"index": 0
}
]
]
},
"Read Client Brief": {
"main": [
[
{
"node": "Fuse All Data",
"type": "main",
"index": 0
}
]
]
},
"Data Fusion Engine": {
"main": [
[
{
"node": "AI Orchestration Engine",
"type": "main",
"index": 0
}
]
]
},
"Orchestrate Trigger": {
"main": [
[
{
"node": "Read Client Brief",
"type": "main",
"index": 0
},
{
"node": "Read Budget Estimates",
"type": "main",
"index": 0
},
{
"node": "Read Actual Costs",
"type": "main",
"index": 0
},
{
"node": "Read Vendor Database",
"type": "main",
"index": 0
}
]
]
},
"Read Vendor Database": {
"main": [
[
{
"node": "Fuse All Data",
"type": "main",
"index": 1
}
]
]
},
"Read Budget Estimates": {
"main": [
[
{
"node": "Fuse All Data",
"type": "main",
"index": 1
}
]
]
},
"AI Orchestration Engine": {
"main": [
[
{
"node": "Parse & Finalize",
"type": "main",
"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.
anthropicApigoogleApislackApismtp
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This enterprise-grade n8n workflow automates the entire event planning lifecycle — from client briefs to final reports — using Claude AI, real-time financial data, and smart integrations. It converts raw client data into optimized, insight-driven event plans with cost savings,…
Source: https://n8n.io/workflows/10219/ — 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 provides real-time detection of ransomware encryption patterns using Claude AI, with automated system isolation and incident response. File System Monitoring - Continuously monitors file
This n8n workflow orchestrates a powerful suite of AI Agents and automations to manage and optimize various aspects of an e-commerce operation, particularly for platforms like Shopify. It leverages La
Fully automates your service order pipeline from incoming booking to supplier confirmation — with built-in SLA enforcement and automatic escalation if a supplier goes silent. 📥 Receives orders via web
This workflow automates customer feedback processing by analyzing sentiment, identifying key issues, generating personalized responses, and escalating critical cases to support teams when required. De
Stop treating document review as a manual task. Let AI extract, classify, and route every contract, invoice, and NDA automatically.