Verificador de precios de habitaciones de hotel

Avanzado

Este es unMarket Researchflujo de automatización del dominio deautomatización que contiene 29 nodos.Utiliza principalmente nodos como If, Code, Merge, EmailSend, HttpRequest. Recordatorio automático de caídas en precios de hoteles (con notificaciones por correo electrónico y seguimiento de base de datos)

Requisitos previos
  • Pueden requerirse credenciales de autenticación para la API de destino
Vista previa del flujo de trabajo
Visualización de las conexiones entre nodos, con soporte para zoom y panorámica
Exportar flujo de trabajo
Copie la siguiente configuración JSON en n8n para importar y usar este flujo de trabajo
{
  "id": "32sZD8EotVPD5r21",
  "meta": {
    "instanceId": "dd69efaf8212c74ad206700d104739d3329588a6f3f8381a46a481f34c9cc281",
    "templateCredsSetupCompleted": true
  },
  "name": "Hotel Room Price Checker",
  "tags": [],
  "nodes": [
    {
      "id": "4ee06ed2-858c-451d-80d1-50e5149f8be3",
      "name": "Programar - Cada 6 Horas",
      "type": "n8n-nodes-base.scheduleTrigger",
      "notes": "Triggers price check automatically every 6 hours to monitor rate changes",
      "position": [
        -2112,
        64
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "a1be7480-2816-4d1a-b64d-24a4d123f9e5",
      "name": "Nota Adhesiva",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2160,
        -192
      ],
      "parameters": {
        "color": 4,
        "width": 220,
        "height": 396,
        "content": "## ⏰ TRIGGER\nRuns price check every 6 hours automatically"
      },
      "typeVersion": 1
    },
    {
      "id": "566c0b0a-7671-4ee0-a248-b9ffb8e90d55",
      "name": "Cargar Lista de Hoteles",
      "type": "n8n-nodes-base.code",
      "notes": "Loads list of hotels to monitor from database or configuration",
      "position": [
        -1888,
        64
      ],
      "parameters": {
        "jsCode": "// List of hotels to monitor\n// In production, this would come from a database\nconst hotelsToMonitor = [\n  {\n    hotelId: 'hotel_001',\n    hotelName: 'Grand Plaza Hotel',\n    location: 'New York, USA',\n    roomType: 'Deluxe Suite',\n    bookingUrl: 'https://booking.com/hotel-001',\n    apiEndpoint: 'https://api.hotelbooking.com/rates/hotel_001'\n  },\n  {\n    hotelId: 'hotel_002',\n    hotelName: 'Ocean View Resort',\n    location: 'Miami, USA',\n    roomType: 'Ocean Front Room',\n    bookingUrl: 'https://booking.com/hotel-002',\n    apiEndpoint: 'https://api.hotelbooking.com/rates/hotel_002'\n  },\n  {\n    hotelId: 'hotel_003',\n    hotelName: 'Mountain Lodge',\n    location: 'Aspen, USA',\n    roomType: 'Premium Cabin',\n    bookingUrl: 'https://booking.com/hotel-003',\n    apiEndpoint: 'https://api.hotelbooking.com/rates/hotel_003'\n  },\n  {\n    hotelId: 'hotel_004',\n    hotelName: 'City Center Inn',\n    location: 'Los Angeles, USA',\n    roomType: 'Standard Double',\n    bookingUrl: 'https://booking.com/hotel-004',\n    apiEndpoint: 'https://api.hotelbooking.com/rates/hotel_004'\n  },\n  {\n    hotelId: 'hotel_005',\n    hotelName: 'Desert Oasis Hotel',\n    location: 'Las Vegas, USA',\n    roomType: 'Luxury Suite',\n    bookingUrl: 'https://booking.com/hotel-005',\n    apiEndpoint: 'https://api.hotelbooking.com/rates/hotel_005'\n  }\n];\n\nreturn hotelsToMonitor.map(hotel => ({\n  json: {\n    ...hotel,\n    checkTimestamp: new Date().toISOString(),\n    checkDate: new Date().toLocaleDateString('en-US', { \n      year: 'numeric', \n      month: 'long', \n      day: 'numeric' \n    })\n  }\n}));"
      },
      "typeVersion": 2
    },
    {
      "id": "89a5c7bd-ef50-4a9c-9970-31eca24fe4ae",
      "name": "Nota Adhesiva1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1936,
        -144
      ],
      "parameters": {
        "color": 5,
        "width": 220,
        "height": 348,
        "content": "## 🏨 HOTEL LIST\nLoads all hotels that need price monitoring"
      },
      "typeVersion": 1
    },
    {
      "id": "1022f8d7-e6d9-4641-8f54-6f9e8345f928",
      "name": "Obtener Precio Actual desde API",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Retrieves real-time pricing data from hotel booking API",
      "position": [
        -1680,
        64
      ],
      "parameters": {
        "url": "={{ $json.apiEndpoint }}",
        "options": {
          "response": {
            "response": {
              "neverError": true
            }
          }
        },
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "Accept",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "05fee65a-e5f1-455d-b3d3-fc1d8cc35099",
      "name": "Nota Adhesiva2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1712,
        -176
      ],
      "parameters": {
        "color": 6,
        "width": 220,
        "height": 380,
        "content": "## 💰 PRICE API\nFetches current room rates in real-time"
      },
      "typeVersion": 1
    },
    {
      "id": "6721055e-ee7d-475f-a06b-30897d37c293",
      "name": "Analizar Datos de Precio",
      "type": "n8n-nodes-base.code",
      "notes": "Extracts and formats current price information from API response",
      "position": [
        -1456,
        64
      ],
      "parameters": {
        "jsCode": "// Parse API response and extract price\n// Since we're simulating, generate random prices\nconst hotelData = $('Load Hotel List').item.json;\n\n// Simulate API response with random price variations\nconst basePrice = Math.floor(Math.random() * (500 - 150 + 1)) + 150;\nconst priceVariation = Math.floor(Math.random() * 50) - 25; // -25 to +25\n\nconst currentPrice = basePrice + priceVariation;\nconst currency = 'USD';\nconst availability = Math.random() > 0.2 ? 'Available' : 'Limited';\n\nreturn {\n  json: {\n    hotelId: hotelData.hotelId,\n    hotelName: hotelData.hotelName,\n    location: hotelData.location,\n    roomType: hotelData.roomType,\n    bookingUrl: hotelData.bookingUrl,\n    currentPrice: currentPrice,\n    currency: currency,\n    availability: availability,\n    checkTimestamp: hotelData.checkTimestamp,\n    checkDate: hotelData.checkDate,\n    pricePerNight: currentPrice,\n    taxesIncluded: true\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "6f4a0e90-9da5-4a77-b307-9457186ac341",
      "name": "Nota Adhesiva3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1488,
        -192
      ],
      "parameters": {
        "color": 5,
        "width": 220,
        "height": 396,
        "content": "## 📊 PARSE DATA\nExtracts price and availability info"
      },
      "typeVersion": 1
    },
    {
      "id": "e3731717-d4b4-429f-838a-81fdb625f1b5",
      "name": "Obtener Precio Anterior desde DB",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Retrieves last recorded price from database for comparison",
      "position": [
        -1232,
        64
      ],
      "parameters": {
        "url": "https://your-database-api.com/prices/history",
        "options": {
          "response": {
            "response": {
              "neverError": true
            }
          }
        },
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "hotel_id",
              "value": "={{ $json.hotelId }}"
            },
            {
              "name": "room_type",
              "value": "={{ $json.roomType }}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "01becb4a-1f77-42e6-9c4f-baffbfe89dd9",
      "name": "Nota Adhesiva4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1264,
        -240
      ],
      "parameters": {
        "color": 4,
        "width": 220,
        "height": 444,
        "content": "## 🗄️ DATABASE QUERY\nFetches previous price record"
      },
      "typeVersion": 1
    },
    {
      "id": "4c56305a-577a-4078-9480-67247af82062",
      "name": "Comparar Precios",
      "type": "n8n-nodes-base.code",
      "notes": "Calculates price difference and percentage change from previous check",
      "position": [
        -1008,
        64
      ],
      "parameters": {
        "jsCode": "// Compare current price with previous price\nconst currentData = $('Parse Price Data').item.json;\nconst currentPrice = currentData.currentPrice;\n\n// Simulate previous price from database\n// In production, this would come from the actual DB response\nconst previousPrice = currentPrice + Math.floor(Math.random() * 60) - 20; // Random previous price\n\nconst priceDifference = currentPrice - previousPrice;\nconst percentageChange = previousPrice > 0 ? ((priceDifference / previousPrice) * 100).toFixed(2) : 0;\nconst priceChanged = priceDifference !== 0;\nconst priceReduced = priceDifference < 0;\nconst priceIncreased = priceDifference > 0;\n\nreturn {\n  json: {\n    ...currentData,\n    previousPrice: previousPrice,\n    currentPrice: currentPrice,\n    priceDifference: priceDifference,\n    percentageChange: percentageChange,\n    priceChanged: priceChanged,\n    priceReduced: priceReduced,\n    priceIncreased: priceIncreased,\n    changeDirection: priceReduced ? 'decreased' : (priceIncreased ? 'increased' : 'unchanged'),\n    savingsAmount: priceReduced ? Math.abs(priceDifference) : 0\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "024fba14-4c8a-4036-9236-a4073d7be5fb",
      "name": "Nota Adhesiva5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1040,
        -224
      ],
      "parameters": {
        "color": 6,
        "width": 220,
        "height": 460,
        "content": "## 🔍 PRICE COMPARISON\nCalculates difference and change %"
      },
      "typeVersion": 1
    },
    {
      "id": "b209b7b7-d4ba-4b37-85f3-f11b3eac630f",
      "name": "Verificar si el Precio Bajó",
      "type": "n8n-nodes-base.if",
      "notes": "Filters only hotels where price has decreased to send alerts",
      "position": [
        -800,
        64
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": false
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "price-reduced-check",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.priceReduced }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "73133073-2222-4af6-9337-b572e9323058",
      "name": "Nota Adhesiva6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -832,
        -112
      ],
      "parameters": {
        "color": 5,
        "width": 220,
        "height": 332,
        "content": "## ✅ PRICE FILTER\nIdentifies reduced prices only"
      },
      "typeVersion": 1
    },
    {
      "id": "d1c8b9af-4626-4cc5-a72c-06b5ec68a126",
      "name": "Formatear Correo de Alerta",
      "type": "n8n-nodes-base.code",
      "notes": "Creates formatted HTML email with price comparison and booking details",
      "position": [
        -560,
        -32
      ],
      "parameters": {
        "jsCode": "// Format data for alert email\nconst data = $input.item.json;\n\nconst emailSubject = `🎉 Price Drop Alert: ${data.hotelName} - Save $${data.savingsAmount}!`;\n\nconst emailBody = `\n<html>\n<head>\n  <style>\n    body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }\n    .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n    .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 30px; text-align: center; border-radius: 10px 10px 0 0; }\n    .content { background: #f9f9f9; padding: 30px; border-radius: 0 0 10px 10px; }\n    .price-box { background: white; padding: 20px; margin: 20px 0; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }\n    .old-price { text-decoration: line-through; color: #999; font-size: 18px; }\n    .new-price { color: #22c55e; font-size: 32px; font-weight: bold; }\n    .savings { background: #22c55e; color: white; padding: 10px 20px; border-radius: 5px; display: inline-block; margin: 10px 0; }\n    .details { margin: 20px 0; }\n    .detail-row { padding: 10px 0; border-bottom: 1px solid #eee; }\n    .label { font-weight: bold; color: #667eea; }\n    .cta-button { background: #667eea; color: white; padding: 15px 30px; text-decoration: none; border-radius: 5px; display: inline-block; margin: 20px 0; }\n    .footer { text-align: center; color: #999; margin-top: 30px; font-size: 12px; }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <h1>🏨 Hotel Price Drop Alert!</h1>\n      <p>Great news! A price reduction has been detected</p>\n    </div>\n    <div class=\"content\">\n      <h2>${data.hotelName}</h2>\n      <p><strong>📍 Location:</strong> ${data.location}</p>\n      <p><strong>🛏️ Room Type:</strong> ${data.roomType}</p>\n      \n      <div class=\"price-box\">\n        <p><span class=\"label\">Previous Price:</span> <span class=\"old-price\">$${data.previousPrice} ${data.currency}</span></p>\n        <p><span class=\"label\">Current Price:</span> <span class=\"new-price\">$${data.currentPrice} ${data.currency}</span></p>\n        <div class=\"savings\">💰 Save $${data.savingsAmount} (${Math.abs(data.percentageChange)}% OFF)</div>\n      </div>\n      \n      <div class=\"details\">\n        <div class=\"detail-row\">\n          <span class=\"label\">Availability:</span> ${data.availability}\n        </div>\n        <div class=\"detail-row\">\n          <span class=\"label\">Price Per Night:</span> $${data.pricePerNight} ${data.currency}\n        </div>\n        <div class=\"detail-row\">\n          <span class=\"label\">Taxes:</span> ${data.taxesIncluded ? 'Included' : 'Not Included'}\n        </div>\n        <div class=\"detail-row\">\n          <span class=\"label\">Checked On:</span> ${data.checkDate}\n        </div>\n      </div>\n      \n      <center>\n        <a href=\"${data.bookingUrl}\" class=\"cta-button\">Book Now & Save!</a>\n      </center>\n      \n      <p style=\"margin-top: 20px; padding: 15px; background: #fff3cd; border-left: 4px solid #ffc107; border-radius: 4px;\">\n        ⚠️ <strong>Act Fast!</strong> Prices can change at any time. This deal might not last long.\n      </p>\n    </div>\n    <div class=\"footer\">\n      <p>This is an automated price alert from your Hotel Price Monitoring System</p>\n      <p>You're receiving this because you're monitoring ${data.hotelName}</p>\n    </div>\n  </div>\n</body>\n</html>\n`;\n\nreturn {\n  json: {\n    ...data,\n    emailSubject: emailSubject,\n    emailBody: emailBody,\n    alertType: 'price_reduction',\n    urgencyLevel: Math.abs(data.percentageChange) > 20 ? 'high' : 'medium'\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "db1d5f57-2f0e-4b7f-82a1-b29d219dab34",
      "name": "Nota Adhesiva7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -608,
        -256
      ],
      "parameters": {
        "color": 4,
        "width": 220,
        "height": 268,
        "content": "## 📧 EMAIL FORMATTING\nCreates beautiful HTML alert email"
      },
      "typeVersion": 1
    },
    {
      "id": "7cfa40a4-8201-4a19-b7fa-cff35c636ffe",
      "name": "Enviar Correo al Agente de Viajes",
      "type": "n8n-nodes-base.emailSend",
      "notes": "Sends price drop alert email to travel agent with all details",
      "position": [
        -352,
        -32
      ],
      "webhookId": "f773dc8e-659e-4ee0-a3f8-cd52294c43cf",
      "parameters": {
        "options": {},
        "subject": "={{ $json.emailSubject }}",
        "toEmail": "travelagent@agency.com",
        "fromEmail": "alerts@hotelpricemonitor.com"
      },
      "credentials": {
        "smtp": {
          "id": "G1kyF8cSWTZ4vouN",
          "name": "SMTP -test"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "59598261-84cb-49b5-ad85-15572316d478",
      "name": "Nota Adhesiva8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -368,
        -256
      ],
      "parameters": {
        "color": 6,
        "width": 220,
        "height": 268,
        "content": "## 📮 EMAIL DELIVERY\nSends alert to travel agent"
      },
      "typeVersion": 1
    },
    {
      "id": "01ed82a5-104f-4282-844f-faf5d4bd872a",
      "name": "Registrar Alerta Enviada",
      "type": "n8n-nodes-base.code",
      "notes": "Records alert delivery for tracking and audit purposes",
      "position": [
        -128,
        -32
      ],
      "parameters": {
        "jsCode": "// Log successful alert\nconst data = $input.item.json;\n\nreturn {\n  json: {\n    hotelId: data.hotelId,\n    hotelName: data.hotelName,\n    alertSent: true,\n    alertTimestamp: new Date().toISOString(),\n    previousPrice: data.previousPrice,\n    currentPrice: data.currentPrice,\n    savingsAmount: data.savingsAmount,\n    percentageChange: data.percentageChange,\n    recipientEmail: 'travelagent@agency.com',\n    alertType: 'price_reduction'\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "bc82882c-6e33-47ed-b91a-f1eeb426908d",
      "name": "Nota Adhesiva9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -144,
        -272
      ],
      "parameters": {
        "color": 5,
        "width": 220,
        "height": 284,
        "content": "## 📝 ALERT LOGGING\nRecords successful alert delivery"
      },
      "typeVersion": 1
    },
    {
      "id": "5c98bfac-f475-4f97-b359-c6d2a1b88086",
      "name": "Registrar Sin Alerta Necesaria",
      "type": "n8n-nodes-base.code",
      "notes": "Records check where no alert was needed (price unchanged or increased)",
      "position": [
        -560,
        160
      ],
      "parameters": {
        "jsCode": "// Log no change detected\nconst data = $input.item.json;\n\nreturn {\n  json: {\n    hotelId: data.hotelId,\n    hotelName: data.hotelName,\n    alertSent: false,\n    checkTimestamp: new Date().toISOString(),\n    previousPrice: data.previousPrice,\n    currentPrice: data.currentPrice,\n    priceChanged: data.priceChanged,\n    changeDirection: data.changeDirection,\n    reason: data.priceIncreased ? 'price_increased' : 'no_change'\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "461d09c9-0695-4ac8-bd8b-6f1b732a8b32",
      "name": "Nota Adhesiva10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -752,
        304
      ],
      "parameters": {
        "color": 4,
        "width": 220,
        "height": 140,
        "content": "## 📋 NO ALERT LOG\nRecords when prices didn't decrease"
      },
      "typeVersion": 1
    },
    {
      "id": "5c074f64-4562-4cc6-adb4-6dd9e5d07ba3",
      "name": "Combinar Todos los Registros",
      "type": "n8n-nodes-base.merge",
      "notes": "Combines logs from both alert and no-alert paths",
      "position": [
        -352,
        160
      ],
      "parameters": {
        "mode": "combine",
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "c2c40b1d-d5cd-4221-9395-54eb169a262a",
      "name": "Nota Adhesiva11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -448,
        304
      ],
      "parameters": {
        "color": 6,
        "width": 200,
        "height": 140,
        "content": "## 🔀 LOG MERGE\nCombines all check results"
      },
      "typeVersion": 1
    },
    {
      "id": "400a11eb-2dc0-425e-a167-98312b3f8173",
      "name": "Actualizar Precio en la Base de Datos",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Updates database with latest price for future comparisons",
      "position": [
        -128,
        160
      ],
      "parameters": {
        "url": "https://your-database-api.com/prices/update",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "hotel_id",
              "value": "={{ $('Parse Price Data').item.json.hotelId }}"
            },
            {
              "name": "room_type",
              "value": "={{ $('Parse Price Data').item.json.roomType }}"
            },
            {
              "name": "price",
              "value": "={{ $('Parse Price Data').item.json.currentPrice }}"
            },
            {
              "name": "currency",
              "value": "={{ $('Parse Price Data').item.json.currency }}"
            },
            {
              "name": "availability",
              "value": "={{ $('Parse Price Data').item.json.availability }}"
            },
            {
              "name": "timestamp",
              "value": "={{ $('Parse Price Data').item.json.checkTimestamp }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "f52dff1c-b64f-4e04-9273-ed3b26074e37",
      "name": "Nota Adhesiva12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -176,
        320
      ],
      "parameters": {
        "color": 5,
        "width": 220,
        "height": 140,
        "content": "## 💾 DATABASE UPDATE\nStores new price for next comparison"
      },
      "typeVersion": 1
    },
    {
      "id": "33fccfde-7e4a-464c-b056-97ef34d8e7ec",
      "name": "Crear Resumen de Ejecución",
      "type": "n8n-nodes-base.code",
      "notes": "Generates summary report of price check execution and alerts sent",
      "position": [
        96,
        64
      ],
      "parameters": {
        "jsCode": "// Generate execution summary\nconst allLogs = $input.all();\n\nconst totalHotels = allLogs.length;\nconst alertsSent = allLogs.filter(item => item.json.alertSent === true).length;\nconst noAlerts = allLogs.filter(item => item.json.alertSent === false).length;\n\nconst summary = {\n  executionTimestamp: new Date().toISOString(),\n  executionDate: new Date().toLocaleDateString('en-US', { \n    year: 'numeric', \n    month: 'long', \n    day: 'numeric',\n    hour: '2-digit',\n    minute: '2-digit'\n  }),\n  totalHotelsChecked: totalHotels,\n  priceDropAlertsRaised: alertsSent,\n  noAlertsNeeded: noAlerts,\n  alertRate: totalHotels > 0 ? ((alertsSent / totalHotels) * 100).toFixed(1) + '%' : '0%',\n  status: 'completed',\n  nextCheckIn: '6 hours'\n};\n\nreturn {\n  json: summary\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "552c8be1-cda3-4a06-834d-735f11e88fbf",
      "name": "Nota Adhesiva13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        80,
        -112
      ],
      "parameters": {
        "color": 4,
        "width": 220,
        "height": 284,
        "content": "## 📊 SUMMARY REPORT\nCreates execution statistics"
      },
      "typeVersion": 1
    },
    {
      "id": "f141855d-90f2-47bc-9839-c5953f12863c",
      "name": "Nota Adhesiva14",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1600,
        -1216
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 792,
        "content": "## 🏨 HOTEL ROOM PRICE CHECKER\n\n**Automated Price Monitoring System**\n\n**Features:**\n✓ Checks prices every 6 hours\n✓ Monitors multiple hotels\n✓ Detects price reductions\n✓ Sends instant email alerts\n✓ Shows old vs new prices\n✓ Calculates savings amount\n✓ Tracks price history\n✓ Beautiful HTML emails\n\n**Alert Triggers:**\n• Price decreased\n• Percentage savings\n• Availability changes\n\n**Email Includes:**\n• Hotel name & location\n• Room type details\n• Old price (strikethrough)\n• New price (highlighted)\n• Savings amount & %\n• Direct booking link\n• Urgency indicator\n\n**Setup Required:**\n1. Configure schedule trigger\n2. Add hotel API credentials\n3. Setup database endpoint\n4. Configure SMTP for emails\n5. Update agent email address\n6. Customize hotel list\n7. Test price comparison logic"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "c121be3a-bd75-426b-9e52-9f1859cb47c6",
  "connections": {
    "4c56305a-577a-4078-9480-67247af82062": {
      "main": [
        [
          {
            "node": "b209b7b7-d4ba-4b37-85f3-f11b3eac630f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "01ed82a5-104f-4282-844f-faf5d4bd872a": {
      "main": [
        [
          {
            "node": "5c074f64-4562-4cc6-adb4-6dd9e5d07ba3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5c074f64-4562-4cc6-adb4-6dd9e5d07ba3": {
      "main": [
        [
          {
            "node": "400a11eb-2dc0-425e-a167-98312b3f8173",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "566c0b0a-7671-4ee0-a248-b9ffb8e90d55": {
      "main": [
        [
          {
            "node": "1022f8d7-e6d9-4641-8f54-6f9e8345f928",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6721055e-ee7d-475f-a06b-30897d37c293": {
      "main": [
        [
          {
            "node": "e3731717-d4b4-429f-838a-81fdb625f1b5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d1c8b9af-4626-4cc5-a72c-06b5ec68a126": {
      "main": [
        [
          {
            "node": "7cfa40a4-8201-4a19-b7fa-cff35c636ffe",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5c98bfac-f475-4f97-b359-c6d2a1b88086": {
      "main": [
        [
          {
            "node": "5c074f64-4562-4cc6-adb4-6dd9e5d07ba3",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "b209b7b7-d4ba-4b37-85f3-f11b3eac630f": {
      "main": [
        [
          {
            "node": "d1c8b9af-4626-4cc5-a72c-06b5ec68a126",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "5c98bfac-f475-4f97-b359-c6d2a1b88086",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4ee06ed2-858c-451d-80d1-50e5149f8be3": {
      "main": [
        [
          {
            "node": "566c0b0a-7671-4ee0-a248-b9ffb8e90d55",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "400a11eb-2dc0-425e-a167-98312b3f8173": {
      "main": [
        [
          {
            "node": "33fccfde-7e4a-464c-b056-97ef34d8e7ec",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e3731717-d4b4-429f-838a-81fdb625f1b5": {
      "main": [
        [
          {
            "node": "4c56305a-577a-4078-9480-67247af82062",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7cfa40a4-8201-4a19-b7fa-cff35c636ffe": {
      "main": [
        [
          {
            "node": "01ed82a5-104f-4282-844f-faf5d4bd872a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1022f8d7-e6d9-4641-8f54-6f9e8345f928": {
      "main": [
        [
          {
            "node": "6721055e-ee7d-475f-a06b-30897d37c293",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Preguntas frecuentes

¿Cómo usar este flujo de trabajo?

Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.

¿En qué escenarios es adecuado este flujo de trabajo?

Avanzado - Investigación de mercado

¿Es de pago?

Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.

Flujos de trabajo relacionados recomendados

Información del flujo de trabajo
Nivel de dificultad
Avanzado
Número de nodos29
Categoría1
Tipos de nodos7
Descripción de la dificultad

Adecuado para usuarios avanzados, flujos de trabajo complejos con 16+ nodos

Autor
Oneclick AI Squad

Oneclick AI Squad

@oneclick-ai

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.

Enlaces externos
Ver en n8n.io

Compartir este flujo de trabajo

Categorías

Categorías: 34