{
  "name": "Monitor de precios de una web → Telegram",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 30
            }
          ]
        }
      },
      "id": "a1111111-1111-4111-8111-111111111111",
      "name": "Cada 30 minutos",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -40,
        300
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "u1",
              "name": "url",
              "value": "https://ejemplo.com/producto",
              "type": "string"
            },
            {
              "id": "u2",
              "name": "selectorCss",
              "value": ".precio",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "a2222222-2222-4222-8222-222222222222",
      "name": "Configura aquí",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        180,
        300
      ]
    },
    {
      "parameters": {
        "url": "={{ $json.url }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "text"
            }
          },
          "timeout": 15000
        }
      },
      "id": "a3333333-3333-4333-8333-333333333333",
      "name": "Descargar página",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        400,
        300
      ]
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "sourceData": "json",
        "dataPropertyName": "data",
        "extractionValues": {
          "values": [
            {
              "key": "valor",
              "cssSelector": "={{ $('Configura aquí').item.json.selectorCss }}",
              "returnValue": "text"
            }
          ]
        },
        "options": {
          "trimValues": true
        }
      },
      "id": "a4444444-4444-4444-8444-444444444444",
      "name": "Extraer el dato",
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        620,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "// Compara el valor actual con el de la última ejecución.\n// El estado se guarda en staticData del workflow (persiste entre ejecuciones).\nconst store = $getWorkflowStaticData('global');\nconst url = $('Configura aquí').first().json.url;\nconst clave = 'ultimo_' + Buffer.from(url).toString('base64').slice(0, 16);\n\nconst crudo = ($input.first().json.valor || '').toString().trim();\nif (!crudo) {\n  return [{ json: { estado: 'no_encontrado', url, mensaje: 'El selector no encontró ningún valor. ¿Ha cambiado la página?' } }];\n}\n\nconst anterior = store[clave] ?? null;\nstore[clave] = crudo;\n\nif (anterior === null) {\n  return [{ json: { estado: 'primera_vez', url, actual: crudo } }];\n}\nif (anterior === crudo) {\n  return [{ json: { estado: 'sin_cambios', url, actual: crudo } }];\n}\nreturn [{ json: { estado: 'cambio', url, anterior, actual: crudo } }];"
      },
      "id": "a5555555-5555-4555-8555-555555555555",
      "name": "¿Ha cambiado?",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        840,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "typeValidation": "strict",
            "version": 2
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "c1",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.estado }}",
              "rightValue": "cambio"
            },
            {
              "id": "c2",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.estado }}",
              "rightValue": "no_encontrado"
            }
          ]
        },
        "options": {}
      },
      "id": "a6666666-6666-4666-8666-666666666666",
      "name": "¿Hay que avisar?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1060,
        300
      ]
    },
    {
      "parameters": {
        "chatId": "TU_CHAT_ID",
        "text": "={{ $json.estado === 'no_encontrado'\n  ? '⚠️ ' + $json.mensaje + '\\n' + $json.url\n  : '💸 Cambio detectado\\nAntes: ' + $json.anterior + '\\nAhora: ' + $json.actual + '\\n' + $json.url }}",
        "additionalFields": {}
      },
      "id": "a7777777-7777-4777-8777-777777777777",
      "name": "Avisar por Telegram",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        1280,
        220
      ]
    },
    {
      "parameters": {},
      "id": "a8888888-8888-4888-8888-888888888888",
      "name": "Sin cambios (fin)",
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        1280,
        400
      ]
    }
  ],
  "connections": {
    "Cada 30 minutos": {
      "main": [
        [
          {
            "node": "Configura aquí",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Configura aquí": {
      "main": [
        [
          {
            "node": "Descargar página",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Descargar página": {
      "main": [
        [
          {
            "node": "Extraer el dato",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extraer el dato": {
      "main": [
        [
          {
            "node": "¿Ha cambiado?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "¿Ha cambiado?": {
      "main": [
        [
          {
            "node": "¿Hay que avisar?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "¿Hay que avisar?": {
      "main": [
        [
          {
            "node": "Avisar por Telegram",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Sin cambios (fin)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": [
    {
      "name": "zylo-automations"
    }
  ]
}
