{
  "id": "AYyBRyduszJfrndg",
  "name": "GPT-4o-Powered Vendor Intelligence & Contract Management Platform",
  "tags": [],
  "nodes": [
    {
      "id": "64171e7a-9d61-4a06-9226-dec98e3182ba",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        112,
        576
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 9
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "13865f6d-ae35-4e22-b6af-c78f086f6ffb",
      "name": "Workflow Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        336,
        576
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "id-1",
              "name": "vendorPricingUrl",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Vendor pricing API or webpage URL__>"
            },
            {
              "id": "id-2",
              "name": "deliveryReliabilityUrl",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Delivery reliability API or webpage URL__>"
            },
            {
              "id": "id-3",
              "name": "priceThreshold",
              "type": "number",
              "value": 10
            },
            {
              "id": "id-4",
              "name": "contractDatabaseId",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Airtable base ID for contracts__>"
            },
            {
              "id": "id-5",
              "name": "contractTableName",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Airtable table name for contracts__>"
            },
            {
              "id": "id-6",
              "name": "tasksSheetId",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Google Sheets ID for renewal tasks__>"
            },
            {
              "id": "id-7",
              "name": "savingsSheetId",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Google Sheets ID for savings tracking__>"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "efcd4e36-de73-484d-bdca-4419624628c7",
      "name": "Scrape Vendor Pricing",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        560,
        448
      ],
      "parameters": {
        "url": "={{ $('Workflow Configuration').first().json.vendorPricingUrl }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "json"
            }
          }
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "6a9e603e-f52e-4595-800c-977ee8d0af20",
      "name": "Scrape Delivery Reliability",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        560,
        576
      ],
      "parameters": {
        "url": "={{ $('Workflow Configuration').first().json.deliveryReliabilityUrl }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "json"
            }
          }
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "01fa02a0-6388-4fb9-90b9-39d23664bc23",
      "name": "Get Contract Data",
      "type": "n8n-nodes-base.airtable",
      "position": [
        560,
        752
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').first().json.contractDatabaseId }}"
        },
        "table": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').first().json.contractTableName }}"
        },
        "options": {},
        "operation": "search"
      },
      "typeVersion": 2.1
    },
    {
      "id": "e7aea4af-2dc2-4f0b-a4c3-cae708492926",
      "name": "Merge Vendor Data",
      "type": "n8n-nodes-base.merge",
      "position": [
        784,
        480
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineAll"
      },
      "typeVersion": 3.2
    },
    {
      "id": "f02c1764-11af-4bf0-a662-eb61f4e6a27b",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        960,
        704
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "id",
          "value": "gpt-4o"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "b321e5fc-76f8-441b-aa7b-0440f1da3516",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1712,
        704
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"vendorName\": {\n      \"type\": \"string\",\n      \"description\": \"Name of the vendor\"\n    },\n    \"currentPrice\": {\n      \"type\": \"number\",\n      \"description\": \"Current price from vendor\"\n    },\n    \"alternativePrice\": {\n      \"type\": \"number\",\n      \"description\": \"Best alternative price found\"\n    },\n    \"priceDifference\": {\n      \"type\": \"number\",\n      \"description\": \"Price difference in percentage\"\n    },\n    \"isOverpriced\": {\n      \"type\": \"boolean\",\n      \"description\": \"Whether vendor is overpriced\"\n    },\n    \"deliveryReliability\": {\n      \"type\": \"number\",\n      \"description\": \"Delivery reliability score\"\n    },\n    \"contractRenewalDate\": {\n      \"type\": \"string\",\n      \"description\": \"Contract renewal date\"\n    },\n    \"negotiationEmail\": {\n      \"type\": \"string\",\n      \"description\": \"Generated negotiation email content\"\n    },\n    \"potentialSavings\": {\n      \"type\": \"number\",\n      \"description\": \"Potential savings amount\"\n    }\n  }\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "5420ed55-0332-488b-8535-5e2feee4cf83",
      "name": "HTTP Request Tool",
      "type": "n8n-nodes-base.httpRequestTool",
      "position": [
        1088,
        752
      ],
      "parameters": {
        "url": "={{ $fromAI('searchUrl', 'URL to search for alternative vendor pricing', 'string') }}",
        "options": {},
        "toolDescription": "Search for alternative vendor pricing and information online"
      },
      "typeVersion": 4.3
    },
    {
      "id": "e6d0fc71-9a98-4788-93b6-d93f64b745b5",
      "name": "Calculate Savings Tool",
      "type": "@n8n/n8n-nodes-langchain.toolCode",
      "position": [
        1200,
        704
      ],
      "parameters": {
        "jsCode": "// Calculate potential savings by comparing current and alternative vendor prices\n// Expected input: query object with currentPrice and alternativePrice\n\nconst data = typeof query === 'string' ? JSON.parse(query) : query;\nconst currentPrice = parseFloat(data.currentPrice);\nconst alternativePrice = parseFloat(data.alternativePrice);\n\nif (isNaN(currentPrice) || isNaN(alternativePrice)) {\n  return 'Error: Invalid price values provided';\n}\n\nconst savingsAmount = currentPrice - alternativePrice;\nconst savingsPercentage = ((savingsAmount / currentPrice) * 100).toFixed(2);\n\nconst result = {\n  currentPrice: currentPrice,\n  alternativePrice: alternativePrice,\n  savingsAmount: savingsAmount.toFixed(2),\n  savingsPercentage: savingsPercentage + '%',\n  recommendation: savingsAmount > 0 ? 'Switch to alternative vendor' : 'Keep current vendor'\n};\n\nreturn JSON.stringify(result, null, 2);",
        "description": "Calculate potential savings by comparing current and alternative vendor prices"
      },
      "typeVersion": 1.3
    },
    {
      "id": "385440cc-ad6e-4eb8-9c7e-f8d86482075c",
      "name": "Gmail Tool",
      "type": "n8n-nodes-base.gmailTool",
      "position": [
        1328,
        704
      ],
      "parameters": {
        "sendTo": "={{ $fromAI('vendorEmail', 'Vendor contact email address', 'string') }}",
        "message": "={{ $fromAI('emailBody', 'Email body content', 'string') }}",
        "options": {},
        "subject": "={{ $fromAI('emailSubject', 'Email subject line', 'string') }}",
        "descriptionType": "manual",
        "toolDescription": "Send negotiation email to vendor contact"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "88ffc907-804d-4f25-bea5-a6ed361f8f8c",
      "name": "Google Sheets Tool",
      "type": "n8n-nodes-base.googleSheetsTool",
      "position": [
        1456,
        704
      ],
      "parameters": {
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $fromAI('sheetName', 'Sheet name', 'string', 'Tasks') }}"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $fromAI('tasksSheetId', 'Google Sheets ID for tasks', 'string') }}"
        },
        "descriptionType": "manual",
        "toolDescription": "Create a renewal task in Google Sheets for upcoming contract renewals"
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "50febf7b-7f22-449c-a645-422ce3e3a4b0",
      "name": "Airtable Tool",
      "type": "n8n-nodes-base.airtableTool",
      "position": [
        1584,
        704
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $fromAI('baseId', 'Airtable base ID', 'string') }}"
        },
        "table": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $fromAI('tableName', 'Table name', 'string') }}"
        },
        "columns": {
          "value": null,
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "={{ $fromAI('recordId', 'Record ID to update', 'string') }}"
          ]
        },
        "options": {},
        "operation": "update",
        "descriptionType": "manual",
        "toolDescription": "Update contract database with analysis results and new pricing information"
      },
      "typeVersion": 2.1
    },
    {
      "id": "8309cbec-80ee-49b2-9c02-cdc3cf22c222",
      "name": "Vendor Analysis Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1256,
        480
      ],
      "parameters": {
        "text": "=Vendor data to analyze: {{ $json }}",
        "options": {
          "systemMessage": "=You are an autonomous vendor and contract management assistant. Your task is to:\n\n1. Analyze vendor pricing data from multiple sources\n2. Compare current vendor prices with alternative options using the Search Alternative Vendors tool\n3. Calculate price differences and potential savings using the Calculate Savings tool\n4. Identify overpriced vendors (those with prices more than {{ $('Workflow Configuration').first().json.priceThreshold }}% higher than alternatives)\n5. Evaluate delivery reliability scores\n6. Check contract renewal dates\n7. For overpriced vendors, generate professional negotiation emails using the Send Negotiation Email tool\n8. Create renewal tasks in Google Sheets using the Create Renewal Task tool for contracts expiring within 90 days\n9. Update contract records in Airtable using the Update Contract Record tool with analysis results\n10. Track savings opportunities\n\nReturn structured data with all analysis results including vendor name, pricing comparison, overpriced flag, delivery reliability, renewal date, negotiation email content, and potential savings."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3
    },
    {
      "id": "df56b99b-df6a-4291-ae69-6a2d1a2ea671",
      "name": "Check for Overpriced Vendors",
      "type": "n8n-nodes-base.if",
      "position": [
        1888,
        480
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": false,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "id-1",
              "operator": {
                "type": "boolean",
                "operation": "true"
              },
              "leftValue": "={{ $('Vendor Analysis Agent').item.json.isOverpriced }}"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "6f5b6a3b-23d2-4549-8e73-defc0fe547c1",
      "name": "Send Negotiation Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2160,
        480
      ],
      "parameters": {
        "sendTo": "={{ $json.vendorEmail }}",
        "message": "={{ $json.negotiationEmail }}",
        "options": {},
        "subject": "=Negotiation Request: {{ $json.vendorName }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "9a2f55c5-d3fb-4b94-9655-a932f6586842",
      "name": "Create Renewal Tasks",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2320,
        480
      ],
      "parameters": {
        "columns": {
          "value": {
            "Status": "={{ $json.status }}",
            "Vendor Name": "={{ $json.vendorName }}",
            "Task Description": "={{ $json.taskDescription }}",
            "Contract Renewal Date": "={{ $json.contractRenewalDate }}"
          },
          "schema": [
            {
              "id": "Vendor Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Vendor Name",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "Contract Renewal Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Contract Renewal Date",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "Task Description",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Task Description",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Vendor Name"
          ]
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Tasks"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').first().json.tasksSheetId }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "5e0e08ed-d717-4d31-9105-d254175edbe3",
      "name": "Update Contract Database",
      "type": "n8n-nodes-base.airtable",
      "position": [
        2544,
        480
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').first().json.contractDatabaseId }}"
        },
        "table": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').first().json.contractTableName }}"
        },
        "columns": {
          "value": {
            "id": "={{ $json.recordId }}",
            "Pricing": "={{ $json.pricing }}",
            "Overpriced Status": "={{ $json.overpricedStatus }}",
            "Potential Savings": "={{ $json.potentialSavings }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "id",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "Pricing",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Pricing",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "Overpriced Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Overpriced Status",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "Potential Savings",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Potential Savings",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "id"
          ]
        },
        "options": {},
        "operation": "update"
      },
      "typeVersion": 2.1
    },
    {
      "id": "5c2ceacc-60be-4fb8-90f8-f4271fff56f5",
      "name": "Track Savings",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2752,
        480
      ],
      "parameters": {
        "columns": {
          "value": {
            "date": "={{ $now.toFormat('yyyy-MM-dd') }}",
            "status": "={{ $json.status }}",
            "vendorName": "={{ $json.vendorName }}",
            "potentialSavings": "={{ $json.potentialSavings }}"
          },
          "schema": [
            {
              "id": "date",
              "required": false,
              "displayName": "date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "vendorName",
              "required": false,
              "displayName": "vendorName",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "potentialSavings",
              "required": false,
              "displayName": "potentialSavings",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "vendorName"
          ]
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Savings"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').first().json.savingsSheetId }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "50330c43-2e50-4693-bbf6-fd54e3fb9a4d",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1840,
        48
      ],
      "parameters": {
        "color": 6,
        "content": "## Benefits\nEliminates manual data gathering (hours to minutes), ensures consistent vendor evaluation criteria \n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "0d656dbc-10c5-4b19-9079-4b1363fcf8dc",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1584,
        48
      ],
      "parameters": {
        "color": 5,
        "content": "## Customization\nModify trigger schedule, add/remove scraper nodes for new vendors, adjust Claude prompt for different analysis criteria "
      },
      "typeVersion": 1
    },
    {
      "id": "9019b6c6-7fd8-461d-9463-fa231a8ecea2",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1328,
        48
      ],
      "parameters": {
        "color": 4,
        "content": "## Use Cases\nAutomate weekly vendor performance reviews, generate compliance reports for procurement teams "
      },
      "typeVersion": 1
    },
    {
      "id": "a3d289ae-b617-4dd1-8d6d-f06e71c22de4",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1040,
        48
      ],
      "parameters": {
        "color": 3,
        "width": 272,
        "content": "## Prerequisites\nOpenAI/Claude API key, Gmail credentials, Google Sheets API access, Vendor data sources (web scrapers or direct APIs)."
      },
      "typeVersion": 1
    },
    {
      "id": "265d8994-a49a-42fa-9661-be9a4f50c2d3",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        624,
        48
      ],
      "parameters": {
        "color": 2,
        "width": 400,
        "height": 208,
        "content": "## Setup Steps\n1. Configure Schedule Trigger timing. \n2. Add scraper credentials (Vendor Pricing, Delivery Reliability, Contract Data nodes). \n3. Connect Claude/OpenAI API key in Vendor Analysis Agent. \n4. Authenticate Gmail account for notifications. \n5. Link Google Sheets API for data storage."
      },
      "typeVersion": 1
    },
    {
      "id": "c7a89fe7-c5cc-4d88-8647-632fcb9c9569",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        32,
        48
      ],
      "parameters": {
        "width": 576,
        "height": 192,
        "content": "## How It Works\nSchedules automated vendor pricing analysis across multiple sources. Fetches delivery reliability and contract data, analyzes vendor performance using Claude AI, then distributes consolidated reports via Gmail and creates Google Sheets summaries. Target audience: procurement teams and business analysts managing multi-vendor relationships. Solves vendor evaluation bottlenecks by automating data collection, AI-driven analysis, and report distribution."
      },
      "typeVersion": 1
    },
    {
      "id": "75f75a1f-b511-4eda-9744-304a458332dc",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        16,
        320
      ],
      "parameters": {
        "color": 7,
        "width": 880,
        "height": 672,
        "content": "## Data Collection:  \nTrigger initiates automated scraping of vendor data (pricing, reliability, contracts). \n\n**Why:** Eliminates manual data gathering and ensures current information across all vendors."
      },
      "typeVersion": 1
    },
    {
      "id": "ed6b93c8-d56d-4530-bfac-416b3425c26e",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1856,
        320
      ],
      "parameters": {
        "color": 7,
        "width": 1024,
        "height": 464,
        "content": "## Multi-Channel Distribution: \nAgent branches outputs to Gmail (notifications), Google Sheets (archive), and data parser. \n\n**Why:** Delivers insights through preferred channels, immediate alerts for decision-makers, permanent records for tracking, and structured data  "
      },
      "typeVersion": 1
    },
    {
      "id": "48d1eeb2-76fa-41cc-98a9-642a98a5ffbd",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        912,
        320
      ],
      "parameters": {
        "color": 7,
        "width": 928,
        "height": 672,
        "content": "\n## Intelligent Analysis: \n\nData flows to vendor analysis agent powered by AI. \n\n**Why:** Replaces tedious manual review with intelligent pattern recognition and comparative insights."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "161cf5b4-0c21-40d4-abb3-b04895395a87",
  "connections": {
    "Gmail Tool": {
      "ai_tool": [
        [
          {
            "node": "Vendor Analysis Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Airtable Tool": {
      "ai_tool": [
        [
          {
            "node": "Vendor Analysis Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Workflow Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request Tool": {
      "ai_tool": [
        [
          {
            "node": "Vendor Analysis Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Merge Vendor Data": {
      "main": [
        [
          {
            "node": "Vendor Analysis Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Vendor Analysis Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets Tool": {
      "ai_tool": [
        [
          {
            "node": "Vendor Analysis Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Create Renewal Tasks": {
      "main": [
        [
          {
            "node": "Update Contract Database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape Vendor Pricing": {
      "main": [
        [
          {
            "node": "Merge Vendor Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Vendor Analysis Agent": {
      "main": [
        [
          {
            "node": "Check for Overpriced Vendors",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Calculate Savings Tool": {
      "ai_tool": [
        [
          {
            "node": "Vendor Analysis Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Send Negotiation Email": {
      "main": [
        [
          {
            "node": "Create Renewal Tasks",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Workflow Configuration": {
      "main": [
        [
          {
            "node": "Scrape Vendor Pricing",
            "type": "main",
            "index": 0
          },
          {
            "node": "Scrape Delivery Reliability",
            "type": "main",
            "index": 0
          },
          {
            "node": "Get Contract Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Vendor Analysis Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Update Contract Database": {
      "main": [
        [
          {
            "node": "Track Savings",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape Delivery Reliability": {
      "main": [
        [
          {
            "node": "Merge Vendor Data",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Check for Overpriced Vendors": {
      "main": [
        [
          {
            "node": "Send Negotiation Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}