{
  "workflow": {
    "id": 10522,
    "name": "Automate conference travel approvals with Deepseek AI, Gmail and Google Sheets",
    "views": 106,
    "recentViews": 0,
    "totalViews": 106,
    "createdAt": "2025-11-05T08:13:39.956Z",
    "description": "## Introduction\nAutomates overseas conference approval requests to CEO. Generates emails with conference details, flight quotes, accommodation, expense breakdown, and admin procedures. Ensures consistency and saves time.\n\n## How It Works\nManual trigger initiates: fetches exchange rates/conference details, parses flight quotes, uses AI to calculate expenses and generate draft, checks budget, formats messages, merges versions, creates PDF, sends to CEO, logs to tracker.\n\n\n## Workflow Template\nManual Trigger → Configuration → [Exchange Rates + Conference Details + Flight Quotes] → AI Agent → [GPT-4 + Calculate + Extract + Generate Tools] → Total Expenses → Budget Check → [Format Approved + Warning] → Merge → PDF → Send CEO → Log Tracker\n## Workflow Steps\n1. **Initialization:** Manual trigger with conference parameters, sets variables (name, dates, location, funding)\n2. **Data Collection:** Fetches/parses exchange rates, conference details via HTTP, aggregates 3 flight quotations\n3. **AI Processing:** AI Agent orchestrates GPT-4 with Calculate, Extract, Generate tools for expense analysis and email drafting\n4. **Validation:** Calculates total expenses, validates against budget threshold\n5. **Formatting:** Customizes approval/warning messages by status, merges content versions\n6. **Delivery:** Generates PDF breakdown, dispatches via Gmail to CEO, logs to Google Sheets tracker\n\n## Setup Instructions\n1. **APIs:** Configure currency/conference endpoints with credentials\n2. **OpenAI:** Add GPT-4 API key in AI Agent\n3. **AI Tools:** Set Calculate, Extract, Generate parameters\n4. **Gmail:** Connect account, set CEO recipient\n5. **Sheets:** Link tracker with write permissions\n6. **Budget:** Set threshold (default: $5000)\n\n## Prerequisites\nn8n instance, Currency API, Conference API, OpenAI GPT-4 key, Gmail with OAuth, Google Sheets, PDF generator, Travel agent API\n\n## Use Cases\n**Academic:** Staff requests conference with grant, registration, 3 quotes, hotel, visa. AI generates email with PO/card procedures. **Sales:** Manager seeks client meeting approval with comparisons, per diem. **Training:** Employee requests certification with fees, accommodation, transport.\n\n## Customization\nModify thresholds by department. Add categories (insurance, baggage). Customize AI prompts for tone/branding. Integrate flight sources. Extend approval chain. Add travel restrictions.  \n\n## Benefits\n**Time Efficient:** Reduces prep from 60+ to 5 minutes. **AI-Powered:** Intelligent analysis and generation. **Consistent:** Ensures completeness. **Accurate:** Eliminates errors. ",
    "workflow": {
      "id": "81yLdORwZmVNF6Ja",
      "meta": {
        "instanceId": "b91e510ebae4127f953fd2f5f8d40d58ca1e71c746d4500c12ae86aad04c1502",
        "templateCredsSetupCompleted": true
      },
      "name": "AI-Deepseek-R1t Conference Travel Approval & Expense Authorization Request",
      "tags": [],
      "nodes": [
        {
          "id": "0d8d20d1-ebfd-48d5-a0f7-69df51d4dd87",
          "name": "Manual Trigger",
          "type": "n8n-nodes-base.manualTrigger",
          "position": [
            432,
            816
          ],
          "parameters": {},
          "typeVersion": 1
        },
        {
          "id": "ef08d98d-ba47-4d3f-acdf-c6940156c21e",
          "name": "Workflow Configuration",
          "type": "n8n-nodes-base.set",
          "position": [
            608,
            816
          ],
          "parameters": {
            "options": {},
            "assignments": {
              "assignments": [
                {
                  "id": "id-1",
                  "name": "conferenceName",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Conference name__>"
                },
                {
                  "id": "id-2",
                  "name": "conferenceDuration",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Conference duration (e.g., 3-5 June 2024)__>"
                },
                {
                  "id": "id-3",
                  "name": "hostCountry",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Host country__>"
                },
                {
                  "id": "id-4",
                  "name": "fundingSource",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Funding source (e.g., Research Grant XYZ)__>"
                },
                {
                  "id": "id-5",
                  "name": "registrationFee",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Conference registration fee__>"
                },
                {
                  "id": "id-6",
                  "name": "flightQuote1",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Flight quotation 1__>"
                },
                {
                  "id": "id-7",
                  "name": "flightQuote2",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Flight quotation 2__>"
                },
                {
                  "id": "id-8",
                  "name": "flightQuote3",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Flight quotation 3__>"
                },
                {
                  "id": "id-9",
                  "name": "accommodationCost",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Accommodation cost estimate__>"
                },
                {
                  "id": "id-10",
                  "name": "visaCost",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Visa cost estimate__>"
                },
                {
                  "id": "id-11",
                  "name": "mealsCost",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Meals cost estimate__>"
                },
                {
                  "id": "id-12",
                  "name": "transportCost",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Local transport cost estimate__>"
                },
                {
                  "id": "id-13",
                  "name": "ceoEmail",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__CEO email address__>"
                },
                {
                  "id": "id-14",
                  "name": "yourName",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Your name__>"
                },
                {
                  "id": "id-15",
                  "name": "yourPosition",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Your position/title__>"
                },
                {
                  "id": "id-16",
                  "name": "conferenceUrl",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Conference website URL__>"
                },
                {
                  "id": "id-17",
                  "name": "budgetLimit",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Budget limit for approval (e.g., 5000)__>"
                },
                {
                  "id": "id-18",
                  "name": "currency",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Currency code (e.g., USD, EUR, GBP)__>"
                },
                {
                  "id": "id-19",
                  "name": "exchangeRateApiKey",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Exchange rate API key (optional)__>"
                }
              ]
            },
            "includeOtherFields": true
          },
          "typeVersion": 3.4
        },
        {
          "id": "03741e53-ce18-43ac-9aab-041b53a30f2e",
          "name": "Fetch Exchange Rates",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            928,
            512
          ],
          "parameters": {
            "url": "=https://api.exchangerate-api.com/v4/latest/{{ $('Workflow Configuration').item.json.currency }}",
            "options": {},
            "sendHeaders": true,
            "headerParameters": {
              "parameters": [
                {
                  "name": "Accept",
                  "value": "application/json"
                }
              ]
            }
          },
          "typeVersion": 4.3
        },
        {
          "id": "f61e2b68-430a-40aa-94a7-73f8963a14bc",
          "name": "Get Conference Details",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            1072,
            1008
          ],
          "parameters": {
            "url": "={{ $('Workflow Configuration').item.json.conferenceUrl }}",
            "options": {},
            "sendHeaders": true,
            "headerParameters": {
              "parameters": [
                {
                  "name": "User-Agent",
                  "value": "n8n-workflow"
                }
              ]
            }
          },
          "typeVersion": 4.3
        },
        {
          "id": "0cf985e3-08ef-4005-b746-fe3a5ffd914f",
          "name": "Calculate Total Expenses",
          "type": "n8n-nodes-base.code",
          "position": [
            1456,
            944
          ],
          "parameters": {
            "jsCode": "// Calculate total expenses by summing all cost categories and converting to base currency\n\nconst config = $('Workflow Configuration').first().json;\nconst exchangeData = $('Extract Currency Data').first().json;\nconst flightOptions = $('Aggregate Flight Options').first().json;\nconst conferenceDetails = $('Get Conference Details').first().json;\n\n// Helper function to extract numeric value from string (handles currency symbols and formatting)\nfunction extractAmount(value) {\n  if (typeof value === 'number') return value;\n  if (!value) return 0;\n  \n  // Remove currency symbols, commas, and extract number\n  const cleaned = String(value).replace(/[^0-9.-]/g, '');\n  return parseFloat(cleaned) || 0;\n}\n\n// Extract all cost components\nconst registrationFee = extractAmount(config.registrationFee);\nconst accommodationCost = extractAmount(config.accommodationCost);\nconst visaCost = extractAmount(config.visaCost);\nconst mealsCost = extractAmount(config.mealsCost);\nconst transportCost = extractAmount(config.transportCost);\n\n// Parse flight quotations and find cheapest option\nconst flight1 = extractAmount(config.flightQuote1);\nconst flight2 = extractAmount(config.flightQuote2);\nconst flight3 = extractAmount(config.flightQuote3);\n\nconst flightQuotes = [\n  { option: 'A', amount: flight1, original: config.flightQuote1 },\n  { option: 'B', amount: flight2, original: config.flightQuote2 },\n  { option: 'C', amount: flight3, original: config.flightQuote3 }\n].filter(f => f.amount > 0);\n\n// Find cheapest flight\nconst cheapestFlight = flightQuotes.reduce((min, current) => \n  current.amount < min.amount ? current : min, \n  flightQuotes[0] || { option: 'N/A', amount: 0, original: '0' }\n);\n\n// Calculate total in local currency\nconst totalLocalCurrency = \n  registrationFee + \n  cheapestFlight.amount + \n  accommodationCost + \n  visaCost + \n  mealsCost + \n  transportCost;\n\n// Get exchange rate (default to 1 if not available)\nconst exchangeRate = exchangeData?.exchangeRate || 1;\nconst baseCurrency = exchangeData?.baseCurrency || 'USD';\nconst localCurrency = exchangeData?.localCurrency || 'USD';\n\n// Convert to USD\nconst totalInUSD = totalLocalCurrency * exchangeRate;\n\n// Create detailed breakdown\nconst breakdown = {\n  registrationFee: {\n    amount: registrationFee,\n    amountUSD: registrationFee * exchangeRate,\n    original: config.registrationFee\n  },\n  flight: {\n    amount: cheapestFlight.amount,\n    amountUSD: cheapestFlight.amount * exchangeRate,\n    original: cheapestFlight.original,\n    option: cheapestFlight.option\n  },\n  accommodation: {\n    amount: accommodationCost,\n    amountUSD: accommodationCost * exchangeRate,\n    original: config.accommodationCost\n  },\n  visa: {\n    amount: visaCost,\n    amountUSD: visaCost * exchangeRate,\n    original: config.visaCost\n  },\n  meals: {\n    amount: mealsCost,\n    amountUSD: mealsCost * exchangeRate,\n    original: config.mealsCost\n  },\n  transport: {\n    amount: transportCost,\n    amountUSD: transportCost * exchangeRate,\n    original: config.transportCost\n  }\n};\n\n// Currency conversion details\nconst currencyConversion = {\n  localCurrency: localCurrency,\n  baseCurrency: baseCurrency,\n  exchangeRate: exchangeRate,\n  totalLocal: totalLocalCurrency,\n  totalUSD: totalInUSD,\n  conversionDate: exchangeData?.date || new Date().toISOString().split('T')[0]\n};\n\n// Recommended flight details\nconst recommendedFlight = {\n  option: cheapestFlight.option,\n  amount: cheapestFlight.amount,\n  amountUSD: cheapestFlight.amount * exchangeRate,\n  original: cheapestFlight.original,\n  allOptions: flightQuotes.map(f => ({\n    option: f.option,\n    amount: f.amount,\n    amountUSD: f.amount * exchangeRate,\n    original: f.original\n  }))\n};\n\nreturn {\n  json: {\n    totalExpenses: totalLocalCurrency,\n    totalInUSD: totalInUSD,\n    breakdown: breakdown,\n    recommendedFlight: recommendedFlight,\n    currencyConversion: currencyConversion,\n    // Pass through original config for downstream nodes\n    conferenceName: config.conferenceName,\n    conferenceDuration: config.conferenceDuration,\n    hostCountry: config.hostCountry,\n    fundingSource: config.fundingSource,\n    ceoEmail: config.ceoEmail,\n    yourName: config.yourName,\n    yourPosition: config.yourPosition\n  }\n};"
          },
          "typeVersion": 2
        },
        {
          "id": "11ef4ad2-f2f5-4016-9883-d6ecb5c718f3",
          "name": "Parse Flight Quotes",
          "type": "n8n-nodes-base.code",
          "position": [
            752,
            1024
          ],
          "parameters": {
            "jsCode": "// Parse three flight quotations from configuration and extract structured data\n\nconst config = $input.first().json;\n\n// Extract flight quotation data\nconst flightQuote1 = config.flightQuote1 || '';\nconst flightQuote2 = config.flightQuote2 || '';\nconst flightQuote3 = config.flightQuote3 || '';\n\n// Helper function to parse flight quote string\n// Expected format examples:\n// \"Airline Name - $1,200 - Route: City A to City B - Duration: 8h 30m\"\n// \"Airline: XYZ Airways, Price: $850, Route: NYC-LON, Duration: 7h\"\nfunction parseFlightQuote(quoteString, quoteNumber) {\n  if (!quoteString || quoteString.includes('<__PLACEHOLDER_VALUE__')) {\n    return {\n      quoteNumber: quoteNumber,\n      airline: `[Airline ${quoteNumber}]`,\n      price: '[Price]',\n      route: '[Route]',\n      duration: '[Duration]',\n      rawQuote: quoteString\n    };\n  }\n\n  // Initialize parsed data\n  let airline = '';\n  let price = '';\n  let route = '';\n  let duration = '';\n\n  // Try to extract airline (usually at the beginning)\n  const airlineMatch = quoteString.match(/^([^-$,]+?)(?:\\s*[-:,]|\\s+\\$)/i);\n  if (airlineMatch) {\n    airline = airlineMatch[1].trim();\n  }\n\n  // Try to extract price (look for currency symbols and numbers)\n  const priceMatch = quoteString.match(/(?:price[:\\s]*)?([\\$£€¥]?\\s*[\\d,]+(?:\\.\\d{2})?(?:\\s*[A-Z]{3})?)/i);\n  if (priceMatch) {\n    price = priceMatch[1].trim();\n  }\n\n  // Try to extract route\n  const routeMatch = quoteString.match(/route[:\\s]*([^-,]+?)(?:\\s*[-,]|\\s+duration|$)/i);\n  if (routeMatch) {\n    route = routeMatch[1].trim();\n  } else {\n    // Alternative: look for city codes or \"to\" pattern\n    const routeAltMatch = quoteString.match(/([A-Z]{3}\\s*-\\s*[A-Z]{3}|[A-Za-z\\s]+\\s+to\\s+[A-Za-z\\s]+)/i);\n    if (routeAltMatch) {\n      route = routeAltMatch[1].trim();\n    }\n  }\n\n  // Try to extract duration\n  const durationMatch = quoteString.match(/duration[:\\s]*([\\d]+h?\\s*[\\d]*m?|[\\d]+:[\\d]+)/i);\n  if (durationMatch) {\n    duration = durationMatch[1].trim();\n  } else {\n    // Alternative: look for time patterns\n    const durationAltMatch = quoteString.match(/([\\d]+h\\s*[\\d]*m?|[\\d]+:[\\d]+)/i);\n    if (durationAltMatch) {\n      duration = durationAltMatch[1].trim();\n    }\n  }\n\n  return {\n    quoteNumber: quoteNumber,\n    airline: airline || `[Airline ${quoteNumber}]`,\n    price: price || '[Price]',\n    route: route || '[Route]',\n    duration: duration || '[Duration]',\n    rawQuote: quoteString\n  };\n}\n\n// Parse all three flight quotes\nconst parsedQuotes = [\n  parseFlightQuote(flightQuote1, 1),\n  parseFlightQuote(flightQuote2, 2),\n  parseFlightQuote(flightQuote3, 3)\n];\n\n// Return structured data for each quote as separate items\nreturn parsedQuotes.map(quote => ({\n  json: quote\n}));"
          },
          "typeVersion": 2
        },
        {
          "id": "b49ca159-d67e-4616-8471-4d2117e63c09",
          "name": "Check Budget Approval",
          "type": "n8n-nodes-base.if",
          "position": [
            1616,
            896
          ],
          "parameters": {
            "options": {},
            "conditions": {
              "options": {
                "leftValue": "",
                "caseSensitive": false,
                "typeValidation": "loose"
              },
              "combinator": "and",
              "conditions": [
                {
                  "id": "id-1",
                  "operator": {
                    "type": "number",
                    "operation": "lte"
                  },
                  "leftValue": "={{ $('Calculate Total Expenses').item.json.totalExpenses }}",
                  "rightValue": "={{ $('Workflow Configuration').item.json.budgetLimit }}"
                }
              ]
            }
          },
          "typeVersion": 2.2
        },
        {
          "id": "1e851a62-a2c5-4705-9475-4b94884cbb7b",
          "name": "Format Approved Email",
          "type": "n8n-nodes-base.set",
          "position": [
            1808,
            800
          ],
          "parameters": {
            "options": {},
            "assignments": {
              "assignments": [
                {
                  "id": "id-1",
                  "name": "approvalStatus",
                  "type": "string",
                  "value": "WITHIN BUDGET - APPROVED"
                },
                {
                  "id": "id-2",
                  "name": "budgetNote",
                  "type": "string",
                  "value": "Total expenses are within the approved budget limit"
                },
                {
                  "id": "id-3",
                  "name": "emailPriority",
                  "type": "string",
                  "value": "normal"
                }
              ]
            },
            "includeOtherFields": true
          },
          "typeVersion": 3.4
        },
        {
          "id": "ec6721fd-ce14-4f23-87b9-ffc261936041",
          "name": "Format Budget Warning",
          "type": "n8n-nodes-base.set",
          "position": [
            1808,
            992
          ],
          "parameters": {
            "options": {},
            "assignments": {
              "assignments": [
                {
                  "id": "id-1",
                  "name": "approvalStatus",
                  "type": "string",
                  "value": "EXCEEDS BUDGET - REQUIRES SPECIAL APPROVAL"
                },
                {
                  "id": "id-2",
                  "name": "budgetNote",
                  "type": "string",
                  "value": "WARNING: Total expenses exceed the standard budget limit. Additional justification required."
                },
                {
                  "id": "id-3",
                  "name": "emailPriority",
                  "type": "string",
                  "value": "high"
                }
              ]
            },
            "includeOtherFields": true
          },
          "typeVersion": 3.4
        },
        {
          "id": "5132d897-9b2a-41a0-9e29-b369d5088781",
          "name": "Merge Email Versions",
          "type": "n8n-nodes-base.merge",
          "position": [
            2000,
            896
          ],
          "parameters": {
            "mode": "combine",
            "options": {},
            "combineBy": "combineByPosition"
          },
          "typeVersion": 3.2
        },
        {
          "id": "cabe15e3-2646-421d-85d8-d6e93df6f5bc",
          "name": "Aggregate Flight Options",
          "type": "n8n-nodes-base.aggregate",
          "position": [
            1072,
            1168
          ],
          "parameters": {
            "options": {},
            "aggregate": "aggregateAllItemData"
          },
          "typeVersion": 1
        },
        {
          "id": "7cc4cbaa-1633-4979-a806-970facd09c5e",
          "name": "Send Email to CEO",
          "type": "n8n-nodes-base.gmail",
          "position": [
            2320,
            896
          ],
          "webhookId": "ab5e44b5-36d9-4b92-aac6-e0faf24fe1f3",
          "parameters": {
            "sendTo": "={{ $('Workflow Configuration').item.json.ceoEmail }}",
            "message": "={{ $json.emailDraft }}",
            "options": {},
            "subject": "={{ $json.subject }} - {{ $json.approvalStatus }}"
          },
          "credentials": {
            "gmailOAuth2": {
              "id": "credential-id",
              "name": "gmailOAuth2 Credential"
            }
          },
          "typeVersion": 2.1
        },
        {
          "id": "398626ee-0684-4f84-807b-cff1e9549649",
          "name": "Log to Expense Tracker",
          "type": "n8n-nodes-base.googleSheets",
          "position": [
            2480,
            896
          ],
          "parameters": {
            "columns": {
              "value": {
                "Date": "={{ $now.toFormat('yyyy-MM-dd') }}",
                "Email Sent": "Yes",
                "Host Country": "={{ $('AI Email Composer Agent').item.json.hostCountry }}",
                "Employee Name": "={{ $('AI Email Composer Agent').item.json.employeeName }}",
                "Total Expenses": "={{ $('Calculate Total Expenses').item.json.totalExpenses }}",
                "Approval Status": "Pending",
                "Conference Name": "={{ $('AI Email Composer Agent').item.json.conferenceName }}"
              },
              "schema": [
                {
                  "id": "Date",
                  "type": "string",
                  "required": false,
                  "displayName": "Date",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Employee Name",
                  "type": "string",
                  "required": false,
                  "displayName": "Employee Name",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Conference Name",
                  "type": "string",
                  "required": false,
                  "displayName": "Conference Name",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Host Country",
                  "type": "string",
                  "required": false,
                  "displayName": "Host Country",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Total Expenses",
                  "type": "string",
                  "required": false,
                  "displayName": "Total Expenses",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Approval Status",
                  "type": "string",
                  "required": false,
                  "displayName": "Approval Status",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Email Sent",
                  "type": "string",
                  "required": false,
                  "displayName": "Email Sent",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                }
              ],
              "mappingMode": "defineBelow",
              "matchingColumns": [
                "Date",
                "Employee Name",
                "Conference Name",
                "Host Country",
                "Total Expenses",
                "Approval Status",
                "Email Sent"
              ]
            },
            "options": {},
            "operation": "append",
            "sheetName": {
              "__rl": true,
              "mode": "name",
              "value": "Conference Requests"
            },
            "documentId": {
              "__rl": true,
              "mode": "id",
              "value": "<__PLACEHOLDER_VALUE__Google Sheets document ID__>"
            }
          },
          "credentials": {
            "googleSheetsOAuth2Api": {
              "id": "credential-id",
              "name": "googleSheetsOAuth2Api Credential"
            }
          },
          "typeVersion": 4.7
        },
        {
          "id": "0a7135cb-ce36-4563-a1c0-79b07d3c69ac",
          "name": "Generate PDF Attachment",
          "type": "n8n-nodes-base.code",
          "position": [
            2160,
            896
          ],
          "parameters": {
            "jsCode": "// Generate comprehensive PDF-ready HTML document for CEO conference approval request\n\nconst input = $input.first().json;\n\n// Extract data from previous nodes\nconst emailDraft = input.emailDraft || '';\nconst conferenceName = input.conferenceName || '[Conference Name]';\nconst conferenceDuration = input.conferenceDuration || '[Conference Duration]';\nconst hostCountry = input.hostCountry || '[Host Country]';\nconst fundingSource = input.fundingSource || '[Funding Source]';\nconst employeeName = input.employeeName || '[Employee Name]';\nconst employeePosition = input.employeePosition || '[Employee Position]';\n\n// Extract expense data\nconst registrationFee = input.registrationFee || '[Registration Fee]';\nconst flightQuote1 = input.flightQuote1 || '[Flight Quote 1]';\nconst flightQuote2 = input.flightQuote2 || '[Flight Quote 2]';\nconst flightQuote3 = input.flightQuote3 || '[Flight Quote 3]';\nconst accommodationCost = input.accommodationCost || '[Accommodation Cost]';\nconst visaCost = input.visaCost || '[Visa Cost]';\nconst mealsCost = input.mealsCost || '[Meals Cost]';\nconst transportCost = input.transportCost || '[Transport Cost]';\nconst totalExpenses = input.totalExpenses || '[Total Expenses]';\nconst approvalStatus = input.approvalStatus || 'Pending Review';\n\n// Generate current date\nconst currentDate = new Date().toLocaleDateString('en-US', { \n  year: 'numeric', \n  month: 'long', \n  day: 'numeric' \n});\n\n// Build comprehensive PDF-ready HTML document\nconst pdfHtml = `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Conference Approval Request - ${conferenceName}</title>\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n        \n        body {\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            line-height: 1.6;\n            color: #333;\n            background: #fff;\n            padding: 40px;\n            max-width: 1200px;\n            margin: 0 auto;\n        }\n        \n        .header {\n            border-bottom: 4px solid #2c3e50;\n            padding-bottom: 20px;\n            margin-bottom: 30px;\n        }\n        \n        .header h1 {\n            color: #2c3e50;\n            font-size: 28px;\n            margin-bottom: 10px;\n        }\n        \n        .header .meta {\n            color: #7f8c8d;\n            font-size: 14px;\n        }\n        \n        .section {\n            margin-bottom: 30px;\n            page-break-inside: avoid;\n        }\n        \n        .section-title {\n            background: #34495e;\n            color: white;\n            padding: 12px 20px;\n            font-size: 18px;\n            font-weight: bold;\n            margin-bottom: 15px;\n            border-radius: 4px;\n        }\n        \n        .info-grid {\n            display: grid;\n            grid-template-columns: 1fr 1fr;\n            gap: 15px;\n            margin-bottom: 20px;\n        }\n        \n        .info-item {\n            background: #ecf0f1;\n            padding: 15px;\n            border-radius: 4px;\n            border-left: 4px solid #3498db;\n        }\n        \n        .info-item label {\n            font-weight: bold;\n            color: #2c3e50;\n            display: block;\n            margin-bottom: 5px;\n            font-size: 12px;\n            text-transform: uppercase;\n        }\n        \n        .info-item .value {\n            color: #34495e;\n            font-size: 16px;\n        }\n        \n        table {\n            width: 100%;\n            border-collapse: collapse;\n            margin-bottom: 20px;\n            box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n        }\n        \n        table thead {\n            background: #2c3e50;\n            color: white;\n        }\n        \n        table th {\n            padding: 12px;\n            text-align: left;\n            font-weight: bold;\n            font-size: 14px;\n        }\n        \n        table td {\n            padding: 12px;\n            border-bottom: 1px solid #ecf0f1;\n        }\n        \n        table tbody tr:nth-child(even) {\n            background: #f8f9fa;\n        }\n        \n        table tbody tr:hover {\n            background: #e8f4f8;\n        }\n        \n        .total-row {\n            background: #3498db !important;\n            color: white;\n            font-weight: bold;\n            font-size: 16px;\n        }\n        \n        .flight-comparison {\n            display: grid;\n            grid-template-columns: repeat(3, 1fr);\n            gap: 15px;\n            margin-bottom: 20px;\n        }\n        \n        .flight-option {\n            background: #fff;\n            border: 2px solid #ecf0f1;\n            border-radius: 8px;\n            padding: 15px;\n            text-align: center;\n            transition: all 0.3s;\n        }\n        \n        .flight-option:hover {\n            border-color: #3498db;\n            box-shadow: 0 4px 8px rgba(52, 152, 219, 0.2);\n        }\n        \n        .flight-option .option-label {\n            background: #3498db;\n            color: white;\n            padding: 8px;\n            border-radius: 4px;\n            font-weight: bold;\n            margin-bottom: 10px;\n        }\n        \n        .flight-option .price {\n            font-size: 24px;\n            color: #2c3e50;\n            font-weight: bold;\n            margin: 10px 0;\n        }\n        \n        .checklist {\n            background: #fff;\n            border: 1px solid #ecf0f1;\n            border-radius: 4px;\n            padding: 20px;\n        }\n        \n        .checklist-item {\n            padding: 12px;\n            border-bottom: 1px solid #ecf0f1;\n            display: flex;\n            align-items: flex-start;\n        }\n        \n        .checklist-item:last-child {\n            border-bottom: none;\n        }\n        \n        .checklist-item .checkbox {\n            width: 20px;\n            height: 20px;\n            border: 2px solid #3498db;\n            border-radius: 3px;\n            margin-right: 15px;\n            flex-shrink: 0;\n            margin-top: 2px;\n        }\n        \n        .checklist-item .text {\n            flex: 1;\n        }\n        \n        .checklist-item .text strong {\n            color: #2c3e50;\n            display: block;\n            margin-bottom: 5px;\n        }\n        \n        .checklist-item .text ul {\n            margin-left: 20px;\n            margin-top: 5px;\n        }\n        \n        .checklist-item .text li {\n            color: #7f8c8d;\n            font-size: 14px;\n            margin-bottom: 3px;\n        }\n        \n        .approval-status {\n            background: #f39c12;\n            color: white;\n            padding: 20px;\n            border-radius: 8px;\n            text-align: center;\n            font-size: 20px;\n            font-weight: bold;\n            margin-bottom: 20px;\n        }\n        \n        .approval-status.approved {\n            background: #27ae60;\n        }\n        \n        .approval-status.rejected {\n            background: #e74c3c;\n        }\n        \n        .footer {\n            margin-top: 40px;\n            padding-top: 20px;\n            border-top: 2px solid #ecf0f1;\n            text-align: center;\n            color: #7f8c8d;\n            font-size: 12px;\n        }\n        \n        .signature-section {\n            margin-top: 40px;\n            padding: 20px;\n            background: #f8f9fa;\n            border-radius: 4px;\n        }\n        \n        .signature-line {\n            margin-top: 50px;\n            border-top: 2px solid #2c3e50;\n            padding-top: 10px;\n            display: inline-block;\n            min-width: 300px;\n        }\n        \n        @media print {\n            body {\n                padding: 20px;\n            }\n            \n            .section {\n                page-break-inside: avoid;\n            }\n        }\n    </style>\n</head>\n<body>\n    <div class=\"header\">\n        <h1>Conference Attendance Approval Request</h1>\n        <div class=\"meta\">\n            <strong>Document Generated:</strong> ${currentDate} | \n            <strong>Request ID:</strong> ${Date.now()}\n        </div>\n    </div>\n    \n    <div class=\"approval-status\">\n        Status: ${approvalStatus}\n    </div>\n    \n    <div class=\"section\">\n        <div class=\"section-title\">Conference Information</div>\n        <div class=\"info-grid\">\n            <div class=\"info-item\">\n                <label>Conference Name</label>\n                <div class=\"value\">${conferenceName}</div>\n            </div>\n            <div class=\"info-item\">\n                <label>Duration</label>\n                <div class=\"value\">${conferenceDuration}</div>\n            </div>\n            <div class=\"info-item\">\n                <label>Host Country</label>\n                <div class=\"value\">${hostCountry}</div>\n            </div>\n            <div class=\"info-item\">\n                <label>Funding Source</label>\n                <div class=\"value\">${fundingSource}</div>\n            </div>\n            <div class=\"info-item\">\n                <label>Employee Name</label>\n                <div class=\"value\">${employeeName}</div>\n            </div>\n            <div class=\"info-item\">\n                <label>Position</label>\n                <div class=\"value\">${employeePosition}</div>\n            </div>\n        </div>\n    </div>\n    \n    <div class=\"section\">\n        <div class=\"section-title\">Detailed Expense Breakdown</div>\n        <table>\n            <thead>\n                <tr>\n                    <th>Expense Category</th>\n                    <th>Description</th>\n                    <th style=\"text-align: right;\">Amount</th>\n                </tr>\n            </thead>\n            <tbody>\n                <tr>\n                    <td><strong>Conference Registration</strong></td>\n                    <td>Official conference registration fee</td>\n                    <td style=\"text-align: right;\">${registrationFee}</td>\n                </tr>\n                <tr>\n                    <td><strong>Flight (Selected Option)</strong></td>\n                    <td>Airfare - see flight comparison below</td>\n                    <td style=\"text-align: right;\">${flightQuote1}</td>\n                </tr>\n                <tr>\n                    <td><strong>Accommodation</strong></td>\n                    <td>Hotel/lodging for conference duration</td>\n                    <td style=\"text-align: right;\">${accommodationCost}</td>\n                </tr>\n                <tr>\n                    <td><strong>Visa Fees</strong></td>\n                    <td>Visa application and processing fees</td>\n                    <td style=\"text-align: right;\">${visaCost}</td>\n                </tr>\n                <tr>\n                    <td><strong>Meals & Daily Expenses</strong></td>\n                    <td>Per diem for meals and incidentals</td>\n                    <td style=\"text-align: right;\">${mealsCost}</td>\n                </tr>\n                <tr>\n                    <td><strong>Local Transport</strong></td>\n                    <td>Airport transfers and local transportation</td>\n                    <td style=\"text-align: right;\">${transportCost}</td>\n                </tr>\n                <tr class=\"total-row\">\n                    <td colspan=\"2\"><strong>TOTAL ESTIMATED EXPENSES</strong></td>\n                    <td style=\"text-align: right;\"><strong>${totalExpenses}</strong></td>\n                </tr>\n            </tbody>\n        </table>\n    </div>\n    \n    <div class=\"section\">\n        <div class=\"section-title\">Flight Comparison Chart</div>\n        <div class=\"flight-comparison\">\n            <div class=\"flight-option\">\n                <div class=\"option-label\">Option A</div>\n                <div class=\"price\">${flightQuote1}</div>\n                <div>Standard routing</div>\n            </div>\n            <div class=\"flight-option\">\n                <div class=\"option-label\">Option B</div>\n                <div class=\"price\">${flightQuote2}</div>\n                <div>Alternative carrier</div>\n            </div>\n            <div class=\"flight-option\">\n                <div class=\"option-label\">Option C</div>\n                <div class=\"price\">${flightQuote3}</div>\n                <div>Budget option</div>\n            </div>\n        </div>\n    </div>\n    \n    <div class=\"section\">\n        <div class=\"section-title\">Administrative Procedures Checklist</div>\n        <div class=\"checklist\">\n            <div class=\"checklist-item\">\n                <div class=\"checkbox\"></div>\n                <div class=\"text\">\n                    <strong>1. Conference Registration</strong>\n                    <ul>\n                        <li>Request invoice from conference organizer</li>\n                        <li>Create Purchase Order (PO) if bank transfer accepted</li>\n                        <li>Submit cash claim if paid by personal credit card</li>\n                        <li>Attach registration confirmation and receipt</li>\n                    </ul>\n                </div>\n            </div>\n            <div class=\"checklist-item\">\n                <div class=\"checkbox\"></div>\n                <div class=\"text\">\n                    <strong>2. Flight Booking</strong>\n                    <ul>\n                        <li>Select optimal flight option from three quotations</li>\n                        <li>Generate PO if booking through travel agent</li>\n                        <li>Submit cash claim with all quotations if paid personally</li>\n                        <li>Include booking confirmation and e-ticket itinerary</li>\n                    </ul>\n                </div>\n            </div>\n            <div class=\"checklist-item\">\n                <div class=\"checkbox\"></div>\n                <div class=\"text\">\n                    <strong>3. Accommodation</strong>\n                    <ul>\n                        <li>Confirm costs within company policy limits</li>\n                        <li>Book conference hotel or nearby alternative</li>\n                        <li>Submit cash claim with booking confirmation</li>\n                        <li>Include itemized hotel invoice and proof of payment</li>\n                    </ul>\n                </div>\n            </div>\n            <div class=\"checklist-item\">\n                <div class=\"checkbox\"></div>\n                <div class=\"text\">\n                    <strong>4. Visa Application</strong>\n                    <ul>\n                        <li>Apply for visa as required for ${hostCountry}</li>\n                        <li>Submit cash claim for visa fees</li>\n                        <li>Include visa application receipt and approval documentation</li>\n                    </ul>\n                </div>\n            </div>\n            <div class=\"checklist-item\">\n                <div class=\"checkbox\"></div>\n                <div class=\"text\">\n                    <strong>5. Expense Reporting</strong>\n                    <ul>\n                        <li>Maintain all receipts and supporting documentation</li>\n                        <li>Submit comprehensive expense report within 5 business days of return</li>\n                        <li>Include all original receipts and this approval document</li>\n                        <li>Attach conference attendance certificate if provided</li>\n                    </ul>\n                </div>\n            </div>\n        </div>\n    </div>\n    \n    <div class=\"section\">\n        <div class=\"section-title\">Post-Conference Deliverables</div>\n        <div class=\"checklist\">\n            <div class=\"checklist-item\">\n                <div class=\"checkbox\"></div>\n                <div class=\"text\">\n                    <strong>Comprehensive Summary Report</strong>\n                    Key insights and takeaways from conference sessions\n                </div>\n            </div>\n            <div class=\"checklist-item\">\n                <div class=\"checkbox\"></div>\n                <div class=\"text\">\n                    <strong>Team Presentation</strong>\n                    Present relevant sessions and best practices to team\n                </div>\n            </div>\n            <div class=\"checklist-item\">\n                <div class=\"checkbox\"></div>\n                <div class=\"text\">\n                    <strong>Implementation Recommendations</strong>\n                    Actionable strategies applicable to our organization\n                </div>\n            </div>\n            <div class=\"checklist-item\">\n                <div class=\"checkbox\"></div>\n                <div class=\"text\">\n                    <strong>Knowledge Sharing Session</strong>\n                    Department-wide session to share learnings\n                </div>\n            </div>\n        </div>\n    </div>\n    \n    <div class=\"signature-section\">\n        <p><strong>Employee Signature:</strong></p>\n        <div class=\"signature-line\">\n            ${employeeName}, ${employeePosition}\n        </div>\n        \n        <p style=\"margin-top: 40px;\"><strong>CEO Approval:</strong></p>\n        <div class=\"signature-line\">\n            Date: _________________\n        </div>\n    </div>\n    \n    <div class=\"footer\">\n        <p>This document was automatically generated by the Conference Approval System</p>\n        <p>For questions or clarifications, please contact the Finance Department</p>\n    </div>\n</body>\n</html>\n`;\n\n// Generate PDF filename\nconst sanitizedConferenceName = conferenceName.replace(/[^a-z0-9]/gi, '_').toLowerCase();\nconst timestamp = new Date().toISOString().split('T')[0];\nconst pdfFileName = `conference_approval_${sanitizedConferenceName}_${timestamp}.pdf`;\n\nreturn {\n  json: {\n    pdfHtml: pdfHtml,\n    pdfFileName: pdfFileName,\n    attachmentReady: true,\n    emailDraft: emailDraft,\n    conferenceName: conferenceName,\n    totalExpenses: totalExpenses,\n    approvalStatus: approvalStatus,\n    generatedDate: currentDate\n  }\n};"
          },
          "typeVersion": 2
        },
        {
          "id": "066eacb2-cded-432f-8445-eac669cea189",
          "name": "Extract Currency Data",
          "type": "n8n-nodes-base.set",
          "position": [
            1120,
            512
          ],
          "parameters": {
            "options": {},
            "assignments": {
              "assignments": [
                {
                  "id": "id-1",
                  "name": "exchangeRate",
                  "type": "number",
                  "value": "={{ $json.rates.USD }}"
                },
                {
                  "id": "id-2",
                  "name": "baseCurrency",
                  "type": "string",
                  "value": "={{ $json.base }}"
                },
                {
                  "id": "id-3",
                  "name": "lastUpdated",
                  "type": "string",
                  "value": "={{ $json.date }}"
                }
              ]
            },
            "includeOtherFields": true
          },
          "typeVersion": 3.4
        },
        {
          "id": "d4c07c73-432a-4f66-9b47-d711d7b79bbc",
          "name": "Sticky Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            448,
            304
          ],
          "parameters": {
            "width": 432,
            "height": 288,
            "content": "## Introduction\nAutomates overseas conference approval requests to CEO. Generates emails with conference details, flight quotes, accommodation, expense breakdown, and admin procedures. Ensures consistency and saves time.\n\n## How It Works\nManual trigger initiates: fetches exchange rates/conference details, parses flight quotes, uses AI to calculate expenses and generate draft, checks budget, formats messages, merges versions, creates PDF, sends to CEO, logs to tracker.\n\n\n"
          },
          "typeVersion": 1
        },
        {
          "id": "6622524c-a263-4550-8632-ae8af04b5b9c",
          "name": "AI Email Composer Agent",
          "type": "@n8n/n8n-nodes-langchain.agent",
          "position": [
            1024,
            656
          ],
          "parameters": {
            "text": "You are an expert business email composer specializing in conference approval requests. Generate a comprehensive, professional email to the CEO requesting approval to attend an overseas conference. Include: 1) Conference details (name, duration, host country), 2) Funding source, 3) Detailed expense breakdown with registration fee, three flight quotations, accommodation, visa, meals, and transport costs, 4) Administrative procedures covering: registration (request invoice and create PO if bank transfer accepted, otherwise pay with personal card and submit cash claim with email approval), flights (include 3 quotes, if through travel agent generate and approve PO before booking, if direct use personal card and attach approval plus quotations), accommodation (confirm within limits, prefer conference rates, if paid personally submit cash claim with approval), 5) Post-conference deliverables. Use the input data to fill in all details. Output should include fields: emailDraft (full email text), subject, recipient, conferenceName, conferenceDuration, hostCountry, fundingSource, employeeName, employeePosition.",
            "options": {},
            "promptType": "define"
          },
          "typeVersion": 3
        },
        {
          "id": "af94a729-823f-4b1d-8bdd-41f5b63038ca",
          "name": "Calculator Tool",
          "type": "@n8n/n8n-nodes-langchain.toolCalculator",
          "position": [
            1024,
            864
          ],
          "parameters": {},
          "typeVersion": 1
        },
        {
          "id": "ef466e89-8b96-4eac-a797-556f385df2e8",
          "name": "Expense Analysis Tool",
          "type": "@n8n/n8n-nodes-langchain.toolCode",
          "position": [
            1152,
            864
          ],
          "parameters": {
            "jsCode": "// Analyze expense breakdown and calculate totals, percentages, and budget compliance\n\n// Parse the input query to extract expense data\nconst expenseData = typeof query === 'string' ? JSON.parse(query) : query;\n\n// Extract expense categories\nconst categories = {\n  registrationFee: parseFloat(expenseData.registrationFee || 0),\n  flight: parseFloat(expenseData.flight || 0),\n  accommodation: parseFloat(expenseData.accommodation || 0),\n  visa: parseFloat(expenseData.visa || 0),\n  meals: parseFloat(expenseData.meals || 0),\n  transport: parseFloat(expenseData.transport || 0)\n};\n\n// Calculate total expenses\nconst totalExpenses = Object.values(categories).reduce((sum, amount) => sum + amount, 0);\n\n// Calculate percentage distribution\nconst percentageBreakdown = {};\nfor (const [category, amount] of Object.entries(categories)) {\n  percentageBreakdown[category] = totalExpenses > 0 ? ((amount / totalExpenses) * 100).toFixed(2) + '%' : '0%';\n}\n\n// Budget compliance check\nconst budgetLimit = parseFloat(expenseData.budgetLimit || 0);\nconst isWithinBudget = totalExpenses <= budgetLimit;\nconst budgetVariance = budgetLimit - totalExpenses;\nconst budgetVariancePercentage = budgetLimit > 0 ? ((budgetVariance / budgetLimit) * 100).toFixed(2) + '%' : '0%';\n\n// Generate recommendations\nconst recommendations = [];\nif (!isWithinBudget) {\n  recommendations.push('Total expenses exceed budget limit. Consider reducing costs.');\n  \n  // Identify highest expense categories\n  const sortedCategories = Object.entries(categories)\n    .sort((a, b) => b[1] - a[1])\n    .slice(0, 3);\n  \n  recommendations.push(`Highest expenses: ${sortedCategories.map(([cat, amt]) => `${cat} ($${amt})`).join(', ')}`);\n} else {\n  recommendations.push('Expenses are within budget.');\n  recommendations.push(`Budget remaining: $${budgetVariance.toFixed(2)} (${budgetVariancePercentage})`);\n}\n\n// Return structured analysis\nconst analysis = {\n  totalExpenses: totalExpenses.toFixed(2),\n  breakdown: categories,\n  percentageDistribution: percentageBreakdown,\n  budgetCompliance: {\n    budgetLimit: budgetLimit.toFixed(2),\n    isWithinBudget: isWithinBudget,\n    variance: budgetVariance.toFixed(2),\n    variancePercentage: budgetVariancePercentage\n  },\n  recommendations: recommendations\n};\n\nreturn JSON.stringify(analysis, null, 2);",
            "description": "Analyzes expense breakdown and calculates totals, percentages, and budget compliance"
          },
          "typeVersion": 1.3
        },
        {
          "id": "e9d19ed2-312a-45a9-93e9-cc32eafb1359",
          "name": "Flight Comparison Tool",
          "type": "@n8n/n8n-nodes-langchain.toolCode",
          "position": [
            1280,
            864
          ],
          "parameters": {
            "jsCode": "// Compare three flight quotations and recommend the best option\n// Input: query should contain flight quote data from the workflow\n\nconst config = $('Workflow Configuration').first().json;\n\n// Helper function to extract numeric value from string\nfunction extractAmount(value) {\n  if (typeof value === 'number') return value;\n  if (!value) return 0;\n  const cleaned = String(value).replace(/[^0-9.-]/g, '');\n  return parseFloat(cleaned) || 0;\n}\n\n// Helper function to extract duration in minutes\nfunction extractDurationMinutes(durationStr) {\n  if (!durationStr) return 0;\n  \n  // Match patterns like \"8h 30m\", \"8h\", \"30m\", \"8:30\"\n  const hoursMatch = durationStr.match(/(\\d+)\\s*h/);\n  const minutesMatch = durationStr.match(/(\\d+)\\s*m/);\n  const colonMatch = durationStr.match(/(\\d+):(\\d+)/);\n  \n  let totalMinutes = 0;\n  \n  if (colonMatch) {\n    totalMinutes = parseInt(colonMatch[1]) * 60 + parseInt(colonMatch[2]);\n  } else {\n    if (hoursMatch) totalMinutes += parseInt(hoursMatch[1]) * 60;\n    if (minutesMatch) totalMinutes += parseInt(minutesMatch[1]);\n  }\n  \n  return totalMinutes;\n}\n\n// Parse flight quotations\nconst flights = [\n  {\n    option: 'A',\n    price: extractAmount(config.flightQuote1),\n    duration: extractDurationMinutes(config.flightQuote1),\n    raw: config.flightQuote1\n  },\n  {\n    option: 'B',\n    price: extractAmount(config.flightQuote2),\n    duration: extractDurationMinutes(config.flightQuote2),\n    raw: config.flightQuote2\n  },\n  {\n    option: 'C',\n    price: extractAmount(config.flightQuote3),\n    duration: extractDurationMinutes(config.flightQuote3),\n    raw: config.flightQuote3\n  }\n].filter(f => f.price > 0);\n\nif (flights.length === 0) {\n  return 'No valid flight quotations available for comparison.';\n}\n\n// Find cheapest and fastest options\nconst cheapest = flights.reduce((min, f) => f.price < min.price ? f : min, flights[0]);\nconst fastest = flights.reduce((min, f) => f.duration < min.duration ? f : min, flights[0]);\n\n// Calculate savings\nconst maxPrice = Math.max(...flights.map(f => f.price));\nconst savings = maxPrice - cheapest.price;\nconst savingsPercent = ((savings / maxPrice) * 100).toFixed(1);\n\n// Format duration for display\nfunction formatDuration(minutes) {\n  const hours = Math.floor(minutes / 60);\n  const mins = minutes % 60;\n  return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n}\n\n// Build comparison table\nlet comparison = '\\n=== FLIGHT COMPARISON ===\\n\\n';\n\nflights.forEach(f => {\n  comparison += `Option ${f.option}: $${f.price.toFixed(2)} - ${formatDuration(f.duration)}`;\n  if (f.option === cheapest.option) comparison += ' ✓ CHEAPEST';\n  if (f.option === fastest.option) comparison += ' ⚡ FASTEST';\n  comparison += '\\n';\n});\n\ncomparison += `\\n--- RECOMMENDATION ---\\n`;\ncomparison += `Best Value: Option ${cheapest.option} at $${cheapest.price.toFixed(2)}\\n`;\ncomparison += `Savings: $${savings.toFixed(2)} (${savingsPercent}% less than most expensive)\\n`;\n\nif (cheapest.option === fastest.option) {\n  comparison += `\\n⭐ Option ${cheapest.option} is both the cheapest AND fastest - HIGHLY RECOMMENDED\\n`;\n} else {\n  const timeDiff = fastest.duration - cheapest.duration;\n  comparison += `\\nNote: Option ${fastest.option} is ${formatDuration(Math.abs(timeDiff))} faster but costs $${(fastest.price - cheapest.price).toFixed(2)} more.\\n`;\n}\n\nreturn comparison;",
            "description": "Compares three flight quotations and recommends the best option based on price, duration, and value"
          },
          "typeVersion": 1.3
        },
        {
          "id": "8f22dc11-0b4d-4efe-b3c3-45a8b219ddc0",
          "name": "OpenRouter Chat Model",
          "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
          "position": [
            896,
            832
          ],
          "parameters": {
            "model": "tngtech/deepseek-r1t-chimera:free",
            "options": {}
          },
          "credentials": {
            "openRouterApi": {
              "id": "credential-id",
              "name": "openRouterApi Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "e5599b51-e9a4-432e-87cc-0f139c495c64",
          "name": "Sticky Note1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            2000,
            304
          ],
          "parameters": {
            "color": 4,
            "width": 544,
            "height": 496,
            "content": "## Prerequisites\nn8n instance, Currency API, Conference API, OpenAI GPT-4 key, Gmail with OAuth, Google Sheets, PDF generator, Travel agent API\n\n## Use Cases\n**Academic:** Staff requests conference with grant, registration, 3 quotes, hotel, visa. AI generates email with PO/card procedures. **Sales:** Manager seeks client meeting approval with comparisons, per diem. **Training:** Employee requests certification with fees, accommodation, transport.\n\n## Customization\nModify thresholds by department. Add categories (insurance, baggage). Customize AI prompts for tone/branding. Integrate flight sources. Extend approval chain. Add travel restrictions.  \n\n## Benefits\n**Time Efficient:** Reduces prep from 60+ to 5 minutes. **AI-Powered:** Intelligent analysis and generation. **Consistent:** Ensures completeness. **Accurate:** Eliminates errors. "
          },
          "typeVersion": 1
        },
        {
          "id": "4f076598-cc6b-4642-aca6-2dadf1d03da7",
          "name": "Sticky Note2",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            1376,
            304
          ],
          "parameters": {
            "color": 6,
            "width": 608,
            "height": 480,
            "content": "## Workflow Steps\n1. **Initialization:** Manual trigger with conference parameters, sets variables (name, dates, location, funding)\n2. **Data Collection:** Fetches/parses exchange rates, conference details via HTTP, aggregates 3 flight quotations\n3. **AI Processing:** AI Agent orchestrates GPT-4 with Calculate, Extract, Generate tools for expense analysis and email drafting\n4. **Validation:** Calculates total expenses, validates against budget threshold\n5. **Formatting:** Customizes approval/warning messages by status, merges content versions\n6. **Delivery:** Generates PDF breakdown, dispatches via Gmail to CEO, logs to Google Sheets tracker\n\n## Setup Instructions\n1. **APIs:** Configure currency/conference endpoints with credentials\n2. **OpenAI:** Add GPT-4 API key in AI Agent\n3. **AI Tools:** Set Calculate, Extract, Generate parameters\n4. **Gmail:** Connect account, set CEO recipient\n5. **Sheets:** Link tracker with write permissions\n6. **Budget:** Set threshold (default: $5000)\n"
          },
          "typeVersion": 1
        },
        {
          "id": "6fda8224-afd3-43fd-9fea-05e5ebeeae89",
          "name": "Sticky Note3",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            912,
            304
          ],
          "parameters": {
            "color": 2,
            "width": 448,
            "content": "## Workflow Template\nManual Trigger → Configuration → [Exchange Rates + Conference Details + Flight Quotes] → AI Agent → [GPT-4 + Calculate + Extract + Generate Tools] → Total Expenses → Budget Check → [Format Approved + Warning] → Merge → PDF → Send CEO → Log Tracker\n"
          },
          "typeVersion": 1
        }
      ],
      "active": false,
      "pinData": {},
      "settings": {
        "executionOrder": "v1"
      },
      "versionId": "f7945aad-2194-42f9-8600-203d6e3aead9",
      "connections": {
        "Manual Trigger": {
          "main": [
            [
              {
                "node": "Workflow Configuration",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Calculator Tool": {
          "ai_tool": [
            [
              {
                "node": "AI Email Composer Agent",
                "type": "ai_tool",
                "index": 0
              }
            ]
          ]
        },
        "Send Email to CEO": {
          "main": [
            [
              {
                "node": "Log to Expense Tracker",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Parse Flight Quotes": {
          "main": [
            [
              {
                "node": "Aggregate Flight Options",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Fetch Exchange Rates": {
          "main": [
            [
              {
                "node": "Extract Currency Data",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Merge Email Versions": {
          "main": [
            [
              {
                "node": "Generate PDF Attachment",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Check Budget Approval": {
          "main": [
            [
              {
                "node": "Format Approved Email",
                "type": "main",
                "index": 0
              }
            ],
            [
              {
                "node": "Format Budget Warning",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Expense Analysis Tool": {
          "ai_tool": [
            [
              {
                "node": "AI Email Composer Agent",
                "type": "ai_tool",
                "index": 0
              }
            ]
          ]
        },
        "Extract Currency Data": {
          "main": [
            [
              {
                "node": "Calculate Total Expenses",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Format Approved Email": {
          "main": [
            [
              {
                "node": "Merge Email Versions",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Format Budget Warning": {
          "main": [
            [
              {
                "node": "Merge Email Versions",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "OpenRouter Chat Model": {
          "ai_languageModel": [
            [
              {
                "node": "AI Email Composer Agent",
                "type": "ai_languageModel",
                "index": 0
              }
            ]
          ]
        },
        "Flight Comparison Tool": {
          "ai_tool": [
            [
              {
                "node": "AI Email Composer Agent",
                "type": "ai_tool",
                "index": 0
              }
            ]
          ]
        },
        "Get Conference Details": {
          "main": [
            [
              {
                "node": "Calculate Total Expenses",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Workflow Configuration": {
          "main": [
            [
              {
                "node": "Fetch Exchange Rates",
                "type": "main",
                "index": 0
              },
              {
                "node": "Get Conference Details",
                "type": "main",
                "index": 0
              },
              {
                "node": "Parse Flight Quotes",
                "type": "main",
                "index": 0
              },
              {
                "node": "AI Email Composer Agent",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "AI Email Composer Agent": {
          "main": [
            [
              {
                "node": "Calculate Total Expenses",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Generate PDF Attachment": {
          "main": [
            [
              {
                "node": "Send Email to CEO",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Aggregate Flight Options": {
          "main": [
            [
              {
                "node": "Calculate Total Expenses",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Calculate Total Expenses": {
          "main": [
            [
              {
                "node": "Check Budget Approval",
                "type": "main",
                "index": 0
              }
            ]
          ]
        }
      }
    },
    "lastUpdatedBy": 1,
    "workflowInfo": {
      "nodeCount": 24,
      "nodeTypes": {
        "n8n-nodes-base.if": {
          "count": 1
        },
        "n8n-nodes-base.set": {
          "count": 4
        },
        "n8n-nodes-base.code": {
          "count": 3
        },
        "n8n-nodes-base.gmail": {
          "count": 1
        },
        "n8n-nodes-base.merge": {
          "count": 1
        },
        "n8n-nodes-base.aggregate": {
          "count": 1
        },
        "n8n-nodes-base.stickyNote": {
          "count": 4
        },
        "n8n-nodes-base.httpRequest": {
          "count": 2
        },
        "n8n-nodes-base.googleSheets": {
          "count": 1
        },
        "n8n-nodes-base.manualTrigger": {
          "count": 1
        },
        "@n8n/n8n-nodes-langchain.agent": {
          "count": 1
        },
        "@n8n/n8n-nodes-langchain.toolCode": {
          "count": 2
        },
        "@n8n/n8n-nodes-langchain.toolCalculator": {
          "count": 1
        },
        "@n8n/n8n-nodes-langchain.lmChatOpenRouter": {
          "count": 1
        }
      }
    },
    "status": "published",
    "user": {
      "name": "Cheng Siong Chin",
      "username": "cschin",
      "bio": "Dr. Cheng Siong CHIN is an n8n workflow creator specializing in AI-powered automation, agent orchestration, and intelligent system integrations. He designs and builds end-to-end workflows that combine LLMs, APIs, and data pipelines to streamline complex processes and deliver production-ready automation solutions. Contact me to discuss custom AI workflows and agent architectures.\n",
      "verified": true,
      "links": [
        "https://gravatar.com/mysticluminary9fa255f7f5"
      ],
      "avatar": "https://gravatar.com/avatar/54544f98e839bb9dd9a764ad1e6823eeddb6db5138d201e42f291a7b0a73303f?r=pg&d=retro&size=200"
    },
    "nodes": [
      {
        "id": 18,
        "icon": "file:googleSheets.svg",
        "name": "n8n-nodes-base.googleSheets",
        "codex": {
          "data": {
            "alias": [
              "CSV",
              "Sheet",
              "Spreadsheet",
              "GS"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/",
                  "icon": "❤️",
                  "label": "Love at first sight: Ricardo’s n8n journey"
                },
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/",
                  "icon": "🧾",
                  "label": "Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/creating-triggers-for-n8n-workflows-using-polling/",
                  "icon": "⏲",
                  "label": "Creating triggers for n8n workflows using polling"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/",
                  "icon": "📈",
                  "label": "Migrating Community Metrics to Orbit using n8n"
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/your-business-doesnt-need-you-to-operate/",
                  "icon": " 🖥️",
                  "label": "Hey founders! Your business doesn't need you to operate"
                },
                {
                  "url": "https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/",
                  "icon": "🍔",
                  "label": "How Honest Burgers Use Automation to Save $100k per year"
                },
                {
                  "url": "https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/",
                  "icon": "💻",
                  "label": "How a digital strategist uses n8n for online marketing"
                },
                {
                  "url": "https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/",
                  "icon": "🧠",
                  "label": "Why this Product Manager loves workflow automation with n8n"
                },
                {
                  "url": "https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/",
                  "icon": "🙌",
                  "label": "Sending Automated Congratulations with Google Sheets, Twilio, and n8n "
                },
                {
                  "url": "https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/",
                  "icon": "📈",
                  "label": "How a Membership Development Manager automates his work and investments"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"
                }
              ]
            },
            "categories": [
              "Data & Storage",
              "Productivity"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"input\",\"output\"]",
        "defaults": {
          "name": "Google Sheets"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNS42OSAxIDUyIDE3LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0OC4yOTMgNjBIMTIuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDkgNTYuMzEyVjQuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTIuNzA3IDF6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM1LjY5IDEgNTIgMTcuMjI1SDM5LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzkuMjExIDE3LjIyNSA1MiAyMi40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTIwLjEyIDMxLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMS42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzEuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNC42OSAwIDUxIDE2LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0Ny4yOTMgNTlIMTEuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDggNTUuMzEyVjMuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTEuNzA3IDB6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM0LjY5IDAgNTEgMTYuMjI1SDM4LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzguMjExIDE2LjIyNSA1MSAyMS40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE5LjEyIDMwLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMC42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzAuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjwvZz48L3N2Zz4="
        },
        "displayName": "Google Sheets",
        "typeVersion": 5,
        "nodeCategories": [
          {
            "id": 3,
            "name": "Data & Storage"
          },
          {
            "id": 4,
            "name": "Productivity"
          }
        ]
      },
      {
        "id": 19,
        "icon": "file:httprequest.svg",
        "name": "n8n-nodes-base.httpRequest",
        "codex": {
          "data": {
            "alias": [
              "API",
              "Request",
              "URL",
              "Build",
              "cURL"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/",
                  "icon": "☀️",
                  "label": "2021: The Year to Automate the New You with n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/",
                  "icon": "📈",
                  "label": "Automatically pulling and visualizing data with n8n"
                },
                {
                  "url": "https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/",
                  "icon": "✍️",
                  "label": "Learn how to automatically cross-post your content with n8n"
                },
                {
                  "url": "https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/",
                  "icon": "🧾",
                  "label": "Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/",
                  "icon": "🛳",
                  "label": "Running n8n on ships: An interview with Maranics"
                },
                {
                  "url": "https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/",
                  "icon": " 🪢",
                  "label": "What are APIs and how to use them with no code"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/world-poetry-day-workflow/",
                  "icon": "📜",
                  "label": "Celebrating World Poetry Day with a daily poem in Telegram"
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/",
                  "icon": "🎨",
                  "label": "Automate Designs with Bannerbear and n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/",
                  "icon": " 🕸️",
                  "label": "How uProc scraped a multi-page website with a low-code workflow"
                },
                {
                  "url": "https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/",
                  "icon": "📱",
                  "label": "Building an expense tracking app in 10 minutes"
                },
                {
                  "url": "https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/",
                  "icon": "🤖",
                  "label": "5 workflow automations for Mattermost that we love at n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/",
                  "icon": "🧰",
                  "label": "How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"
                },
                {
                  "url": "https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/",
                  "icon": "🦄",
                  "label": "Learn how to use webhooks with Mattermost slash commands"
                },
                {
                  "url": "https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/",
                  "icon": "📈",
                  "label": "How a Membership Development Manager automates his work and investments"
                },
                {
                  "url": "https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/",
                  "icon": "📈",
                  "label": "A low-code bitcoin ticker built with QuestDB and n8n.io"
                },
                {
                  "url": "https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/",
                  "icon": "🎡",
                  "label": "How to set up a no-code CI/CD pipeline with GitHub and TravisCI"
                },
                {
                  "url": "https://n8n.io/blog/automations-for-activists/",
                  "icon": "✨",
                  "label": "How Common Knowledge use workflow automation for activism"
                },
                {
                  "url": "https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/",
                  "icon": "🤟",
                  "label": "Creating scheduled text affirmations with n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/",
                  "icon": "🛵",
                  "label": "How Goomer automated their operations with over 200 n8n workflows"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"output\"]",
        "defaults": {
          "name": "HTTP Request",
          "color": "#0004F5"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="
        },
        "displayName": "HTTP Request",
        "typeVersion": 4,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 20,
        "icon": "fa:map-signs",
        "name": "n8n-nodes-base.if",
        "codex": {
          "data": {
            "alias": [
              "Router",
              "Filter",
              "Condition",
              "Logic",
              "Boolean",
              "Branch"
            ],
            "details": "The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.",
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/",
                  "icon": "🏭",
                  "label": "Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"
                },
                {
                  "url": "https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/",
                  "icon": "☀️",
                  "label": "2021: The Year to Automate the New You with n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/",
                  "icon": "🤬",
                  "label": "Create a toxic language detector for Telegram in 4 step"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/",
                  "icon": "🔗",
                  "label": "How to build a low-code, self-hosted URL shortener in 3 steps"
                },
                {
                  "url": "https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/",
                  "icon": "⚙️",
                  "label": "Automate your data processing pipeline in 9 steps"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/",
                  "icon": "🏷️",
                  "label": "How to automatically manage contributions to open-source projects"
                },
                {
                  "url": "https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/",
                  "icon": " 🕸️",
                  "label": "How uProc scraped a multi-page website with a low-code workflow"
                },
                {
                  "url": "https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/",
                  "icon": "🤖",
                  "label": "5 workflow automations for Mattermost that we love at n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/",
                  "icon": "🧠",
                  "label": "Why this Product Manager loves workflow automation with n8n"
                },
                {
                  "url": "https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/",
                  "icon": "🙌",
                  "label": "Sending Automated Congratulations with Google Sheets, Twilio, and n8n "
                },
                {
                  "url": "https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/",
                  "icon": "🎡",
                  "label": "How to set up a no-code CI/CD pipeline with GitHub and TravisCI"
                },
                {
                  "url": "https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/",
                  "icon": "🎖",
                  "label": "Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Flow"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "If",
          "color": "#408000"
        },
        "iconData": {
          "icon": "map-signs",
          "type": "icon"
        },
        "displayName": "If",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 24,
        "icon": "file:merge.svg",
        "name": "n8n-nodes-base.merge",
        "codex": {
          "data": {
            "alias": [
              "Join",
              "Concatenate",
              "Wait"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/how-to-sync-data-between-two-systems/",
                  "icon": "🏬",
                  "label": "How to synchronize data between two systems (one-way vs. two-way sync"
                },
                {
                  "url": "https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/",
                  "icon": "📈",
                  "label": "Migrating Community Metrics to Orbit using n8n"
                },
                {
                  "url": "https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/",
                  "icon": "👦",
                  "label": "Build your own virtual assistant with n8n: A step by step guide"
                },
                {
                  "url": "https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/",
                  "icon": "🙌",
                  "label": "Sending Automated Congratulations with Google Sheets, Twilio, and n8n "
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.merge/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Flow",
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Merge"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTc3XzUxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTAgNDhDMCAyMS40OTAzIDIxLjQ5MDMgMCA0OCAwSDExMkMxMzguNTEgMCAxNjAgMjEuNDkwMyAxNjAgNDhWNTZIMTk2LjI1MkMyNDAuNDM1IDU2IDI3Ni4yNTIgOTEuODE3MiAyNzYuMjUyIDEzNlYxOTJDMjc2LjI1MiAyMTQuMDkxIDI5NC4xNjEgMjMyIDMxNi4yNTIgMjMySDM1MlYyMjRDMzUyIDE5Ny40OSAzNzMuNDkgMTc2IDQwMCAxNzZINDY0QzQ5MC41MSAxNzYgNTEyIDE5Ny40OSA1MTIgMjI0VjI4OEM1MTIgMzE0LjUxIDQ5MC41MSAzMzYgNDY0IDMzNkg0MDBDMzczLjQ5IDMzNiAzNTIgMzE0LjUxIDM1MiAyODhWMjgwSDMxNi4yNTJDMjk0LjE2MSAyODAgMjc2LjI1MiAyOTcuOTA5IDI3Ni4yNTIgMzIwVjM3NkMyNzYuMjUyIDQyMC4xODMgMjQwLjQzNSA0NTYgMTk2LjI1MiA0NTZIMTYwVjQ2NEMxNjAgNDkwLjUxIDEzOC41MSA1MTIgMTEyIDUxMkg0OEMyMS40OTAzIDUxMiAwIDQ5MC41MSAwIDQ2NFY0MDBDMCAzNzMuNDkgMjEuNDkwMyAzNTIgNDggMzUySDExMkMxMzguNTEgMzUyIDE2MCAzNzMuNDkgMTYwIDQwMFY0MDhIMTk2LjI1MkMyMTMuOTI1IDQwOCAyMjguMjUyIDM5My42NzMgMjI4LjI1MiAzNzZWMzIwQzIyOC4yNTIgMjk0Ljc4NCAyMzguODU5IDI3Mi4wNDQgMjU1Ljg1MyAyNTZDMjM4Ljg1OSAyMzkuOTU2IDIyOC4yNTIgMjE3LjIxNiAyMjguMjUyIDE5MlYxMzZDMjI4LjI1MiAxMTguMzI3IDIxMy45MjUgMTA0IDE5Ni4yNTIgMTA0SDE2MFYxMTJDMTYwIDEzOC41MSAxMzguNTEgMTYwIDExMiAxNjBINDhDMjEuNDkwMyAxNjAgMCAxMzguNTEgMCAxMTJWNDhaTTEwNCA0OEMxMDguNDE4IDQ4IDExMiA1MS41ODE3IDExMiA1NlYxMDRDMTEyIDEwOC40MTggMTA4LjQxOCAxMTIgMTA0IDExMkg1NkM1MS41ODE3IDExMiA0OCAxMDguNDE4IDQ4IDEwNFY1NkM0OCA1MS41ODE3IDUxLjU4MTcgNDggNTYgNDhIMTA0Wk00NTYgMjI0QzQ2MC40MTggMjI0IDQ2NCAyMjcuNTgyIDQ2NCAyMzJWMjgwQzQ2NCAyODQuNDE4IDQ2MC40MTggMjg4IDQ1NiAyODhINDA4QzQwMy41ODIgMjg4IDQwMCAyODQuNDE4IDQwMCAyODBWMjMyQzQwMCAyMjcuNTgyIDQwMy41ODIgMjI0IDQwOCAyMjRINDU2Wk0xMTIgNDA4QzExMiA0MDMuNTgyIDEwOC40MTggNDAwIDEwNCA0MDBINTZDNTEuNTgxNyA0MDAgNDggNDAzLjU4MiA0OCA0MDhWNDU2QzQ4IDQ2MC40MTggNTEuNTgxNyA0NjQgNTYgNDY0SDEwNEMxMDguNDE4IDQ2NCAxMTIgNDYwLjQxOCAxMTIgNDU2VjQwOFoiIGZpbGw9IiM1NEI4QzkiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTc3XzUxOCI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="
        },
        "displayName": "Merge",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 38,
        "icon": "fa:pen",
        "name": "n8n-nodes-base.set",
        "codex": {
          "data": {
            "alias": [
              "Set",
              "JS",
              "JSON",
              "Filter",
              "Transform",
              "Map"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/",
                  "icon": "🏭",
                  "label": "Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"
                },
                {
                  "url": "https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/",
                  "icon": "☀️",
                  "label": "2021: The Year to Automate the New You with n8n"
                },
                {
                  "url": "https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/",
                  "icon": "📈",
                  "label": "Automatically pulling and visualizing data with n8n"
                },
                {
                  "url": "https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/",
                  "icon": "📡",
                  "label": "Database Monitoring and Alerting with n8n"
                },
                {
                  "url": "https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/",
                  "icon": "🧾",
                  "label": "Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/",
                  "icon": "🔗",
                  "label": "How to build a low-code, self-hosted URL shortener in 3 steps"
                },
                {
                  "url": "https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/",
                  "icon": "⚙️",
                  "label": "Automate your data processing pipeline in 9 steps"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/",
                  "icon": " 🕸️",
                  "label": "How uProc scraped a multi-page website with a low-code workflow"
                },
                {
                  "url": "https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/",
                  "icon": "📱",
                  "label": "Building an expense tracking app in 10 minutes"
                },
                {
                  "url": "https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/",
                  "icon": "📹",
                  "label": "The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/",
                  "icon": "🤖",
                  "label": "5 workflow automations for Mattermost that we love at n8n"
                },
                {
                  "url": "https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/",
                  "icon": "🧰",
                  "label": "Learn to Build Powerful API Endpoints Using Webhooks"
                },
                {
                  "url": "https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/",
                  "icon": "📈",
                  "label": "How a Membership Development Manager automates his work and investments"
                },
                {
                  "url": "https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/",
                  "icon": "📈",
                  "label": "A low-code bitcoin ticker built with QuestDB and n8n.io"
                },
                {
                  "url": "https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/",
                  "icon": "🎡",
                  "label": "How to set up a no-code CI/CD pipeline with GitHub and TravisCI"
                },
                {
                  "url": "https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/",
                  "icon": "🎖",
                  "label": "Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"
                },
                {
                  "url": "https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/",
                  "icon": "🛵",
                  "label": "How Goomer automated their operations with over 200 n8n workflows"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.set/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Edit Fields"
        },
        "iconData": {
          "icon": "pen",
          "type": "icon"
        },
        "displayName": "Edit Fields (Set)",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 356,
        "icon": "file:gmail.svg",
        "name": "n8n-nodes-base.gmail",
        "codex": {
          "data": {
            "alias": [
              "email",
              "human",
              "form",
              "wait",
              "hitl",
              "approval"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/your-business-doesnt-need-you-to-operate/",
                  "icon": " 🖥️",
                  "label": "Hey founders! Your business doesn't need you to operate"
                },
                {
                  "url": "https://n8n.io/blog/using-automation-to-boost-productivity-in-the-workplace/",
                  "icon": "💪",
                  "label": "Using Automation to Boost Productivity in the Workplace"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gmail/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"
                }
              ]
            },
            "categories": [
              "Communication",
              "HITL"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "HITL": [
                "Human in the Loop"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Gmail"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMTkzIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZmlsbD0iIzQyODVGNCIgZD0iTTU4LjE4MiAxOTIuMDVWOTMuMTRMMjcuNTA3IDY1LjA3NyAwIDQ5LjUwNHYxMjUuMDkxYzAgOS42NTggNy44MjUgMTcuNDU1IDE3LjQ1NSAxNy40NTV6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTE5Ny44MTggMTkyLjA1aDQwLjcyN2M5LjY1OSAwIDE3LjQ1NS03LjgyNiAxNy40NTUtMTcuNDU1VjQ5LjUwNWwtMzEuMTU2IDE3LjgzNy0yNy4wMjYgMjUuNzk4eiIvPjxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Im01OC4xODIgOTMuMTQtNC4xNzQtMzguNjQ3IDQuMTc0LTM2Ljk4OUwxMjggNjkuODY4bDY5LjgxOC01Mi4zNjQgNC42NyAzNC45OTItNC42NyA0MC42NDRMMTI4IDE0NS41MDR6Ii8+PHBhdGggZmlsbD0iI0ZCQkMwNCIgZD0iTTE5Ny44MTggMTcuNTA0VjkzLjE0TDI1NiA0OS41MDRWMjYuMjMxYzAtMjEuNTg1LTI0LjY0LTMzLjg5LTQxLjg5LTIwLjk0NXoiLz48cGF0aCBmaWxsPSIjQzUyMjFGIiBkPSJtMCA0OS41MDQgMjYuNzU5IDIwLjA3TDU4LjE4MiA5My4xNFYxNy41MDRMNDEuODkgNS4yODZDMjQuNjEtNy42NiAwIDQuNjQ2IDAgMjYuMjN6Ii8+PC9zdmc+"
        },
        "displayName": "Gmail",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 6,
            "name": "Communication"
          },
          {
            "id": 28,
            "name": "HITL"
          }
        ]
      },
      {
        "id": 565,
        "icon": "fa:sticky-note",
        "name": "n8n-nodes-base.stickyNote",
        "codex": {
          "data": {
            "alias": [
              "Comments",
              "Notes",
              "Sticky"
            ],
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Sticky Note",
          "color": "#FFD233"
        },
        "iconData": {
          "icon": "sticky-note",
          "type": "icon"
        },
        "displayName": "Sticky Note",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 834,
        "icon": "file:code.svg",
        "name": "n8n-nodes-base.code",
        "codex": {
          "data": {
            "alias": [
              "cpde",
              "Javascript",
              "JS",
              "Python",
              "Script",
              "Custom Code",
              "Function"
            ],
            "details": "The Code node allows you to execute JavaScript in your workflow.",
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers",
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Code"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="
        },
        "displayName": "Code",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 838,
        "icon": "fa:mouse-pointer",
        "name": "n8n-nodes-base.manualTrigger",
        "codex": {
          "data": {
            "resources": {
              "generic": [],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.manualworkflowtrigger/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"trigger\"]",
        "defaults": {
          "name": "When clicking ‘Execute workflow’",
          "color": "#909298"
        },
        "iconData": {
          "icon": "mouse-pointer",
          "type": "icon"
        },
        "displayName": "Manual Trigger",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 1119,
        "icon": "fa:robot",
        "name": "@n8n/n8n-nodes-langchain.agent",
        "codex": {
          "data": {
            "alias": [
              "LangChain",
              "Chat",
              "Conversational",
              "Plan and Execute",
              "ReAct",
              "Tools"
            ],
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/"
                }
              ]
            },
            "categories": [
              "AI",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Agents",
                "Root Nodes"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "AI Agent",
          "color": "#404040"
        },
        "iconData": {
          "icon": "robot",
          "type": "icon"
        },
        "displayName": "AI Agent",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 25,
            "name": "AI"
          },
          {
            "id": 26,
            "name": "Langchain"
          }
        ]
      },
      {
        "id": 1195,
        "icon": "fa:calculator",
        "name": "@n8n/n8n-nodes-langchain.toolCalculator",
        "codex": {
          "data": {
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.toolcalculator/"
                }
              ]
            },
            "categories": [
              "AI",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Tools"
              ],
              "Tools": [
                "Other Tools"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Calculator"
        },
        "iconData": {
          "icon": "calculator",
          "type": "icon"
        },
        "displayName": "Calculator",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 25,
            "name": "AI"
          },
          {
            "id": 26,
            "name": "Langchain"
          }
        ]
      },
      {
        "id": 1197,
        "icon": "fa:code",
        "name": "@n8n/n8n-nodes-langchain.toolCode",
        "codex": {
          "data": {
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.toolcode/"
                }
              ]
            },
            "categories": [
              "AI",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Tools"
              ],
              "Tools": [
                "Recommended Tools"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Code Tool"
        },
        "iconData": {
          "icon": "code",
          "type": "icon"
        },
        "displayName": "Code Tool",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 25,
            "name": "AI"
          },
          {
            "id": 26,
            "name": "Langchain"
          }
        ]
      },
      {
        "id": 1236,
        "icon": "file:aggregate.svg",
        "name": "n8n-nodes-base.aggregate",
        "codex": {
          "data": {
            "alias": [
              "Aggregate",
              "Combine",
              "Flatten",
              "Transform",
              "Array",
              "List",
              "Item"
            ],
            "details": "",
            "resources": {
              "generic": [],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.aggregate/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Aggregate"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJub25lIj48ZyBmaWxsPSIjRkY2RDVBIiBjbGlwLXBhdGg9InVybCgjYSkiPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTMyIDE0OGMwLTYuNjI3IDUuMzczLTEyIDEyLTEyaDE0NmM2LjYyNyAwIDEyIDUuMzczIDEyIDEydjI0YzAgNi42MjctNS4zNzMgMTItMTIgMTJINDRjLTYuNjI3IDAtMTItNS4zNzMtMTItMTJ6bTAgOTZjMC02LjYyNyA1LjM3My0xMiAxMi0xMmgxNDZjNi42MjcgMCAxMiA1LjM3MyAxMiAxMnYyNGMwIDYuNjI3LTUuMzczIDEyLTEyIDEySDQ0Yy02LjYyNyAwLTEyLTUuMzczLTEyLTEyem0wIDk2YzAtNi42MjcgNS4zNzMtMTIgMTItMTJoMTQ2YzYuNjI3IDAgMTIgNS4zNzMgMTIgMTJ2MjRjMCA2LjYyNy01LjM3MyAxMi0xMiAxMkg0NGMtNi42MjcgMC0xMi01LjM3My0xMi0xMnoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik03NCA3NmMwIDYuNjI3IDUuMzczIDEyIDEyIDEyaDExNi4yMTdjMTcuNjczIDAgMzIgMTQuMzI3IDMyIDMydjU2YzAgMjYuOTc4IDEwLjI3MiA1MS41NTcgMjcuMTE5IDcwLjAzOSA1LjA1NSA1LjU0NSA1LjA1NSAxNC4zNzcgMCAxOS45MjItMTYuODQ3IDE4LjQ4Mi0yNy4xMTkgNDMuMDYxLTI3LjExOSA3MC4wMzl2NTZjMCAxNy42NzMtMTQuMzI3IDMyLTMyIDMySDg2Yy02LjYyNyAwLTEyIDUuMzczLTEyIDEydjI0YzAgNi42MjcgNS4zNzMgMTIgMTIgMTJoMTE2LjIxN2M0NC4xODMgMCA4MC0zNS44MTcgODAtODB2LTU2YzAtMzAuOTI4IDI1LjA3Mi01NiA1Ni01NmE1Ljc4MyA1Ljc4MyAwIDAgMCA1Ljc4My01Ljc4M3YtMzYuNDM0YTUuNzgzIDUuNzgzIDAgMCAwLTUuNzgzLTUuNzgzYy0zMC45MjggMC01Ni0yNS4wNzItNTYtNTZ2LTU2YzAtNDQuMTgzLTM1LjgxNy04MC04MC04MEg4NmMtNi42MjcgMC0xMiA1LjM3My0xMiAxMnoiLz48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zNzYgMjQ0YzAtNi42MjcgNS4zNzMtMTIgMTItMTJoMTEyYzYuNjI3IDAgMTIgNS4zNzMgMTIgMTJ2MjRjMCA2LjYyNy01LjM3MyAxMi0xMiAxMkgzODhjLTYuNjI3IDAtMTItNS4zNzMtMTItMTJ6IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48L2c+PGRlZnM+PGNsaXBQYXRoIGlkPSJhIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMCAwaDUxMnY1MTJIMHoiLz48L2NsaXBQYXRoPjwvZGVmcz48L3N2Zz4="
        },
        "displayName": "Aggregate",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 1281,
        "icon": "file:openrouter.svg",
        "name": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
        "codex": {
          "data": {
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatopenrouter/"
                }
              ]
            },
            "categories": [
              "AI",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Language Models",
                "Root Nodes"
              ],
              "Language Models": [
                "Chat Models (Recommended)"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "OpenRouter Chat Model"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjOTRBM0I4IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgdmlld0JveD0iMCAwIDI0IDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjx0aXRsZT5PcGVuUm91dGVyPC90aXRsZT48cGF0aCBkPSJNMTYuODA0IDEuOTU3bDcuMjIgNC4xMDV2LjA4N0wxNi43MyAxMC4yMWwuMDE3LTIuMTE3LS44MjEtLjAzYy0xLjA1OS0uMDI4LTEuNjExLjAwMi0yLjI2OC4xMS0xLjA2NC4xNzUtMi4wMzguNTc3LTMuMTQ3IDEuMzUyTDguMzQ1IDExLjAzYy0uMjg0LjE5NS0uNDk1LjMzNi0uNjguNDU1bC0uNTE1LjMyMi0uMzk3LjIzNC4zODUuMjMuNTMuMzM4Yy40NzYuMzE0IDEuMTcuNzk2IDIuNzAxIDEuODY2IDEuMTEuNzc1IDIuMDgzIDEuMTc3IDMuMTQ3IDEuMzUybC4zLjA0NWMuNjk0LjA5MSAxLjM3NS4wOTQgMi44MjUuMDMzbC4wMjItMi4xNTkgNy4yMiA0LjEwNXYuMDg3TDE2LjU4OSAyMmwuMDE0LTEuODYyLS42MzUuMDIyYy0xLjM4Ni4wNDItMi4xMzcuMDAyLTMuMTM4LS4xNjItMS42OTQtLjI4LTMuMjYtLjkyNi00Ljg4MS0yLjA1OWwtMi4xNTgtMS41YTIxLjk5NyAyMS45OTcgMCAwMC0uNzU1LS40OThsLS40NjctLjI4YTU1LjkyNyA1NS45MjcgMCAwMC0uNzYtLjQzQzIuOTA4IDE0LjczLjU2MyAxNC4xMTYgMCAxNC4xMTZWOS44ODhsLjE0LjAwNGMuNTY0LS4wMDcgMi45MS0uNjIyIDMuODA5LTEuMTI0bDEuMDE2LS41OC40MzgtLjI3NGMuNDI4LS4yOCAxLjA3Mi0uNzI2IDIuNjg2LTEuODUzIDEuNjIxLTEuMTMzIDMuMTg2LTEuNzggNC44ODEtMi4wNTkgMS4xNTItLjE5IDEuOTc0LS4yMTMgMy44MTQtLjEzOGwuMDItMS45MDd6Ij48L3BhdGg+PC9zdmc+Cg=="
        },
        "displayName": "OpenRouter Chat Model",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 25,
            "name": "AI"
          },
          {
            "id": 26,
            "name": "Langchain"
          }
        ]
      }
    ],
    "categories": [
      {
        "id": 35,
        "name": "Document Extraction"
      },
      {
        "id": 51,
        "name": "Multimodal AI"
      }
    ],
    "image": []
  }
}