{
  "workflow": {
    "id": 9777,
    "name": "Automate hotel price comparison with multi-platform scraping and email reporting",
    "views": 678,
    "recentViews": 1,
    "totalViews": 678,
    "createdAt": "2025-10-16T12:19:59.313Z",
    "description": "This is a **production-ready, end-to-end workflow** that automatically compares hotel prices across multiple booking platforms and delivers beautiful email reports to users. Unlike basic building blocks, this workflow is a complete solution ready to deploy.\n\n---\n\n## ✨ What Makes This Production-Ready\n\n### ✅ Complete End-to-End Automation\n- **Input**: Natural language queries via webhook\n- **Processing**: Multi-platform scraping & comparison\n- **Output**: Professional email reports + analytics\n- **Feedback**: Real-time webhook responses\n\n### ✅ Advanced Features\n- 🧠 Natural Language Processing for flexible queries\n- 🔄 Parallel scraping from multiple platforms\n- 📊 Analytics tracking with Google Sheets integration\n- 💌 Beautiful HTML email reports\n- 🛡️ Error handling and graceful degradation\n- 📱 Webhook responses for real-time feedback\n\n### ✅ Business Value\n- **For Travel Agencies**: Instant price comparison service for clients\n- **For Hotels**: Competitive pricing intelligence\n- **For Travelers**: Save time and money with automated research\n\n---\n\n## 🚀 Setup Instructions\n\n### Step 1: Import Workflow\n\n1. Copy the workflow JSON from the artifact\n2. In n8n, go to **Workflows** → **Import from File/URL**\n3. Paste the JSON and click **Import**\n\n### Step 2: Configure Credentials\n\n#### A. SMTP Email (Required)\n```\nSettings → Credentials → Add Credential → SMTP\n\nHost: smtp.gmail.com (for Gmail)\nPort: 587\nUser: your-email@gmail.com\nPassword: your-app-password (not regular password!)\n```\n\n**Gmail Setup:**\n1. Enable 2FA on your Google Account\n2. Generate App Password: https://myaccount.google.com/apppasswords\n3. Use the generated password in n8n\n\n#### B. Google Sheets (Optional - for analytics)\n```\nSettings → Credentials → Add Credential → Google Sheets OAuth2\n\nFollow the OAuth flow to connect your Google account\n```\n\n**Sheet Setup:**\n1. Create a new Google Sheet\n2. Name the first sheet \"Analytics\"\n3. Add headers: `timestamp`, `query`, `hotel`, `city`, `checkIn`, `checkOut`, `bestPrice`, `platform`, `totalResults`, `userEmail`\n4. Copy the Sheet ID from URL and paste in the \"Save to Google Sheets\" node\n\n### Step 3: Set Up Scraping Service\n\nYou need to create a scraping API that the workflow calls. Here are your options:\n\n#### Option A: Use Your Existing Python Script\n\n**Create a simple Flask API wrapper:**\n\n```python\n# api_wrapper.py\nfrom flask import Flask, request, jsonify\nimport subprocess\nimport json\n\napp = Flask(__name__)\n\n@app.route('/scrape/&lt;platform&gt;', methods=['POST'])\ndef scrape(platform):\n    data = request.json\n    query = f\"{data['checkIn']} to {data['checkOut']}, {data['hotel']}, {data['city']}\"\n    \n    try:\n        result = subprocess.run(\n            ['python3', 'price_scrap_2.py', query, platform],\n            capture_output=True,\n            text=True,\n            timeout=30\n        )\n        \n        # Parse your script output\n        output = result.stdout\n        # Assuming your script returns price data\n        \n        return jsonify({\n            'price': extracted_price,\n            'currency': 'USD',\n            'roomType': 'Standard Room',\n            'url': booking_url,\n            'availability': True\n        })\n    except Exception as e:\n        return jsonify({'error': str(e)}), 500\n\nif __name__ == '__main__':\n    app.run(host='0.0.0.0', port=5000)\n```\n\n**Deploy:**\n```bash\npip install flask\npython api_wrapper.py\n```\n\n**Update n8n HTTP Request nodes:**\n```\nURL: http://your-server-ip:5000/scrape/booking\nURL: http://your-server-ip:5000/scrape/agoda\nURL: http://your-server-ip:5000/scrape/expedia\n```\n\n#### Option B: Use Third-Party Scraping Services\n\n**Recommended Services:**\n- **ScraperAPI** (scraperapi.com) - $49/month for 100k requests\n- **Bright Data** (brightdata.com) - Pay as you go\n- **Apify** (apify.com) - Has pre-built hotel scrapers\n\n**Example with ScraperAPI:**\n```javascript\n// In HTTP Request node\nURL: http://api.scraperapi.com\nQuery Parameters:\n  api_key: YOUR_API_KEY\n  url: https://booking.com/search?hotel={{$json.hotelName}}...\n```\n\n#### Option C: Use n8n SSH Node (Like Your Original)\n\nKeep your SSH approach but improve it:\n\n1. Replace HTTP Request nodes with SSH nodes\n2. Point to your server with the Python script\n3. Ensure error handling and timeouts\n\n```javascript\n// SSH Node Configuration\nHost: your-server-ip\nCommand: python3 /path/to/price_scrap_2.py \"{{$json.hotelName}}\" \"{{$json.city}}\" \"{{$json.checkInISO}}\" \"{{$json.checkOutISO}}\" \"booking\"\n```\n\n### Step 4: Activate Webhook\n\n1. Click on \"Webhook - Receive Request\" node\n2. Click \"Listen for Test Event\"\n3. Copy the webhook URL (e.g., `https://your-n8n.com/webhook/hotel-price-check`)\n4. Test with this curl command:\n\n```bash\ncurl -X POST https://your-n8n.com/webhook/hotel-price-check \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"message\": \"I want to check Marriott Hotel in Singapore from 15th March to 18th March\",\n    \"email\": \"user@example.com\",\n    \"name\": \"John Doe\"\n  }'\n```\n\n### Step 5: Activate Workflow\n\n1. Toggle the workflow to **Active**\n2. The webhook is now live and ready to receive requests\n\n---\n\n## 📝 Usage Examples\n\n### Example 1: Basic Query\n```json\n{\n  \"message\": \"Hilton Hotel in Dubai from 20th December to 23rd December\",\n  \"email\": \"traveler@email.com\",\n  \"name\": \"Sarah\"\n}\n```\n\n### Example 2: Flexible Format\n```json\n{\n  \"message\": \"I need prices for Taj Hotel, Mumbai. Check-in: 5th January, Check-out: 8th January\",\n  \"email\": \"customer@email.com\"\n}\n```\n\n### Example 3: Short Format\n```json\n{\n  \"message\": \"Hyatt Singapore March 10 to March 13\",\n  \"email\": \"user@email.com\"\n}\n```\n\n---\n\n## 🎨 Customization Options\n\n### 1. Add More Booking Platforms\n\n**Steps:**\n1. Duplicate an existing \"Scrape\" node\n2. Update the platform parameter\n3. Connect it to \"Aggregate & Compare\"\n4. Update the aggregation logic to include the new platform\n\n### 2. Change Email Template\n\nEdit the \"Format Email Report\" node's JavaScript:\n- Modify HTML structure\n- Change colors (currently purple gradient)\n- Add your company logo\n- Include terms and conditions\n\n### 3. Add SMS Notifications\n\n**Using Twilio:**\n1. Add new node: Twilio → Send SMS\n2. Connect after \"Aggregate & Compare\"\n3. Format: \"Best deal: ${hotel} at ${platform} for ${price}\"\n\n### 4. Add Slack Integration\n\n1. Add Slack node after \"Aggregate & Compare\"\n2. Send to #travel-deals channel\n3. Include quick booking links\n\n### 5. Implement Caching\n\nAdd Redis or n8n's built-in cache:\n```javascript\n// Before scraping, check cache\nconst cacheKey = `${hotelName}-${city}-${checkIn}-${checkOut}`;\nconst cached = await $cache.get(cacheKey);\n\nif (cached && Date.now() - cached.timestamp &lt; 3600000) {\n  return cached.data; // Use 1-hour cache\n}\n```\n\n---\n\n## 📊 Analytics & Monitoring\n\n### Google Sheets Dashboard\n\nThe workflow automatically logs to Google Sheets. Create a dashboard with:\n\n**Metrics to track:**\n- Total searches per day/week\n- Most searched hotels\n- Most searched cities\n- Average price ranges\n- Platform with best prices (frequency)\n- User engagement (repeat users)\n\n**Example Sheet Formulas:**\n```\n// Total searches today\n=COUNTIF(A:A, TODAY())\n\n// Most popular hotel\n=INDEX(C:C, MODE(MATCH(C:C, C:C, 0)))\n\n// Average best price\n=AVERAGE(G:G)\n```\n\n### Set Up Alerts\n\nAdd a node after \"Aggregate & Compare\":\n```javascript\n// Alert if prices are unusually high\nif (bestDeal.price &gt; avgPrice * 1.5) {\n  // Send alert to admin\n  return [{\n    json: {\n      alert: true,\n      message: `High prices detected for ${hotelName}`\n    }\n  }];\n}\n```\n\n---\n\n## 🛡️ Error Handling\n\nThe workflow includes comprehensive error handling:\n\n### 1. Missing Information\nIf user doesn't provide hotel/city/dates → Responds with helpful prompt\n\n### 2. Scraping Failures\nIf all platforms fail → Sends \"No results\" email with suggestions\n\n### 3. Partial Results\nIf some platforms work → Shows available results + notes errors\n\n### 4. Email Delivery Issues\nUses `continueOnFail: true` to prevent workflow crashes\n\n---\n\n## 🔒 Security Best Practices\n\n### 1. Rate Limiting\nAdd rate limiting to prevent abuse:\n\n```javascript\n// In Parse & Validate node\nconst userEmail = $json.email;\nconst recentSearches = await $cache.get(`searches:${userEmail}`);\n\nif (recentSearches && recentSearches.length &gt; 10) {\n  return [{\n    json: {\n      status: 'rate_limited',\n      response: 'Too many requests. Please try again in 1 hour.'\n    }\n  }];\n}\n```\n\n### 2. Input Validation\nAlready implemented - validates hotel names, cities, dates\n\n### 3. Email Verification\nAdd email verification before first use:\n\n```javascript\n// Send verification code\nconst code = Math.random().toString(36).substring(7);\nawait $sendEmail({\n  to: userEmail,\n  subject: 'Verify your email',\n  body: `Your code: ${code}`\n});\n```\n\n### 4. API Key Protection\nNever expose scraping API keys in responses or logs\n---\n\n## 🚀 Deployment Options\n\n### Option 1: n8n Cloud (Easiest)\n1. Sign up at n8n.cloud\n2. Import workflow\n3. Configure credentials\n4. Activate\n\n**Pros:** No maintenance, automatic updates\n**Cons:** Monthly cost\n\n### Option 2: Self-Hosted (Most Control)\n```bash\n# Using Docker\ndocker run -it --rm \\\n  --name n8n \\\n  -p 5678:5678 \\\n  -v ~/.n8n:/home/node/.n8n \\\n  n8nio/n8n\n\n# Using npm\nnpm install -g n8n\nn8n start\n```\n\n**Pros:** Free, full control\n**Cons:** You manage updates\n\n### Option 3: Cloud Platforms\n- Railway.app (recommended for beginners)\n- DigitalOcean App Platform\n- AWS ECS\n- Google Cloud Run\n\n---\n\n## 📈 Scaling Recommendations\n\n### For &lt; 100 searches/day\n- Current setup is perfect\n- Use n8n Cloud Starter or small VPS\n\n### For 100-1000 searches/day\n- Add Redis caching (1-hour cache)\n- Use queue system for scraping\n- Upgrade to n8n Cloud Pro\n\n### For 1000+ searches/day\n- Implement job queue (Bull/Redis)\n- Use dedicated scraping service\n- Load balance multiple n8n instances\n- Consider microservices architecture\n\n---\n\n## 🐛 Troubleshooting\n\n### Issue: Webhook not responding\n**Solution:**\n1. Check workflow is Active\n2. Verify webhook URL is correct\n3. Check n8n logs: Settings → Log Streaming\n\n### Issue: No prices returned\n**Solution:**\n1. Test scraping endpoints individually\n2. Check if hotel name matches exactly\n3. Verify dates are in future\n4. Try different date ranges\n\n### Issue: Emails not sending\n**Solution:**\n1. Verify SMTP credentials\n2. Check \"less secure apps\" setting (Gmail)\n3. Use App Password instead of regular password\n4. Check spam folder\n\n### Issue: Slow response times\n**Solution:**\n1. Enable parallel scraping (already configured)\n2. Add timeout limits (30 seconds recommended)\n3. Implement caching\n4. Use faster scraping service",
    "workflow": {
      "id": "m3rGdoXJdGFTSnT6",
      "meta": {
        "instanceId": "dd69efaf8212c74ad206700d104739d3329588a6f3f8381a46a481f34c9cc281",
        "templateCredsSetupCompleted": true
      },
      "name": "Automate Hotel Price Comparison with Multi-Platform Scraping and Email Reporting",
      "tags": [],
      "nodes": [
        {
          "id": "fa0570b5-623e-4c19-b6de-f47b5e5fd9ac",
          "name": "Webhook - Receive Request",
          "type": "n8n-nodes-base.webhook",
          "position": [
            -944,
            -128
          ],
          "webhookId": "hotel-price-webhook",
          "parameters": {
            "path": "hotel-price-check",
            "options": {},
            "httpMethod": "POST",
            "responseMode": "responseNode"
          },
          "typeVersion": 1.1
        },
        {
          "id": "cdac9db5-4b10-45e6-940f-4a98ecbe8c4a",
          "name": "Parse & Validate Request",
          "type": "n8n-nodes-base.code",
          "position": [
            -720,
            -128
          ],
          "parameters": {
            "jsCode": "// Enhanced NLP Parser for Hotel Requests\nconst input = $input.first().json.body;\nconst query = input.message || input.query || input.text || '';\nconst userEmail = input.email || input.user_email || '';\nconst userName = input.name || input.user_name || 'Guest';\n\n// Greeting handler\nconst greetings = ['hi', 'hello', 'hey', 'start', 'help'];\nif (greetings.some(g => query.toLowerCase().includes(g)) && query.split(' ').length < 5) {\n  return [{\n    json: {\n      status: 'greeting',\n      response: `Hi ${userName}! 👋 I'm your Hotel Price Assistant.\\n\\nJust tell me:\\n✅ Hotel name\\n✅ City\\n✅ Check-in & check-out dates\\n\\nExample: \"Hilton Hotel in Singapore from 15th March to 18th March\"`,\n      userEmail,\n      userName\n    }\n  }];\n}\n\n// Date parsing with multiple formats\nfunction parseDate(text) {\n  const monthMap = {\n    jan: 0, january: 0, feb: 1, february: 1, mar: 2, march: 2,\n    apr: 3, april: 3, may: 4, jun: 5, june: 5,\n    jul: 6, july: 6, aug: 7, august: 7, sep: 8, september: 8,\n    oct: 9, october: 9, nov: 10, november: 10, dec: 11, december: 11\n  };\n\n  // Format: \"15th March\" or \"March 15\"\n  const dateRegex = /(\\d{1,2})(st|nd|rd|th)?\\s+(jan|january|feb|february|mar|march|apr|april|may|jun|june|jul|july|aug|august|sep|september|oct|october|nov|november|dec|december)|(jan|january|feb|february|mar|march|apr|april|may|jun|june|jul|july|aug|august|sep|september|oct|october|nov|november|dec|december)\\s+(\\d{1,2})(st|nd|rd|th)?/gi;\n  \n  const matches = [...text.matchAll(dateRegex)];\n  const dates = [];\n  const currentYear = new Date().getFullYear();\n  \n  matches.forEach(match => {\n    const day = parseInt(match[1] || match[6]);\n    const monthStr = (match[3] || match[4]).toLowerCase();\n    const month = monthMap[monthStr];\n    \n    if (day && month !== undefined) {\n      dates.push(new Date(currentYear, month, day));\n    }\n  });\n  \n  return dates.sort((a, b) => a - b);\n}\n\nconst dates = parseDate(query);\nlet checkInDate = null;\nlet checkOutDate = null;\n\nif (dates.length >= 2) {\n  checkInDate = dates[0];\n  checkOutDate = dates[1];\n} else if (dates.length === 1) {\n  checkInDate = dates[0];\n  // Default 3-night stay\n  checkOutDate = new Date(checkInDate);\n  checkOutDate.setDate(checkOutDate.getDate() + 3);\n}\n\n// Extract city\nconst cityPattern = /\\b(in|at|near)\\s+([a-z\\s]{3,20})(?=\\s+from|\\s+check|,|$)/i;\nconst cityMatch = query.match(cityPattern);\nlet city = cityMatch ? cityMatch[2].trim() : '';\n\n// Common cities fallback\nconst commonCities = ['singapore', 'mumbai', 'delhi', 'bangalore', 'goa', 'london', 'paris', 'dubai', 'new york', 'tokyo', 'bangkok'];\ncity = city || commonCities.find(c => query.toLowerCase().includes(c)) || '';\n\n// Extract hotel name\nlet hotelName = query\n  .replace(/from\\s+\\d/gi, '')\n  .replace(/to\\s+\\d/gi, '')\n  .replace(/check[- ]?in/gi, '')\n  .replace(/check[- ]?out/gi, '')\n  .replace(/\\d{1,2}(st|nd|rd|th)?\\s+\\w+/gi, '')\n  .replace(new RegExp(`\\\\b(in|at|near)\\\\s+${city}\\\\b`, 'gi'), '')\n  .replace(/hotel|room|price|want|need|know|please|for|dates?/gi, '')\n  .trim();\n\n// Clean hotel name\nhotelName = hotelName.split(/[,.]/).filter(p => p.trim().length > 2)[0]?.trim() || '';\n\n// Validation\nconst errors = [];\nif (!hotelName || hotelName.length < 3) errors.push('hotel name');\nif (!city) errors.push('city');\nif (!checkInDate) errors.push('check-in date');\nif (!checkOutDate) errors.push('check-out date');\n\nif (errors.length > 0) {\n  return [{\n    json: {\n      status: 'missing_info',\n      response: `I need more information. Please provide: ${errors.join(', ')}.\\n\\nExample: \"Marriott Hotel in Dubai from 20th December to 23rd December\"`,\n      userEmail,\n      userName\n    }\n  }];\n}\n\n// Format dates\nconst formatDate = (date) => {\n  const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n  return `${date.getDate()} ${months[date.getMonth()]} ${date.getFullYear()}`;\n};\n\nconst nights = Math.ceil((checkOutDate - checkInDate) / (1000 * 60 * 60 * 24));\n\nreturn [{\n  json: {\n    status: 'ready',\n    hotelName: hotelName.split(' ').map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(' '),\n    city: city.split(' ').map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(' '),\n    checkIn: formatDate(checkInDate),\n    checkOut: formatDate(checkOutDate),\n    checkInISO: checkInDate.toISOString().split('T')[0],\n    checkOutISO: checkOutDate.toISOString().split('T')[0],\n    nights,\n    userEmail,\n    userName,\n    originalQuery: query\n  }\n}];\n"
          },
          "typeVersion": 2
        },
        {
          "id": "e6bc8693-f361-4e71-bc5b-3fee26331176",
          "name": "Check If Ready",
          "type": "n8n-nodes-base.if",
          "position": [
            -496,
            -128
          ],
          "parameters": {
            "conditions": {
              "string": [
                {
                  "value1": "={{$json.status}}",
                  "value2": "ready"
                }
              ]
            }
          },
          "typeVersion": 1
        },
        {
          "id": "3bfffcf2-29fc-4a34-9aef-d88bebc1291f",
          "name": "Scrape Booking.com",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            -272,
            -416
          ],
          "parameters": {
            "url": "https://api.example.com/scrape/booking",
            "method": "POST",
            "options": {},
            "sendBody": true,
            "bodyParameters": {
              "parameters": [
                {
                  "name": "hotel",
                  "value": "={{$json.hotelName}}"
                },
                {
                  "name": "city",
                  "value": "={{$json.city}}"
                },
                {
                  "name": "checkIn",
                  "value": "={{$json.checkInISO}}"
                },
                {
                  "name": "checkOut",
                  "value": "={{$json.checkOutISO}}"
                },
                {
                  "name": "platform",
                  "value": "booking"
                }
              ]
            }
          },
          "typeVersion": 4.1,
          "continueOnFail": true
        },
        {
          "id": "1fbf0962-d1e2-4b18-9b5f-8ddbbbec6060",
          "name": "Scrape Agoda",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            -272,
            -224
          ],
          "parameters": {
            "url": "https://api.example.com/scrape/agoda",
            "method": "POST",
            "options": {},
            "sendBody": true,
            "bodyParameters": {
              "parameters": [
                {
                  "name": "hotel",
                  "value": "={{$json.hotelName}}"
                },
                {
                  "name": "city",
                  "value": "={{$json.city}}"
                },
                {
                  "name": "checkIn",
                  "value": "={{$json.checkInISO}}"
                },
                {
                  "name": "checkOut",
                  "value": "={{$json.checkOutISO}}"
                },
                {
                  "name": "platform",
                  "value": "agoda"
                }
              ]
            }
          },
          "typeVersion": 4.1,
          "continueOnFail": true
        },
        {
          "id": "9044675b-7dbd-43b1-9dd7-2adc3f176d48",
          "name": "Scrape Expedia",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            -272,
            -32
          ],
          "parameters": {
            "url": "https://api.example.com/scrape/expedia",
            "method": "POST",
            "options": {},
            "sendBody": true,
            "bodyParameters": {
              "parameters": [
                {
                  "name": "hotel",
                  "value": "={{$json.hotelName}}"
                },
                {
                  "name": "city",
                  "value": "={{$json.city}}"
                },
                {
                  "name": "checkIn",
                  "value": "={{$json.checkInISO}}"
                },
                {
                  "name": "checkOut",
                  "value": "={{$json.checkOutISO}}"
                },
                {
                  "name": "platform",
                  "value": "expedia"
                }
              ]
            }
          },
          "typeVersion": 4.1,
          "continueOnFail": true
        },
        {
          "id": "401b0e56-d028-4345-8b4a-0920e6a678f5",
          "name": "Aggregate & Compare",
          "type": "n8n-nodes-base.code",
          "position": [
            -48,
            -224
          ],
          "parameters": {
            "jsCode": "// Aggregate and compare prices from all platforms\nconst items = $input.all();\nconst searchData = items[0].json;\n\nconst prices = [];\nconst errors = [];\n\n// Process each platform result\nitems.slice(1).forEach((item, index) => {\n  const platforms = ['Booking.com', 'Agoda', 'Expedia'];\n  const platform = platforms[index];\n  \n  if (item.json.error) {\n    errors.push(`${platform}: Unable to fetch`);\n  } else if (item.json.price) {\n    prices.push({\n      platform,\n      price: parseFloat(item.json.price),\n      currency: item.json.currency || 'USD',\n      roomType: item.json.roomType || 'Standard Room',\n      url: item.json.url || '#',\n      availability: item.json.availability !== false\n    });\n  }\n});\n\n// Sort by price\nprices.sort((a, b) => a.price - b.price);\n\nif (prices.length === 0) {\n  return [{\n    json: {\n      status: 'no_results',\n      message: 'Unable to find prices. The hotel might not be available for these dates.',\n      errors,\n      ...searchData\n    }\n  }];\n}\n\nconst bestDeal = prices[0];\nconst avgPrice = prices.reduce((sum, p) => sum + p.price, 0) / prices.length;\nconst savings = prices.length > 1 ? prices[prices.length - 1].price - bestDeal.price : 0;\n\nreturn [{\n  json: {\n    status: 'success',\n    ...searchData,\n    results: prices,\n    bestDeal,\n    avgPrice: Math.round(avgPrice),\n    savings: Math.round(savings),\n    totalResults: prices.length,\n    errors\n  }\n}];\n"
          },
          "typeVersion": 2
        },
        {
          "id": "0e569c2e-fd37-4bf8-a80e-385dd6580b10",
          "name": "Format Email Report",
          "type": "n8n-nodes-base.code",
          "position": [
            176,
            -224
          ],
          "parameters": {
            "jsCode": "// Format beautiful email with comparison\nconst data = $input.first().json;\n\nif (data.status === 'no_results') {\n  return [{\n    json: {\n      subject: `❌ No Results - ${data.hotelName}, ${data.city}`,\n      html: `\n        <div style=\"font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;\">\n          <h2>❌ Unable to Find Prices</h2>\n          <p>We couldn't find available prices for:</p>\n          <div style=\"background: #f5f5f5; padding: 15px; border-radius: 8px;\">\n            <strong>${data.hotelName}</strong><br>\n            📍 ${data.city}<br>\n            📅 ${data.checkIn} to ${data.checkOut} (${data.nights} nights)\n          </div>\n          <p style=\"margin-top: 20px;\">Possible reasons:</p>\n          <ul>\n            <li>Hotel not available on these dates</li>\n            <li>Hotel name might be different on booking platforms</li>\n            <li>No rooms available</li>\n          </ul>\n          <p>Please try:</p>\n          <ul>\n            <li>Different dates</li>\n            <li>Checking the exact hotel name</li>\n            <li>Another hotel in ${data.city}</li>\n          </ul>\n        </div>\n      `,\n      ...data\n    }\n  }];\n}\n\nconst { hotelName, city, checkIn, checkOut, nights, results, bestDeal, avgPrice, savings } = data;\n\nconst resultsHtml = results.map((r, i) => `\n  <tr style=\"${i === 0 ? 'background: #e8f5e9;' : ''}\">\n    <td style=\"padding: 12px; border-bottom: 1px solid #ddd;\">\n      ${i === 0 ? '🏆 ' : ''}<strong>${r.platform}</strong>\n    </td>\n    <td style=\"padding: 12px; border-bottom: 1px solid #ddd;\">${r.roomType}</td>\n    <td style=\"padding: 12px; border-bottom: 1px solid #ddd; text-align: right;\">\n      <strong style=\"color: ${i === 0 ? '#2e7d32' : '#333'}; font-size: 18px;\">\n        ${r.currency} ${r.price.toLocaleString()}\n      </strong>\n    </td>\n    <td style=\"padding: 12px; border-bottom: 1px solid #ddd; text-align: center;\">\n      <a href=\"${r.url}\" style=\"background: #1976d2; color: white; padding: 8px 16px; text-decoration: none; border-radius: 4px; display: inline-block;\">View</a>\n    </td>\n  </tr>\n`).join('');\n\nconst html = `\n<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n</head>\n<body style=\"margin: 0; padding: 20px; background: #f5f5f5; font-family: Arial, sans-serif;\">\n  <div style=\"max-width: 650px; margin: 0 auto; background: white; border-radius: 12px; overflow: hidden; box-shadow: 0 2px 8px rgba(0,0,0,0.1);\">\n    \n    <!-- Header -->\n    <div style=\"background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 30px; text-align: center;\">\n      <h1 style=\"margin: 0; font-size: 28px;\">🏨 Hotel Price Comparison</h1>\n      <p style=\"margin: 10px 0 0 0; opacity: 0.9;\">Best deals for your stay</p>\n    </div>\n\n    <!-- Hotel Info -->\n    <div style=\"padding: 25px; background: #f8f9fa;\">\n      <h2 style=\"margin: 0 0 15px 0; color: #333;\">${hotelName}</h2>\n      <div style=\"color: #666; line-height: 1.8;\">\n        <div>📍 <strong>Location:</strong> ${city}</div>\n        <div>📅 <strong>Check-in:</strong> ${checkIn}</div>\n        <div>📅 <strong>Check-out:</strong> ${checkOut}</div>\n        <div>🌙 <strong>Duration:</strong> ${nights} night${nights > 1 ? 's' : ''}</div>\n      </div>\n    </div>\n\n    <!-- Best Deal Highlight -->\n    <div style=\"margin: 20px; padding: 20px; background: linear-gradient(135deg, #667eea15 0%, #764ba215 100%); border-radius: 8px; border-left: 4px solid #667eea;\">\n      <div style=\"font-size: 14px; color: #667eea; font-weight: bold; margin-bottom: 8px;\">🏆 BEST DEAL FOUND</div>\n      <div style=\"font-size: 24px; font-weight: bold; color: #333; margin-bottom: 5px;\">\n        ${bestDeal.currency} ${bestDeal.price.toLocaleString()}\n      </div>\n      <div style=\"color: #666;\">on ${bestDeal.platform} • ${bestDeal.roomType}</div>\n      ${savings > 0 ? `<div style=\"margin-top: 10px; color: #2e7d32; font-weight: bold;\">💰 Save ${bestDeal.currency} ${savings.toLocaleString()} compared to highest price!</div>` : ''}\n    </div>\n\n    <!-- Price Comparison Table -->\n    <div style=\"padding: 0 20px 20px 20px;\">\n      <h3 style=\"color: #333; margin-bottom: 15px;\">📊 Price Comparison</h3>\n      <table style=\"width: 100%; border-collapse: collapse; background: white; border-radius: 8px; overflow: hidden; box-shadow: 0 1px 3px rgba(0,0,0,0.1);\">\n        <thead>\n          <tr style=\"background: #f5f5f5;\">\n            <th style=\"padding: 12px; text-align: left; color: #666; font-weight: 600;\">Platform</th>\n            <th style=\"padding: 12px; text-align: left; color: #666; font-weight: 600;\">Room Type</th>\n            <th style=\"padding: 12px; text-align: right; color: #666; font-weight: 600;\">Price</th>\n            <th style=\"padding: 12px; text-align: center; color: #666; font-weight: 600;\">Action</th>\n          </tr>\n        </thead>\n        <tbody>\n          ${resultsHtml}\n        </tbody>\n      </table>\n      \n      <div style=\"margin-top: 15px; padding: 15px; background: #f8f9fa; border-radius: 8px; text-align: center; color: #666;\">\n        <strong>Average Price:</strong> ${bestDeal.currency} ${avgPrice.toLocaleString()}\n      </div>\n    </div>\n\n    <!-- Footer -->\n    <div style=\"padding: 20px; background: #f8f9fa; border-top: 1px solid #e0e0e0; text-align: center; color: #666; font-size: 13px;\">\n      <p style=\"margin: 0 0 10px 0;\">✨ Prices are subject to availability and may change.</p>\n      <p style=\"margin: 0;\">Happy travels! 🌍</p>\n    </div>\n\n  </div>\n</body>\n</html>\n`;\n\nreturn [{\n  json: {\n    subject: `🏨 ${hotelName} - Best Price: ${bestDeal.currency} ${bestDeal.price.toLocaleString()}`,\n    html,\n    ...data\n  }\n}];\n"
          },
          "typeVersion": 2
        },
        {
          "id": "f1d4a0a7-0441-4609-8e35-0db86378de93",
          "name": "Send Email Report",
          "type": "n8n-nodes-base.emailSend",
          "position": [
            400,
            -320
          ],
          "webhookId": "e180876f-05b9-4290-891b-9ce57726fe26",
          "parameters": {
            "options": {},
            "subject": "={{$json.subject}}",
            "toEmail": "={{$json.userEmail}}",
            "fromEmail": "user@example.com"
          },
          "credentials": {
            "smtp": {
              "id": "credential-id",
              "name": "smtp Credential"
            }
          },
          "typeVersion": 2.1
        },
        {
          "id": "3a3a94aa-23f4-4758-9fb7-bac33b35ecca",
          "name": "Webhook Response (Success)",
          "type": "n8n-nodes-base.respondToWebhook",
          "position": [
            624,
            -320
          ],
          "parameters": {
            "options": {},
            "respondWith": "json",
            "responseBody": "={{ {\\n  \"success\": true,\\n  \"message\": \"Price comparison sent to your email!\",\\n  \"hotel\": $json.hotelName,\\n  \"bestPrice\": $json.bestDeal.price,\\n  \"platform\": $json.bestDeal.platform\\n} }}"
          },
          "typeVersion": 1
        },
        {
          "id": "1a4fd9f4-b08e-4c7e-9ab5-cc9c0e9cdf7f",
          "name": "Webhook Response (Info)",
          "type": "n8n-nodes-base.respondToWebhook",
          "position": [
            848,
            48
          ],
          "parameters": {
            "options": {},
            "respondWith": "json",
            "responseBody": "={{ {\\n  \"success\": false,\\n  \"message\": $json.response,\\n  \"status\": $json.status\\n} }}"
          },
          "typeVersion": 1
        },
        {
          "id": "460b6b8d-679e-4876-9f45-b0b6aa432f8e",
          "name": "Log Analytics",
          "type": "n8n-nodes-base.set",
          "position": [
            400,
            -32
          ],
          "parameters": {
            "mode": "raw",
            "options": {},
            "jsonOutput": "={{ {\\n  \"timestamp\": $now,\\n  \"query\": $json.originalQuery,\\n  \"hotel\": $json.hotelName,\\n  \"city\": $json.city,\\n  \"checkIn\": $json.checkIn,\\n  \"checkOut\": $json.checkOut,\\n  \"bestPrice\": $json.bestDeal?.price,\\n  \"platform\": $json.bestDeal?.platform,\\n  \"totalResults\": $json.totalResults,\\n  \"userEmail\": $json.userEmail\\n} }}"
          },
          "typeVersion": 3.2
        },
        {
          "id": "c7984244-c4d7-4343-88d6-422e1f54a06f",
          "name": "Save to Google Sheets",
          "type": "n8n-nodes-base.googleSheets",
          "position": [
            624,
            -32
          ],
          "parameters": {
            "columns": {
              "mappingMode": "autoMapInputData"
            },
            "options": {},
            "operation": "append",
            "sheetName": "Analytics",
            "documentId": "your-google-sheet-id",
            "authentication": "serviceAccount"
          },
          "credentials": {
            "googleApi": {
              "id": "credential-id",
              "name": "googleApi Credential"
            }
          },
          "typeVersion": 4
        },
        {
          "id": "0de90b41-12aa-4997-96f9-ee90d6b59ebe",
          "name": "Sticky Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -960,
            -304
          ],
          "parameters": {
            "width": 150,
            "height": 352,
            "content": "User sends natural language query"
          },
          "typeVersion": 1
        },
        {
          "id": "4cda970d-9585-43e2-b188-f7662e9ecee2",
          "name": "Sticky Note1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -768,
            -304
          ],
          "parameters": {
            "color": 4,
            "width": 192,
            "height": 352,
            "content": "Extract hotel, city, dates"
          },
          "typeVersion": 1
        },
        {
          "id": "6ca495c6-d8bd-483d-a79a-8c4b4d8e58ef",
          "name": "Sticky Note2",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -528,
            -304
          ],
          "parameters": {
            "color": 3,
            "width": 150,
            "height": 352,
            "content": "Validate all required info"
          },
          "typeVersion": 1
        },
        {
          "id": "b120b69f-566c-4c91-af14-8ee7171d0288",
          "name": "Sticky Note3",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -64,
            -400
          ],
          "parameters": {
            "color": 5,
            "width": 150,
            "height": 352,
            "content": "Compare prices, find best deal"
          },
          "typeVersion": 1
        },
        {
          "id": "6835fed2-3bed-4591-85b3-7e0ea31c3ec0",
          "name": "Sticky Note4",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            144,
            -400
          ],
          "parameters": {
            "color": 3,
            "width": 150,
            "height": 352,
            "content": "Create beautiful HTML report"
          },
          "typeVersion": 1
        },
        {
          "id": "c661889d-6ab1-48ed-8044-f7616aa53999",
          "name": "Sticky Note5",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            368,
            -464
          ],
          "parameters": {
            "width": 662,
            "height": 656,
            "content": "Send response"
          },
          "typeVersion": 1
        }
      ],
      "active": false,
      "pinData": {},
      "settings": {
        "executionOrder": "v1"
      },
      "versionId": "7e3f322c-14e9-4659-a3eb-8265b957e295",
      "connections": {
        "Scrape Agoda": {
          "main": [
            [
              {
                "node": "Aggregate & Compare",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Log Analytics": {
          "main": [
            [
              {
                "node": "Save to Google Sheets",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Check If Ready": {
          "main": [
            [
              {
                "node": "Scrape Booking.com",
                "type": "main",
                "index": 0
              },
              {
                "node": "Scrape Agoda",
                "type": "main",
                "index": 0
              },
              {
                "node": "Scrape Expedia",
                "type": "main",
                "index": 0
              }
            ],
            [
              {
                "node": "Webhook Response (Info)",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Scrape Expedia": {
          "main": [
            [
              {
                "node": "Aggregate & Compare",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Send Email Report": {
          "main": [
            [
              {
                "node": "Webhook Response (Success)",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Scrape Booking.com": {
          "main": [
            [
              {
                "node": "Aggregate & Compare",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Aggregate & Compare": {
          "main": [
            [
              {
                "node": "Format Email Report",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Format Email Report": {
          "main": [
            [
              {
                "node": "Send Email Report",
                "type": "main",
                "index": 0
              },
              {
                "node": "Log Analytics",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Save to Google Sheets": {
          "main": [
            [
              {
                "node": "Webhook Response (Info)",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Parse & Validate Request": {
          "main": [
            [
              {
                "node": "Check If Ready",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Webhook - Receive Request": {
          "main": [
            [
              {
                "node": "Parse & Validate Request",
                "type": "main",
                "index": 0
              }
            ]
          ]
        }
      }
    },
    "lastUpdatedBy": 1,
    "workflowInfo": {
      "nodeCount": 19,
      "nodeTypes": {
        "n8n-nodes-base.if": {
          "count": 1
        },
        "n8n-nodes-base.set": {
          "count": 1
        },
        "n8n-nodes-base.code": {
          "count": 3
        },
        "n8n-nodes-base.webhook": {
          "count": 1
        },
        "n8n-nodes-base.emailSend": {
          "count": 1
        },
        "n8n-nodes-base.stickyNote": {
          "count": 6
        },
        "n8n-nodes-base.httpRequest": {
          "count": 3
        },
        "n8n-nodes-base.googleSheets": {
          "count": 1
        },
        "n8n-nodes-base.respondToWebhook": {
          "count": 2
        }
      }
    },
    "status": "published",
    "user": {
      "name": "Oneclick AI Squad",
      "username": "oneclick-ai",
      "bio": "The AI Squad Initiative is a pioneering effort to build, automate and scale AI-powered workflows using n8n.io. Our mission is to help individuals and businesses integrate AI agents seamlessly into their daily operations  from automating tasks and enhancing productivity to creating innovative, intelligent solutions. We design modular, reusable AI workflow templates that empower creators, developers and teams to supercharge their automation with minimal effort and maximum impact.",
      "verified": true,
      "links": [
        "https://www.oneclickitsolution.com/"
      ],
      "avatar": "https://gravatar.com/avatar/848fca91367142f65f9e5c55d64e5c9952b160d7b060d103b52aa343c6bc7b3d?r=pg&d=retro&size=200"
    },
    "nodes": [
      {
        "id": 11,
        "icon": "fa:envelope",
        "name": "n8n-nodes-base.emailSend",
        "codex": {
          "data": {
            "alias": [
              "SMTP",
              "email",
              "human",
              "form",
              "wait",
              "hitl",
              "approval"
            ],
            "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/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"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.sendemail/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/sendemail/"
                }
              ]
            },
            "categories": [
              "Communication",
              "HITL",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "HITL": [
                "Human in the Loop"
              ]
            }
          }
        },
        "group": "[\"output\"]",
        "defaults": {
          "name": "Send Email",
          "color": "#00bb88"
        },
        "iconData": {
          "icon": "envelope",
          "type": "icon"
        },
        "displayName": "Send Email",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 6,
            "name": "Communication"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          },
          {
            "id": 28,
            "name": "HITL"
          }
        ]
      },
      {
        "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": 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": 47,
        "icon": "file:webhook.svg",
        "name": "n8n-nodes-base.webhook",
        "codex": {
          "data": {
            "alias": [
              "HTTP",
              "API",
              "Build",
              "WH"
            ],
            "resources": {
              "generic": [
                {
                  "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/running-n8n-on-ships-an-interview-with-maranics/",
                  "icon": "🛳",
                  "label": "Running n8n on ships: An interview with Maranics"
                },
                {
                  "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/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/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/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/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/",
                  "icon": "👏",
                  "label": "How to automatically give kudos to contributors with GitHub, Slack, 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/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/creating-custom-incident-response-workflows-with-n8n/",
                  "label": "How to automate every step of an incident response workflow"
                },
                {
                  "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/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-goomer-automated-their-operations-with-over-200-n8n-workflows/",
                  "icon": "🛵",
                  "label": "How Goomer automated their operations with over 200 n8n workflows"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"trigger\"]",
        "defaults": {
          "name": "Webhook"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"
        },
        "displayName": "Webhook",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 535,
        "icon": "file:webhook.svg",
        "name": "n8n-nodes-base.respondToWebhook",
        "codex": {
          "data": {
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.respondtowebhook/"
                }
              ]
            },
            "categories": [
              "Core Nodes",
              "Utility"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Respond to Webhook"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"
        },
        "displayName": "Respond to Webhook",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 7,
            "name": "Utility"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "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"
          }
        ]
      }
    ],
    "categories": [
      {
        "id": 32,
        "name": "Market Research"
      }
    ],
    "image": []
  }
}