AutomationFlowsAI & RAG › Automate Vendor Analysis & Contract Management with Gpt-4o, Gmail, and…

Automate Vendor Analysis & Contract Management with Gpt-4o, Gmail, and…

Original n8n title: Automate Vendor Analysis & Contract Management with Gpt-4o, Gmail, and Google Sheets

ByCheng Siong Chin @cschin on n8n.io

Schedules 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…

Cron / scheduled trigger★★★★☆ complexityAI-powered28 nodesHTTP RequestAirtableOpenAI ChatOutput Parser StructuredHTTP Request ToolTool CodeGmail ToolGoogle Sheets Tool
AI & RAG Trigger: Cron / scheduled Nodes: 28 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #11713 — we link there as the canonical source.

This workflow follows the Agent → Airtable recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "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
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Schedules 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…

Source: https://n8n.io/workflows/11713/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

This n8n automation workflow automates the creation, scripting, production, and posting of YouTube videos. It leverages AI (OpenAI), image generation (PIAPI), video rendering (Shotstack), and platform

Agent, OpenAI Chat, Airtable Tool +7
AI & RAG

Created by: Peyton Leveillee Last updated: October 2025

OpenAI Chat, Google Sheets, HTTP Request +5
AI & RAG

SEO Blog Article Generation Workflow. Uses outputParserStructured, httpRequest, agent, lmChatOpenAi. Scheduled trigger; 56 nodes.

Output Parser Structured, HTTP Request, Agent +4
AI & RAG

This workflow was born out of a very real problem.

Output Parser Structured, OpenAI Chat, Memory Buffer Window +11
AI & RAG

Automate post-purchase workflows by instantly fetching successful Stripe payments, matching them to corresponding automation templates in Google Sheets, and sending customers personalized access email

Lm Chat Azure Open Ai, Output Parser Structured, Google Sheets Tool +5