AutomationFlowsAI & RAG › Automate Event Planning & Budget Optimization with Claude AI and Google Sheets

Automate Event Planning & Budget Optimization with Claude AI and Google Sheets

ByOneclick AI Squad @oneclick-ai on n8n.io

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,…

Webhook trigger★★★★☆ complexityAI-powered20 nodesGoogle SheetsAnthropic ChatAgentSlackEmail Send
AI & RAG Trigger: Webhook Nodes: 20 Complexity: ★★★★☆ AI nodes: yes Added:

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 →

Download .json
{
  "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.

Pro

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 →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

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

Agent, Anthropic Chat, HTTP Request +3
AI & RAG

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

Google Sheets, HTTP Request, Slack +10
AI & RAG

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

HTTP Request, Google Sheets, Agent +4
AI & RAG

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

Redis, Postgres, Agent +7
AI & RAG

Stop treating document review as a manual task. Let AI extract, classify, and route every contract, invoice, and NDA automatically.

HTTP Request, Chain Llm, Email Send +4