{
  "id": "QQcM4ZwqXsd75fiT",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Track competitor pricing and features from BrowserAct to Google Sheets",
  "tags": [],
  "nodes": [
    {
      "id": "aa0249f3-4365-4148-81d7-fafaacd022d1",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        512,
        224
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "a166259b-5ea7-4395-8fb7-fc70aa25e1e2",
      "name": "Aggregate",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        1072,
        -32
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1
    },
    {
      "id": "c9b8a456-537a-44ae-b6d7-c2b951590e4d",
      "name": "Weekly Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        0,
        224
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks"
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "b4f8640e-50b4-41c6-a27a-0aa8d0f19acd",
      "name": "Update Database",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1600,
        368
      ],
      "parameters": {
        "columns": {
          "value": {
            "URL": "={{ $('Loop Over Items').item.json.URL }}",
            "Comparison": "={{ $json.output.comparison }}",
            "row_number": "={{ $('Loop Over Items').item.json.row_number }}",
            "Competitor Name": "={{ $('Loop Over Items').item.json[\"Competitor Name\"] }}",
            "Last_Scrape_Date": "={{ $('Weekly Trigger').first().json[\"Readable date\"] }}",
            "Last_Scrape_Content": "={{ $json.output.content }}"
          },
          "schema": [
            {
              "id": "Competitor Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Competitor Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last_Scrape_Content",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Last_Scrape_Content",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last_Scrape_Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Last_Scrape_Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Comparison",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Comparison",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "row_number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ONMcbA-JC46rLlHovGdczR-t63nSOz4SBTbKneJXk7E/edit#gid=0",
          "cachedResultName": "Data"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1ONMcbA-JC46rLlHovGdczR-t63nSOz4SBTbKneJXk7E",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ONMcbA-JC46rLlHovGdczR-t63nSOz4SBTbKneJXk7E/edit?usp=drivesdk",
          "cachedResultName": "AI Competitor Spy: Pricing & Feature Tracker"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "4da38ef6-f46b-48e7-b59e-92f2b43b8a75",
      "name": "Extract page content",
      "type": "n8n-nodes-browseract.browserAct",
      "position": [
        832,
        240
      ],
      "parameters": {
        "type": "WORKFLOW",
        "workflowId": "75660998074542379",
        "workflowConfig": {
          "value": {
            "input-Tracking_Site": "={{ $json.URL }}"
          },
          "schema": [
            {
              "id": "input-Tracking_Site",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "description": "If left blank, the default value defined in BrowserAct will be used.",
              "displayName": "Tracking_Site",
              "defaultMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "input-Tracking_Site"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "credentials": {
        "browserActApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "56da0406-37ef-4144-be18-70809949babe",
      "name": "Analyze target pages",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1056,
        240
      ],
      "parameters": {
        "text": "=Current Data: {{ $json.output.string }}\nHistorical Data:{{ $('Loop Over Items').item.json.Last_Scrape_Content }}\nLast Scrape Date:{{ $('Loop Over Items').item.json.Last_Scrape_Date }}",
        "options": {
          "systemMessage": "You are a Pricing Plan Analyzer designed for an n8n automation workflow.\n\n**YOUR GOAL:**\nAnalyze the provided \"Current Data\" (JSON pricing plans) and compare it against the \"Historical Data\". You must return the result as a strict, valid JSON object.\n\n**INPUTS:**\n1. \"Current Data\": JSON string of the latest plans.\n2. \"Historical Data\": Text or JSON of the previous analysis (may be empty or null).\n\n**OUTPUT SCHEMA:**\nYou must return a single JSON object with exactly two keys: \"content\" and \"comparison\".\n\n{\n  \"content\": \"A formatted string analyzing the current plans...\",\n  \"comparison\": \"A formatted string listing changes OR current prices if no history...\"\n}\n\n**INSTRUCTIONS FOR KEY \"content\":**\n* Create a clean, readable summary of every plan in the \"Current Data\".\n* For each plan, include the Plan Name, Price, and Features.\n* Use standard text formatting (newlines like \\n) within the string to make it readable.\n* Do NOT use Markdown formatting (like **bold**) inside the string.\n\n**INSTRUCTIONS FOR KEY \"comparison\":**\n* Check if \"Historical Data\" exists and is not empty.\n* **SCENARIO A: Historical Data EXISTS**\n    * Compare \"Current Data\" vs \"Historical Data\".\n    * List specific changes in Price, Features, or Plans.\n* **SCENARIO B: Historical Data is MISSING/NULL**\n    * Do NOT attempt to compare.\n    * Instead, simply list the current price for each plan.\n    * End the section with the exact phrase: \"No historical data available. No changes detected.\"\n\n**CRITICAL FORMATTING RULES:**\n1.  **Output RAW JSON only.**\n2.  **Do NOT** wrap the output in markdown code blocks (e.g., do not use ```json ... ```).\n3.  Ensure all newlines in the text are properly escaped (`\\n`) so the JSON remains valid."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3
    },
    {
      "id": "09ffb3c0-bdd2-4fc2-8663-2829e98f5775",
      "name": "Retrieve \"loop\" results",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        848,
        -32
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ONMcbA-JC46rLlHovGdczR-t63nSOz4SBTbKneJXk7E/edit#gid=0",
          "cachedResultName": "Data"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1ONMcbA-JC46rLlHovGdczR-t63nSOz4SBTbKneJXk7E",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ONMcbA-JC46rLlHovGdczR-t63nSOz4SBTbKneJXk7E/edit?usp=drivesdk",
          "cachedResultName": "AI Competitor Spy: Pricing & Feature Tracker"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "executeOnce": true,
      "typeVersion": 4.7
    },
    {
      "id": "9d639aec-b759-4f57-8fa5-30e6fba52cd9",
      "name": "Analyze competitor data & generate report",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1296,
        -128
      ],
      "parameters": {
        "text": "=Input data : {{ $json.data}}",
        "options": {
          "systemMessage": "Generate a comprehensive, structured text report analyzing a competitor's pricing based on scraped data. You must output a single JSON object with one key named \"text\".\n\nINPUTS: You will receive aggregated data containing:\n\nCompetitor Name\n\nURL\n\nLast_Scrape_Content: The current pricing and features.\n\nComparison: A summary of changes between the current scrape and historical data.\n\nOUTPUT SCHEMA: Return exactly one JSON object. Do not include markdown code blocks. { \"text\": \"Your formatted report string here...\" }\n\nINSTRUCTIONS FOR THE \"text\" VALUE: The value of the \"text\" key must be a single string using \\n for line breaks. Follow this structure for each competitor provided:\n\nSECTION 1: CURRENT PLAN ANALYSIS\n\nHeader: ANALYSIS FOR [COMPETITOR NAME]\n\nSource: [URL]\n\nFor every plan in \"Last_Scrape_Content\", list:\n\nPLAN: [Name]\n\nPRICE: [Price]\n\nKEY FEATURES: [Summary of features]\n\nSECTION 2: COMPARISON SUMMARY\n\nHeader: COMPARISON AND CHANGE LOG\n\nUse the data in the \"Comparison\" field to identify:\n\nPRICE CHANGES: (e.g., \"Basic increased from $25 to $28\")\n\nFEATURE UPDATES: (e.g., \"Features significantly reduced in the Free plan\")\n\nPLAN SHIFTS: (e.g., \"Free plan has been removed\")\n\nIf \"Comparison\" indicates no historical data or no changes, state: \"No changes detected. Current data set as baseline.\"\n\nCRITICAL FORMATTING RULES:\n\nOutput RAW JSON only. Do NOT use ```json blocks.\n\nEscape all newlines as \\n and all double quotes as \" inside the string.\n\nNO MARKDOWN formatting inside the string (no #, **, or _). Use ALL CAPS for headers and dashes for lists to ensure compatibility with plain-text systems.\n\nProcess all competitors included in the input.\n\nOutput Example : \n{\n  \"text\": \"ANALYSIS FOR TYPEFORM\\n\\nPLAN: Basic\\nPRICE: $29/month\\nFEATURES: Unlimited forms, 100 responses/mo\\n--\\nPLAN: Plus\\nPRICE: $59/month\\nFEATURES: Everything in Basic, 1,000 responses/mo, Remove branding\\n\\nCOMPARISON\\nNo historical data available. Setting current data as baseline.\"\n}"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3
    },
    {
      "id": "e2843d79-8a8f-4ba2-924b-cb3c5c675e93",
      "name": "Structured Output",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1184,
        400
      ],
      "parameters": {
        "autoFix": true,
        "jsonSchemaExample": "{\n  \"content\": \"A formatted string analyzing the current plans...\",\n  \"comparison\": \"A formatted string listing changes...\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "c5f39358-d80c-4a14-b628-a8c7dc74399c",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1376,
        80
      ],
      "parameters": {
        "autoFix": true,
        "jsonSchemaExample": "{\n  \"text\": \"ANALYSIS FOR TYPEFORM\\n\\nPLAN: Basic\\nPRICE: $29/month\\nFEATURES: Unlimited forms, 100 responses/mo\\n--\\nPLAN: Plus\\nPRICE: $59/month\\nFEATURES: Everything in Basic, 1,000 responses/mo, Remove branding\\n\\nCOMPARISON\\nNo historical data available. Setting current data as baseline.\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "e6198a1e-d9a4-49d7-9fa5-b6cf81d6e40b",
      "name": "Create New Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1856,
        -32
      ],
      "parameters": {
        "title": "={{ $('Weekly Trigger').first().json[\"Readable date\"] }}",
        "options": {},
        "operation": "create",
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1ONMcbA-JC46rLlHovGdczR-t63nSOz4SBTbKneJXk7E",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ONMcbA-JC46rLlHovGdczR-t63nSOz4SBTbKneJXk7E/edit?usp=drivesdk",
          "cachedResultName": "AI Competitor Spy: Pricing & Feature Tracker"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "e49f86d3-abeb-4405-a784-c4b9fa0bb186",
      "name": "Define Headers",
      "type": "n8n-nodes-base.set",
      "position": [
        2096,
        -32
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "4330b9be-e949-47ca-882e-f12c197f712f",
              "name": "Comparative Reports",
              "type": "string",
              "value": ""
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "da2b2c8b-d0a8-4f38-8551-e8d179bc146d",
      "name": "Add Headers",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2320,
        -32
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Create New Sheet').first().json.sheetId }}"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1ONMcbA-JC46rLlHovGdczR-t63nSOz4SBTbKneJXk7E",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ONMcbA-JC46rLlHovGdczR-t63nSOz4SBTbKneJXk7E/edit?usp=drivesdk",
          "cachedResultName": "AI Competitor Spy: Pricing & Feature Tracker"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "c709d54c-1204-4494-ada1-d0407ca73b84",
      "name": "Update records",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2544,
        -32
      ],
      "parameters": {
        "columns": {
          "value": {
            "Comparative Reports": "={{ $('Analyze competitor data & generate report').first().json.output.text }}"
          },
          "schema": [
            {
              "id": "Comparative Reports",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Comparative Reports",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Comparative Reports"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Create New Sheet').first().json.sheetId }}"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1ONMcbA-JC46rLlHovGdczR-t63nSOz4SBTbKneJXk7E",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ONMcbA-JC46rLlHovGdczR-t63nSOz4SBTbKneJXk7E/edit?usp=drivesdk",
          "cachedResultName": "AI Competitor Spy: Pricing & Feature Tracker"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "ebec6544-8d56-4d9d-b93b-35ec679d3934",
      "name": "Notify on completion",
      "type": "n8n-nodes-base.slack",
      "position": [
        2784,
        -32
      ],
      "parameters": {
        "text": "The weekly updates to the competitor price and feature comparison are complete.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09KLV9DJSX",
          "cachedResultName": "all-browseract-workflow-test"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.4
    },
    {
      "id": "ad7f458c-0dde-4513-85d7-2539d12ad968",
      "name": "OpenRouter",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        1264,
        80
      ],
      "parameters": {
        "model": "google/gemini-2.5-pro",
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "50bbe9bc-776a-444c-9fa7-5a332643c5f6",
      "name": "OpenRouter Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        1040,
        416
      ],
      "parameters": {
        "model": "google/gemini-2.5-flash",
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "c17038d3-e815-45e4-9e8d-f62674f32a70",
      "name": "Documentation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -400,
        -352
      ],
      "parameters": {
        "width": 380,
        "height": 536,
        "content": "## \u26a1 AI Competitor Spy: Pricing & Feature Tracker\n\n**Summary:** This automation continuously monitors competitor websites for pricing and feature updates. It scrapes current data, compares it against historical records using AI, generates a detailed change report, and archives the findings in Google Sheets.\n\n### Requirements\n* **Credentials:** BrowserAct, OpenRouter, Google Sheets, Slack.\n* **Mandatory:** BrowserAct API (Template: **AI Competitor Spy: Pricing & Feature Tracker**)\n\n### How to Use\n1.  **Credentials:** Set up API keys for all services.\n2.  **BrowserAct Template:** Ensure the **AI Competitor Spy: Pricing & Feature Tracker** template is active.\n3.  **Google Sheet:** Prepare a sheet with columns for `Competitor Name`, `URL`, `Last_Scrape_Content`, and `Last_Scrape_Date`.\n4.  **Execution:** The workflow runs automatically on a weekly schedule.\n\n### Need Help?\n[How to Find Your BrowserAct API Key & Workflow ID](https://docs.browseract.com)\n[How to Connect n8n to BrowserAct](https://docs.browseract.com)\n[How to Use & Customize BrowserAct Templates](https://docs.browseract.com)"
      },
      "typeVersion": 1
    },
    {
      "id": "eea22642-2dee-4113-92ea-69c500dfeadc",
      "name": "Step 1 Explanation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        48
      ],
      "parameters": {
        "color": 7,
        "width": 620,
        "height": 140,
        "content": "### \ud83c\udfaf Step 1: Target Retrieval\n\nThe workflow triggers weekly. It connects to a Google Sheet database to fetch a list of competitor URLs and their previously recorded data (Last Scrape Content) to establish a baseline for comparison."
      },
      "typeVersion": 1
    },
    {
      "id": "0fe135c4-c91a-4555-81d9-4c0de3ea18a4",
      "name": "Step 2 Explanation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        464,
        576
      ],
      "parameters": {
        "color": 7,
        "width": 1272,
        "height": 152,
        "content": "### \ud83d\udd75\ufe0f Step 2: Live Scraping\n\nBrowserAct visits each competitor's pricing page in real-time. It extracts the current plan names, prices, and feature lists, ensuring the data is fresh and accurate.An AI agent compares the *live* scraped data against the *historical* data. It identifies specific changes (e.g., \"Price increased by $5\", \"Feature X removed\") and generates a concise status report for each competitor."
      },
      "typeVersion": 1
    },
    {
      "id": "37d8f4f4-5442-47f6-9c1b-c0aaddc8d52e",
      "name": "Step 4 Explanation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1856,
        -176
      ],
      "parameters": {
        "color": 7,
        "width": 1032,
        "height": 120,
        "content": "### \ud83d\udcbe Step 4: Archiving & Reporting\n\nThe workflow creates a new tab in the Google Sheet for the current week's report. It saves the AI's comparative analysis and updates the main database with the new \"Last Scrape\" content for the next run."
      },
      "typeVersion": 1
    },
    {
      "id": "da56e279-f0e6-4468-bc9e-80b17bf804d2",
      "name": "Fetch links & history",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        256,
        224
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ONMcbA-JC46rLlHovGdczR-t63nSOz4SBTbKneJXk7E/edit#gid=0",
          "cachedResultName": "Data"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1ONMcbA-JC46rLlHovGdczR-t63nSOz4SBTbKneJXk7E",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ONMcbA-JC46rLlHovGdczR-t63nSOz4SBTbKneJXk7E/edit?usp=drivesdk",
          "cachedResultName": "AI Competitor Spy: Pricing & Feature Tracker"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "da00c87f-43d1-4a6a-83d5-f2bfb6cec300",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        -352
      ],
      "parameters": {
        "color": 6,
        "width": 624,
        "height": 368,
        "content": "@[youtube](yBGtCt4gIdA)"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "8f5edfc3-0d8e-43dc-be59-c9d135748827",
  "connections": {
    "Aggregate": {
      "main": [
        [
          {
            "node": "Analyze competitor data & generate report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter": {
      "ai_languageModel": [
        [
          {
            "node": "Analyze competitor data & generate report",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Structured Output Parser",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Add Headers": {
      "main": [
        [
          {
            "node": "Update records",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Define Headers": {
      "main": [
        [
          {
            "node": "Add Headers",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update records": {
      "main": [
        [
          {
            "node": "Notify on completion",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Weekly Trigger": {
      "main": [
        [
          {
            "node": "Fetch links & history",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "Retrieve \"loop\" results",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Extract page content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Database": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create New Sheet": {
      "main": [
        [
          {
            "node": "Define Headers",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Model": {
      "ai_languageModel": [
        [
          {
            "node": "Analyze target pages",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Structured Output",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output": {
      "ai_outputParser": [
        [
          {
            "node": "Analyze target pages",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Analyze target pages": {
      "main": [
        [
          {
            "node": "Update Database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract page content": {
      "main": [
        [
          {
            "node": "Analyze target pages",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch links & history": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Retrieve \"loop\" results": {
      "main": [
        [
          {
            "node": "Aggregate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Analyze competitor data & generate report",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Analyze competitor data & generate report": {
      "main": [
        [
          {
            "node": "Create New Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}