{
  "id": "tBGIIkEnXj8XEfvE",
  "name": "Competitor Price Monitoring with AI-Powered Alerts",
  "tags": [],
  "nodes": [
    {
      "id": "e179db86-9c63-4942-a4a4-f76b4eb10e00",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -560,
        -320
      ],
      "parameters": {
        "width": 488,
        "height": 592,
        "content": "## Competitor Price Monitoring with AI-Powered Alerts\n\n### Overview\nAutomatically monitors competitor pricing on a scheduled basis, detects significant price changes using Compare Datasets, and sends intelligent alerts via Slack or Email based on AI analysis of market implications.\n\n### Key Features\n- **Compare Datasets Detection**: Identifies new, removed, changed, and unchanged prices\n- **AI-Powered Analysis**: Strategic recommendations based on competitive changes\n- **Multi-Channel Routing**: Urgent to Slack, routine to Email\n- **Cron Scheduling**: Flexible monitoring frequency\n\n### Required Credentials\n- OpenAI API\n- Slack\n- Gmail\n- Google Sheets"
      },
      "typeVersion": 1
    },
    {
      "id": "bbfdd600-b8f0-4828-9ae7-80feab951c5a",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -32,
        -16
      ],
      "parameters": {
        "color": 7,
        "width": 300,
        "height": 540,
        "content": "### Step 1: Scheduled Price Collection\n- Cron trigger runs at configured intervals\n- Fetches competitor price data via HTTP requests\n- Retrieves previous price snapshot from storage"
      },
      "typeVersion": 1
    },
    {
      "id": "0072e90d-0f72-4dda-815b-40044ec8f1fe",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        480,
        -64
      ],
      "parameters": {
        "color": 7,
        "width": 360,
        "height": 716,
        "content": "### Step 2: Compare Datasets Analysis\n- Uses Compare Datasets node to detect changes\n- Outputs: In A only (removed), Same, Different, In B only (new)\n- Calculates percentage change for each product"
      },
      "typeVersion": 1
    },
    {
      "id": "06ab5f42-da9c-461a-bc4c-37a41651f62f",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1088,
        -64
      ],
      "parameters": {
        "color": 7,
        "width": 360,
        "height": 716,
        "content": "### Step 3: AI Analysis & Severity Assessment\n- AI Agent evaluates competitive implications\n- Generates strategic recommendations\n- Classifies alert urgency (urgent/routine/log-only)"
      },
      "typeVersion": 1
    },
    {
      "id": "46934c62-e331-438f-be94-aef9c0b324f3",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1648,
        -64
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 736,
        "content": "### Step 4: Smart Alert Routing & Storage\n- Routes to Slack for urgent changes (>10%)\n- Sends Email digest for routine changes (5-10%)\n- Updates price history in Google Sheets\n- Logs all monitoring activity"
      },
      "typeVersion": 1
    },
    {
      "id": "c9e94fa8-0b08-4b30-ad1d-80c3b0412160",
      "name": "Price Check Schedule",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        64,
        256
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 */6 * * *"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "b427b57d-b57d-42a6-96e4-b26796e57389",
      "name": "Initialize Monitoring Session",
      "type": "n8n-nodes-base.set",
      "position": [
        288,
        256
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "1",
              "name": "monitoringId",
              "type": "string",
              "value": "={{ 'MON-' + $now.format('yyyyMMddHHmmss') }}"
            },
            {
              "id": "2",
              "name": "checkTimestamp",
              "type": "string",
              "value": "={{ $now.toISO() }}"
            },
            {
              "id": "3",
              "name": "competitors",
              "type": "object",
              "value": "[\"CompetitorA\", \"CompetitorB\", \"CompetitorC\"]"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "0c514f71-a7f3-41d5-ac4f-ef63221dc8b0",
      "name": "Fetch Current Prices",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        496,
        160
      ],
      "parameters": {
        "url": "https://api.competitor-prices.example.com/v1/products",
        "options": {
          "timeout": 30000
        },
        "sendQuery": true,
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "category",
              "value": "all"
            },
            {
              "name": "format",
              "value": "json"
            }
          ]
        },
        "nodeCredentialType": "httpHeaderAuth"
      },
      "typeVersion": 4.2
    },
    {
      "id": "be3a2b1b-9412-48ed-8cbd-3553a2f7e9b7",
      "name": "Fetch Previous Prices",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        496,
        368
      ],
      "parameters": {
        "operation": "getMany",
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "cdf06488-beb7-4e0c-aa44-97552ae65820",
      "name": "Normalize Current Prices",
      "type": "n8n-nodes-base.code",
      "position": [
        720,
        160
      ],
      "parameters": {
        "jsCode": "const currentData = $('Fetch Current Prices').all();\nconst initData = $('Initialize Monitoring Session').first().json;\n\n// Transform current prices to standard format\nconst products = [];\nfor (const item of currentData) {\n  const priceData = item.json.products || [item.json];\n  for (const product of (Array.isArray(priceData) ? priceData : [priceData])) {\n    products.push({\n      productId: product.id || product.sku || 'unknown',\n      productName: product.name || product.title || 'Unknown Product',\n      competitor: product.competitor || 'Unknown',\n      currentPrice: parseFloat(product.price) || 0,\n      currency: product.currency || 'USD',\n      category: product.category || 'General',\n      url: product.url || '',\n      fetchedAt: initData.checkTimestamp\n    });\n  }\n}\n\nreturn products.map(p => ({ json: p }));"
      },
      "typeVersion": 2
    },
    {
      "id": "eb11f5bf-1b6f-48f3-842c-34caa2ddf7fc",
      "name": "Normalize Previous Prices",
      "type": "n8n-nodes-base.code",
      "position": [
        720,
        368
      ],
      "parameters": {
        "jsCode": "const previousData = $('Fetch Previous Prices').all();\n\n// Transform previous prices to standard format\nconst products = previousData.map(item => ({\n  productId: item.json.productId || item.json['Product ID'] || 'unknown',\n  productName: item.json.productName || item.json['Product Name'] || 'Unknown',\n  competitor: item.json.competitor || item.json['Competitor'] || 'Unknown',\n  previousPrice: parseFloat(item.json.currentPrice || item.json['Price'] || 0),\n  currency: item.json.currency || item.json['Currency'] || 'USD',\n  category: item.json.category || item.json['Category'] || 'General',\n  lastUpdated: item.json.fetchedAt || item.json['Last Updated'] || ''\n}));\n\nreturn products.map(p => ({ json: p }));"
      },
      "typeVersion": 2
    },
    {
      "id": "188491cb-5d62-4a6e-a591-6c1c1b456713",
      "name": "Compare Price Datasets",
      "type": "n8n-nodes-base.compareDatasets",
      "position": [
        960,
        256
      ],
      "parameters": {
        "options": {},
        "mergeByFields": {
          "values": [
            {
              "field1": "productId",
              "field2": "productId"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "0a761044-7851-4757-92ef-ac585b925d57",
      "name": "Process Removed Products",
      "type": "n8n-nodes-base.code",
      "position": [
        1200,
        64
      ],
      "parameters": {
        "jsCode": "// Process removed products (In A only - was in previous, not in current)\nconst items = $input.all();\n\nreturn items.map(item => ({\n  json: {\n    ...item.json,\n    changeType: 'REMOVED',\n    changePercent: -100,\n    alertLevel: 'routine',\n    analysis: 'Product no longer available from competitor'\n  }\n}));"
      },
      "typeVersion": 2
    },
    {
      "id": "f9a9879b-5772-457a-b695-df7d959f4f92",
      "name": "Process Unchanged",
      "type": "n8n-nodes-base.code",
      "position": [
        1200,
        208
      ],
      "parameters": {
        "jsCode": "// Process unchanged products (Same)\nconst items = $input.all();\n\nreturn items.map(item => ({\n  json: {\n    ...item.json,\n    changeType: 'UNCHANGED',\n    changePercent: 0,\n    alertLevel: 'none',\n    analysis: 'Price stable'\n  }\n}));"
      },
      "typeVersion": 2
    },
    {
      "id": "55182390-fa76-454f-ac43-a1b19ece2486",
      "name": "Process Changed Prices",
      "type": "n8n-nodes-base.code",
      "position": [
        1200,
        336
      ],
      "parameters": {
        "jsCode": "// Process changed products (Different) - key analysis\nconst items = $input.all();\n\nreturn items.map(item => {\n  const d = item.json;\n  const prevPrice = d.input1?.previousPrice || d.previousPrice || 0;\n  const currPrice = d.input2?.currentPrice || d.currentPrice || 0;\n  const changePercent = prevPrice > 0 ? ((currPrice - prevPrice) / prevPrice * 100) : 0;\n  const absChange = Math.abs(changePercent);\n  \n  let alertLevel = 'none';\n  if (absChange >= 10) alertLevel = 'urgent';\n  else if (absChange >= 5) alertLevel = 'routine';\n  \n  return {\n    json: {\n      productId: d.input1?.productId || d.input2?.productId || d.productId,\n      productName: d.input2?.productName || d.input1?.productName || d.productName,\n      competitor: d.input2?.competitor || d.input1?.competitor || d.competitor,\n      previousPrice: prevPrice,\n      currentPrice: currPrice,\n      currency: d.input2?.currency || d.input1?.currency || 'USD',\n      category: d.input2?.category || d.input1?.category || 'General',\n      changeType: changePercent > 0 ? 'PRICE_INCREASE' : 'PRICE_DECREASE',\n      changePercent: Math.round(changePercent * 100) / 100,\n      alertLevel: alertLevel\n    }\n  };\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "ed3127cb-9d46-44eb-9aff-a5f82b743426",
      "name": "Process New Products",
      "type": "n8n-nodes-base.code",
      "position": [
        1200,
        480
      ],
      "parameters": {
        "jsCode": "// Process new products (In B only - in current, not in previous)\nconst items = $input.all();\n\nreturn items.map(item => ({\n  json: {\n    ...item.json,\n    changeType: 'NEW_PRODUCT',\n    changePercent: null,\n    alertLevel: 'routine',\n    analysis: 'New product detected in competitor catalog'\n  }\n}));"
      },
      "typeVersion": 2
    },
    {
      "id": "880e24a7-8950-42b7-a06d-667965cf7b47",
      "name": "Merge All Changes",
      "type": "n8n-nodes-base.merge",
      "position": [
        1424,
        256
      ],
      "parameters": {},
      "typeVersion": 3
    },
    {
      "id": "158ae9fa-70ef-4285-936c-b5a679daebaa",
      "name": "Filter Significant Changes",
      "type": "n8n-nodes-base.filter",
      "position": [
        1616,
        256
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "urgent",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.alertLevel }}",
              "rightValue": "urgent"
            },
            {
              "id": "routine",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.alertLevel }}",
              "rightValue": "routine"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "8b62163f-7658-4091-a168-19d996ea18c5",
      "name": "AI Price Analyst",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1840,
        256
      ],
      "parameters": {
        "text": "=Analyze this competitor price change and provide strategic recommendations:\n\nProduct: {{ $json.productName }}\nCompetitor: {{ $json.competitor }}\nCategory: {{ $json.category }}\nPrevious Price: {{ $json.previousPrice }} {{ $json.currency }}\nCurrent Price: {{ $json.currentPrice }} {{ $json.currency }}\nChange: {{ $json.changePercent }}%\nChange Type: {{ $json.changeType }}\n\nProvide:\n1. Impact assessment (1-2 sentences)\n2. Recommended action (match/hold/differentiate)\n3. Urgency level justification\n\nReturn JSON with keys: impactAssessment, recommendedAction, urgencyJustification",
        "options": {
          "systemMessage": "You are a pricing strategy analyst. Provide concise, actionable competitive intelligence. Always output valid JSON."
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "4e00fa84-a5ec-409a-9592-5d475054a936",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1840,
        480
      ],
      "parameters": {
        "model": "gpt-4o-mini",
        "options": {
          "temperature": 0.2
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "dbaafecc-2bda-475b-ba54-6ab17358f200",
      "name": "Parse AI Analysis",
      "type": "n8n-nodes-base.code",
      "position": [
        2064,
        256
      ],
      "parameters": {
        "jsCode": "const priceData = $input.first().json;\nconst aiOutput = priceData.output || '{}';\n\nlet aiAnalysis = {};\ntry {\n  const jsonMatch = aiOutput.match(/\\{[\\s\\S]*\\}/);\n  if (jsonMatch) {\n    aiAnalysis = JSON.parse(jsonMatch[0]);\n  }\n} catch (e) {\n  aiAnalysis = {\n    impactAssessment: 'Unable to analyze - manual review recommended',\n    recommendedAction: 'hold',\n    urgencyJustification: 'AI analysis unavailable'\n  };\n}\n\n// Get original price data from the filter output\nconst originalData = $('Filter Significant Changes').first().json;\n\nreturn [{\n  json: {\n    ...originalData,\n    aiAnalysis: aiAnalysis,\n    analyzedAt: new Date().toISOString()\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "6a755d41-6ab1-442e-bebd-6590bd3d98e7",
      "name": "Route by Alert Level",
      "type": "n8n-nodes-base.switch",
      "position": [
        2288,
        256
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.alertLevel }}",
                    "rightValue": "urgent"
                  }
                ]
              }
            },
            {
              "conditions": {
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.alertLevel }}",
                    "rightValue": "routine"
                  }
                ]
              }
            }
          ]
        },
        "options": {
          "fallbackOutput": "extra"
        }
      },
      "typeVersion": 3.2
    },
    {
      "id": "67a5356e-383e-4e6e-b44a-e2eb3d2e5817",
      "name": "Slack Urgent Alert",
      "type": "n8n-nodes-base.slack",
      "position": [
        2528,
        160
      ],
      "parameters": {
        "text": "=:rotating_light: *URGENT PRICE ALERT*\n\n*Product:* {{ $json.productName }}\n*Competitor:* {{ $json.competitor }}\n*Change:* {{ $json.changePercent }}% ({{ $json.changeType }})\n*Previous:* {{ $json.previousPrice }} {{ $json.currency }}\n*Current:* {{ $json.currentPrice }} {{ $json.currency }}\n\n*AI Analysis:*\n{{ $json.aiAnalysis.impactAssessment }}\n\n*Recommended Action:* {{ $json.aiAnalysis.recommendedAction }}\n*Urgency:* {{ $json.aiAnalysis.urgencyJustification }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "#price-alerts"
        },
        "otherOptions": {}
      },
      "typeVersion": 2.2
    },
    {
      "id": "d3b12e45-21a0-4792-b90d-114e074ff982",
      "name": "Email Routine Alert",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2528,
        320
      ],
      "parameters": {
        "sendTo": "=pricing-team@company.com",
        "message": "=Competitor Price Change Detected\n\nProduct: {{ $json.productName }}\nCompetitor: {{ $json.competitor }}\nCategory: {{ $json.category }}\n\nPrice Change:\n- Previous: {{ $json.previousPrice }} {{ $json.currency }}\n- Current: {{ $json.currentPrice }} {{ $json.currency }}\n- Change: {{ $json.changePercent }}%\n\nAI Analysis:\n{{ $json.aiAnalysis.impactAssessment }}\n\nRecommended Action: {{ $json.aiAnalysis.recommendedAction }}\n\nThis is a routine notification. No immediate action required.",
        "options": {},
        "subject": "=Price Change Alert: {{ $json.productName }} ({{ $json.changePercent }}%)"
      },
      "typeVersion": 2.1
    },
    {
      "id": "ef6cf86c-bf55-47f7-a39a-2d14b62aa290",
      "name": "Log Low Priority Changes",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2528,
        480
      ],
      "parameters": {
        "columns": {
          "value": {
            "Change %": "={{ $json.changePercent }}",
            "Timestamp": "={{ $json.analyzedAt }}",
            "Competitor": "={{ $json.competitor }}",
            "Product ID": "={{ $json.productId }}",
            "Alert Level": "={{ $json.alertLevel }}",
            "Product Name": "={{ $json.productName }}",
            "Current Price": "={{ $json.currentPrice }}",
            "Previous Price": "={{ $json.previousPrice }}",
            "AI Recommendation": "={{ $json.aiAnalysis.recommendedAction }}"
          },
          "mappingMode": "defineBelow"
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "AlertLog"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "ccc1f4e7-69c1-4b76-a2ca-eb0f09f9fa37",
      "name": "Merge Alert Results",
      "type": "n8n-nodes-base.merge",
      "position": [
        2736,
        256
      ],
      "parameters": {
        "mode": "chooseBranch"
      },
      "typeVersion": 3
    },
    {
      "id": "65c2d6d7-5c17-4cf0-9bed-ba5adddf91c4",
      "name": "Prepare Storage Update",
      "type": "n8n-nodes-base.code",
      "position": [
        2736,
        464
      ],
      "parameters": {
        "jsCode": "const allData = $('Normalize Current Prices').all();\n\n// Prepare data for storage update\nreturn allData.map(item => ({\n  json: {\n    productId: item.json.productId,\n    productName: item.json.productName,\n    competitor: item.json.competitor,\n    currentPrice: item.json.currentPrice,\n    currency: item.json.currency,\n    category: item.json.category,\n    fetchedAt: item.json.fetchedAt\n  }\n}));"
      },
      "typeVersion": 2
    },
    {
      "id": "a4c13601-986e-4876-b2a7-3f7dacb124b9",
      "name": "Update Price History",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2960,
        464
      ],
      "parameters": {
        "columns": {
          "value": {
            "Price": "={{ $json.currentPrice }}",
            "Category": "={{ $json.category }}",
            "Currency": "={{ $json.currency }}",
            "Competitor": "={{ $json.competitor }}",
            "Product ID": "={{ $json.productId }}",
            "Last Updated": "={{ $json.fetchedAt }}",
            "Product Name": "={{ $json.productName }}"
          },
          "mappingMode": "defineBelow"
        },
        "options": {
          "cellFormat": "USER_ENTERED"
        },
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "PriceHistory"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "ac8b59e3-749f-46d4-b9e5-78f0506b618c",
      "name": "Log Monitoring Run",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2960,
        256
      ],
      "parameters": {
        "columns": {
          "value": {
            "Status": "Completed",
            "Timestamp": "={{ $('Initialize Monitoring Session').first().json.checkTimestamp }}",
            "Monitoring ID": "={{ $('Initialize Monitoring Session').first().json.monitoringId }}",
            "Changes Detected": "={{ $('Filter Significant Changes').all().length }}",
            "Products Checked": "={{ $('Normalize Current Prices').all().length }}"
          },
          "mappingMode": "defineBelow"
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "MonitoringLog"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.5
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "9b08aef7-9a67-46a5-9969-974e85dbce37",
  "connections": {
    "AI Price Analyst": {
      "main": [
        [
          {
            "node": "Parse AI Analysis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge All Changes": {
      "main": [
        [
          {
            "node": "Filter Significant Changes",
            "type": "main",
            "index": 0
          },
          {
            "node": "Prepare Storage Update",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Price Analyst",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Parse AI Analysis": {
      "main": [
        [
          {
            "node": "Route by Alert Level",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Unchanged": {
      "main": [
        [
          {
            "node": "Merge All Changes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Slack Urgent Alert": {
      "main": [
        [
          {
            "node": "Merge Alert Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Email Routine Alert": {
      "main": [
        [
          {
            "node": "Merge Alert Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Alert Results": {
      "main": [
        [
          {
            "node": "Log Monitoring Run",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Current Prices": {
      "main": [
        [
          {
            "node": "Normalize Current Prices",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Price Check Schedule": {
      "main": [
        [
          {
            "node": "Initialize Monitoring Session",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process New Products": {
      "main": [
        [
          {
            "node": "Merge All Changes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Route by Alert Level": {
      "main": [
        [
          {
            "node": "Slack Urgent Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Email Routine Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Log Low Priority Changes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Previous Prices": {
      "main": [
        [
          {
            "node": "Normalize Previous Prices",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compare Price Datasets": {
      "main": [
        [
          {
            "node": "Process Removed Products",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Process Unchanged",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Process Changed Prices",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Process New Products",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Storage Update": {
      "main": [
        [
          {
            "node": "Update Price History",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Changed Prices": {
      "main": [
        [
          {
            "node": "Merge All Changes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log Low Priority Changes": {
      "main": [
        [
          {
            "node": "Merge Alert Results",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Normalize Current Prices": {
      "main": [
        [
          {
            "node": "Compare Price Datasets",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Process Removed Products": {
      "main": [
        [
          {
            "node": "Merge All Changes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Previous Prices": {
      "main": [
        [
          {
            "node": "Compare Price Datasets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Significant Changes": {
      "main": [
        [
          {
            "node": "AI Price Analyst",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Initialize Monitoring Session": {
      "main": [
        [
          {
            "node": "Fetch Current Prices",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch Previous Prices",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}