This workflow follows the Agent → Gmail 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 →
{
"id": "dfkfhorPR0rdijSa",
"name": "Supplier Capacity Risk Alert Workflow",
"tags": [],
"nodes": [
{
"id": "afcfe106-40c6-4373-8a01-6a3bdcd937e7",
"name": "Initialize Risk Config",
"type": "n8n-nodes-base.set",
"position": [
272,
672
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "thresh-01",
"name": "risk_threshold",
"type": "string",
"value": "70"
},
{
"id": "thresh-02",
"name": "min_fulfillment",
"type": "string",
"value": "0.9"
},
{
"id": "thresh-03",
"name": "max_delay",
"type": "string",
"value": "2"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "e554c7d5-2312-4ecb-a131-973614808a0c",
"name": "Get Supplier Performance Data",
"type": "n8n-nodes-base.httpRequest",
"position": [
496,
672
],
"parameters": {
"url": "https://mocki.io/v1/f2d52749-15ab-4db3-a896-026fde3b52a7",
"options": {},
"sendQuery": true,
"queryParameters": {
"parameters": [
{}
]
}
},
"typeVersion": 4.4
},
{
"id": "71e38335-cc25-469c-a9ad-25e9cf7b7d68",
"name": "Check Valid Orders",
"type": "n8n-nodes-base.if",
"position": [
720,
672
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "cond-orders-gt-0",
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{ $json.orders }}",
"rightValue": 0
}
]
}
},
"typeVersion": 2.3
},
{
"id": "21deaf5b-12cf-473d-9e8f-73e13b04a238",
"name": "Normalize Supplier Data",
"type": "n8n-nodes-base.code",
"position": [
944,
672
],
"parameters": {
"jsCode": "// Extract and normalize supplier fields from the API response\nconst d = items[0].json;\n\nif (!d.supplier || d.orders === undefined || d.delivered === undefined) {\n throw new Error('Missing required supplier fields: supplier, orders, delivered');\n}\n\nreturn [{\n json: {\n supplier: d.supplier,\n orders: Number(d.orders),\n delivered: Number(d.delivered),\n delay: Number(d.avg_delay_days) || 0,\n category: d.category || 'General',\n region: d.region || 'Unknown'\n }\n}];"
},
"typeVersion": 2
},
{
"id": "02c349a7-d02c-47c6-9dad-185c6a3fbc29",
"name": "Compute Risk Metrics",
"type": "n8n-nodes-base.code",
"position": [
1168,
672
],
"parameters": {
"jsCode": "// Calculate fulfillment rate and risk score using threshold variables\nconst d = items[0].json;\nconst minFulfillment = parseFloat($('Initialize Risk Config').item.json.min_fulfillment);\nconst maxDelay = parseFloat($('Initialize Risk Config').item.json.max_delay);\nconst riskThreshold = parseInt($('Initialize Risk Config').item.json.risk_threshold);\n\nconst fulfillment = d.orders > 0 ? parseFloat((d.delivered / d.orders).toFixed(4)) : 0;\nconst fulfillmentPct = (fulfillment * 100).toFixed(1);\n\nlet riskScore = 0;\nconst flags = [];\n\nif (fulfillment < minFulfillment) {\n riskScore += 50;\n flags.push(`Fulfillment ${fulfillmentPct}% below threshold ${(minFulfillment*100).toFixed(0)}%`);\n}\nif (d.delay > maxDelay) {\n riskScore += 50;\n flags.push(`Avg delay ${d.delay} days exceeds max ${maxDelay} days`);\n}\n\nconst autoRisk = riskScore >= riskThreshold ? 'High' : riskScore >= 30 ? 'Medium' : 'Low';\n\nreturn [{\n json: {\n ...d,\n fulfillment,\n fulfillmentPct,\n riskScore,\n autoRisk,\n flags: flags.join('; ') || 'None'\n }\n}];"
},
"typeVersion": 2
},
{
"id": "ff9c1c4e-5399-4b87-8fc8-8918cac58321",
"name": "LLM Risk Engine",
"type": "@n8n/n8n-nodes-langchain.lmChatGroq",
"position": [
1472,
896
],
"parameters": {
"model": "llama-3.3-70b-versatile",
"options": {
"temperature": 0.2
}
},
"typeVersion": 1
},
{
"id": "d9f820b9-471f-4336-8ef6-9a09efe51be4",
"name": "Classify Supplier Risk (AI)",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1392,
672
],
"parameters": {
"text": "=You are a supply chain risk analyst. Analyze this supplier's performance metrics and classify their risk level.\n\n--- SUPPLIER DATA ---\nSupplier Name : {{ $json.supplier }}\nCategory : {{ $json.category }}\nRegion : {{ $json.region }}\nTotal Orders : {{ $json.orders }}\nDelivered : {{ $json.delivered }}\nFulfillment Rate: {{ $json.fulfillmentPct }}%\nAvg Delay (days): {{ $json.delay }}\nRisk Score : {{ $json.riskScore }} / 100\nAuto Flags : {{ $json.flags }}\n\n--- INSTRUCTIONS ---\nBased on the above data, respond ONLY with a valid JSON object. No markdown, no backticks, no extra text.\n\n{\n \"risk\": \"Low\" or \"Medium\" or \"High\",\n \"reason\": \"One sentence explaining the primary risk driver\",\n \"confidence\": \"Low\" or \"Medium\" or \"High\"\n}",
"options": {
"systemMessage": "You are a precise supply chain risk analyst. You always respond only with valid JSON, no markdown, no extra commentary."
},
"promptType": "define"
},
"typeVersion": 3.1
},
{
"id": "e55f3d61-61dc-42a6-8be8-a9c7e56c0181",
"name": "Validate & Merge Risk Output",
"type": "n8n-nodes-base.code",
"position": [
1744,
672
],
"parameters": {
"jsCode": "// Parse the AI risk classification response safely\nconst raw = (items[0].json.output || '').trim();\nlet parsed;\n\ntry {\n parsed = JSON.parse(raw);\n} catch (e) {\n const match = raw.match(/\\{[\\s\\S]*?\\}/);\n if (match) {\n try { parsed = JSON.parse(match[0]); } catch(e2) { parsed = null; }\n }\n}\n\nif (!parsed || !parsed.risk) {\n parsed = {\n risk: items[0].json.autoRisk || 'Unknown',\n reason: 'AI parse failed \u2014 fell back to rule-based score',\n confidence: 'Low'\n };\n}\n\n// Merge AI result with existing supplier metrics\nconst d = items[0].json;\nreturn [{\n json: {\n supplier : d.supplier,\n category : d.category,\n region : d.region,\n orders : d.orders,\n delivered : d.delivered,\n fulfillment : d.fulfillment,\n fulfillmentPct: d.fulfillmentPct,\n delay : d.delay,\n riskScore : d.riskScore,\n flags : d.flags,\n risk : parsed.risk,\n reason : parsed.reason,\n confidence : parsed.confidence || 'Medium',\n autoRisk : d.autoRisk\n }\n}];"
},
"typeVersion": 2
},
{
"id": "055a9625-c001-4a29-80c7-255aa30281ca",
"name": "Check High Risk Condition",
"type": "n8n-nodes-base.if",
"position": [
1968,
672
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "cond-high-risk",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.risk }}",
"rightValue": "Medium"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "04f82649-fb38-4d3c-a5b7-1a7122fe9dfb",
"name": "LLM Action Generator",
"type": "@n8n/n8n-nodes-langchain.lmChatGroq",
"position": [
2272,
784
],
"parameters": {
"model": "llama-3.3-70b-versatile",
"options": {
"temperature": 0.4
}
},
"typeVersion": 1
},
{
"id": "a7e7f3bb-49f5-4b7c-98c0-17bef599824c",
"name": "Generate Mitigation Actions",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2192,
560
],
"parameters": {
"text": "=You are a senior procurement manager. A supplier has been flagged as HIGH RISK. Generate specific, actionable mitigation recommendations.\n\n--- HIGH-RISK SUPPLIER DETAILS ---\nSupplier Name : {{ $('Compute Risk Metrics').item.json.supplier }}\nCategory : {{ $('Compute Risk Metrics').item.json.category }}\nRegion : {{ $('Compute Risk Metrics').item.json.region }}\nFulfillment Rate : {{ $('Compute Risk Metrics').item.json.fulfillmentPct }}%\nAvg Delay (days) : {{ $('Compute Risk Metrics').item.json.delay }}\nRisk Score : {{ $('Compute Risk Metrics').item.json.riskScore }}/ 100\nRisk Reason : {{ $('Validate & Merge Risk Output').item.json.reason }}\nAI Confidence : {{ $('Validate & Merge Risk Output').item.json.confidence }}\n\n--- TASK ---\nProvide exactly 3 numbered, specific procurement actions to immediately mitigate this supplier's risk. Each action should be:\n- Concrete and actionable (not generic advice)\n- Relevant to the specific failure metrics shown above\n- Achievable within 2 weeks\n\nRespond in plain text only. Number each recommendation (1. 2. 3.).",
"options": {
"systemMessage": "You are a senior procurement risk manager with 15 years of experience in supply chain resilience. Give direct, specific, actionable advice."
},
"promptType": "define"
},
"typeVersion": 3.1
},
{
"id": "07d1ef5d-a515-457c-bae6-0327af641f48",
"name": "Format Action Recommendations",
"type": "n8n-nodes-base.code",
"position": [
2544,
672
],
"parameters": {
"jsCode": "// Format AI suggestions into a clean field\nconst raw = (items[0].json.output || '').trim();\nreturn [{\n json: {\n suggestions: raw || 'No suggestions generated.'\n }\n}];"
},
"typeVersion": 2
},
{
"id": "9a8b4d32-9a20-4cdb-8c3e-25a5a4cc6743",
"name": "Get Backup Supplier Options",
"type": "n8n-nodes-base.httpRequest",
"position": [
2256,
368
],
"parameters": {
"url": "https://mocki.io/v1/f2d52749-15ab-4db3-a896-026fde3b52a7",
"options": {}
},
"typeVersion": 4.4
},
{
"id": "99445e58-e504-4e5f-a582-da6be4c7f9f2",
"name": "ormat Backup Supplier List",
"type": "n8n-nodes-base.code",
"position": [
2544,
368
],
"parameters": {
"jsCode": "// Normalize backup supplier list into a readable string\nconst backupList = items.map((item, idx) => {\n const s = item.json;\n const name = s.supplier || s.name || `Supplier ${idx+1}`;\n const score = s.reliability_score ? ` (Score: ${s.reliability_score})` : '';\n const region = s.region ? ` [${s.region}]` : '';\n return `${idx+1}. ${name}${region}${score}`;\n});\n\nreturn [{\n json: {\n backups: backupList.join('\\n') || 'No backup suppliers found.'\n }\n}];"
},
"typeVersion": 2
},
{
"id": "641633b3-7f3e-4541-8c57-87c4679fc66f",
"name": "Combine Actions & Backup Data",
"type": "n8n-nodes-base.merge",
"position": [
2768,
528
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3.2
},
{
"id": "450e9b78-5938-43f8-bfbd-73db48971e42",
"name": "Prepare Alert Payload",
"type": "n8n-nodes-base.code",
"position": [
2992,
528
],
"parameters": {
"jsCode": "const data = items[0].json;\n\nconst backups = data.backups || 'N/A';\nconst suggestions = data.suggestions || 'N/A';\n\nconst sup = data; // already merged data\n\nreturn [{\n json: {\n supplier: sup.supplier,\n risk: sup.risk,\n reason: sup.reason,\n backups,\n suggestions\n }\n}];"
},
"typeVersion": 2
},
{
"id": "822e41c4-f1e8-4d62-b7ac-924d6fc43ba4",
"name": "Send Email Notification",
"type": "n8n-nodes-base.gmail",
"position": [
3216,
528
],
"parameters": {
"message": "={{ $json.suggestions.replace(/\\n/g, '<br>') }}",
"options": {
"appendAttribution": false
},
"subject": "=Supplier Risk Alert \u2014 {{ $('Compute Risk Metrics').item.json.supplier }} is HIGH RISK (Score: {{ $('Compute Risk Metrics').item.json.riskScore }}/100)"
},
"typeVersion": 2.2
},
{
"id": "9f546b2f-e336-4dd9-98e8-8bb668eaa973",
"name": "Send Slack Notification",
"type": "n8n-nodes-base.slack",
"position": [
3440,
528
],
"parameters": {
"text": "={{ $('Prepare Alert Payload').item.json.suggestions }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C0AP6S28KM3",
"cachedResultName": "all-aishvarya"
},
"otherOptions": {
"unfurl_links": false
},
"authentication": "oAuth2"
},
"typeVersion": 2.4
},
{
"id": "55ffe81f-c689-4b47-9a94-cc7d85b42e7c",
"name": "Log High Risk Event",
"type": "n8n-nodes-base.googleSheets",
"position": [
3664,
528
],
"parameters": {
"columns": {
"value": {
"Risk": "={{ $('Validate & Merge Risk Output').item.json.risk }}",
"Supplier": "={{ $('Compute Risk Metrics').item.json.supplier }}",
"Timestamp": "={{ $('Daily Trigger').item.json.timestamp }}",
"Action Taken": "Email + Slack alert sent"
},
"schema": [
{
"id": "Supplier",
"type": "string",
"display": true,
"required": false,
"displayName": "Supplier",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Risk",
"type": "string",
"display": true,
"required": false,
"displayName": "Risk",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Action Taken",
"type": "string",
"display": true,
"required": false,
"displayName": "Action Taken",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Timestamp",
"type": "string",
"display": true,
"required": false,
"displayName": "Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Ho0JTCmBkGUYzPK4bsypauRt9iJv941hu9TxcPhx7Ek/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Ho0JTCmBkGUYzPK4bsypauRt9iJv941hu9TxcPhx7Ek",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Ho0JTCmBkGUYzPK4bsypauRt9iJv941hu9TxcPhx7Ek/edit?usp=drivesdk",
"cachedResultName": "Log Event"
}
},
"typeVersion": 4.7
},
{
"id": "5c59a2b0-254b-4d24-8df0-8624fd4066f6",
"name": "Prepare Non-Critical Log",
"type": "n8n-nodes-base.code",
"position": [
2256,
960
],
"parameters": {
"jsCode": "// Log Medium / Low risk supplier \u2014 no alert sent, just audit trail\nconst d = items[0].json;\nconst now = new Date().toISOString().replace('T',' ').split('.')[0] + ' UTC';\nreturn [{\n json: {\n supplier : d.supplier,\n risk : d.risk,\n riskScore : d.riskScore,\n fulfillmentPct: d.fulfillmentPct,\n delay : d.delay,\n reason : d.reason,\n assessedAt : now,\n actionTaken : `No alert \u2014 Risk level: ${d.risk}`\n }\n}];"
},
"typeVersion": 2
},
{
"id": "273fb0cc-666b-45af-9cdf-bdc0b3ed565e",
"name": "Log Low/Medium Event",
"type": "n8n-nodes-base.googleSheets",
"position": [
2544,
960
],
"parameters": {
"columns": {
"value": {
"Risk": "={{ $json.risk }}",
"Supplier": "={{ $('Compute Risk Metrics').item.json.supplier }}",
"Timestamp": "={{ $json.assessedAt }}",
"Action Taken": "={{ $json.actionTaken }}"
},
"schema": [
{
"id": "Supplier",
"type": "string",
"display": true,
"required": false,
"displayName": "Supplier",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Risk",
"type": "string",
"display": true,
"required": false,
"displayName": "Risk",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Action Taken",
"type": "string",
"display": true,
"required": false,
"displayName": "Action Taken",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Timestamp",
"type": "string",
"display": true,
"required": false,
"displayName": "Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Ho0JTCmBkGUYzPK4bsypauRt9iJv941hu9TxcPhx7Ek/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Ho0JTCmBkGUYzPK4bsypauRt9iJv941hu9TxcPhx7Ek",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Ho0JTCmBkGUYzPK4bsypauRt9iJv941hu9TxcPhx7Ek/edit?usp=drivesdk",
"cachedResultName": "Log Event"
}
},
"typeVersion": 4.7
},
{
"id": "719fc7af-adda-4379-95b6-320b71400b41",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-16,
-80
],
"parameters": {
"width": 912,
"height": 528,
"content": "## Supplier Capacity Risk Alert Workflow\n\n## How it works:\nThis workflow runs automatically at a scheduled time and continuously monitors supplier performance. It fetches real-time supplier data such as total orders, delivered quantity, and delay metrics. Using predefined thresholds, it calculates key metrics like fulfillment rate and overall risk score. AI is then used to refine the risk classification (Low, Medium, High) and provide a reason with confidence. If a supplier is identified as high risk, the workflow generates actionable mitigation steps and also suggests backup suppliers to reduce dependency. These results are then combined and sent as alerts via Email and Slack to the procurement team. Finally, all outcomes\u2014whether high, medium, or low risk\u2014are logged into Google Sheets to maintain a complete audit trail and support future decision-making.\n## Setup steps:\nConfigure threshold values (risk score, fulfillment rate, delay) in the Initialize Risk Config node.\nReplace mock API URLs with your actual supplier data source or ERP system.\nConnect Groq/OpenAI credentials for AI-based risk classification and action generation.\nSet up Gmail node with proper authentication to send email alerts.\nConfigure Slack node by selecting the correct workspace and channel.\nConnect Google Sheets and map columns for logging supplier risk data.\nVerify schedule trigger timing and timezone as per business requirement.\nTest the workflow with sample data to ensure all nodes work correctly before deployment."
},
"typeVersion": 1
},
{
"id": "6f41d116-9484-4458-ac42-1df1cea45860",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
240,
512
],
"parameters": {
"color": 7,
"width": 832,
"height": 400,
"content": "## Data Preparation\nFetches supplier data, applies thresholds, validates input, and converts it into structured format for risk analysis."
},
"typeVersion": 1
},
{
"id": "8997cac8-6394-4bae-a27f-25880d7f5712",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1120,
448
],
"parameters": {
"color": 7,
"width": 768,
"height": 576,
"content": "## Risk Calculation & AI Classification\nCalculates fulfillment rate, delay, and overall risk score based on defined thresholds. AI then refines the risk level and provides a clear classification with reason. If AI fails, the system safely falls back to rule-based results."
},
"typeVersion": 1
},
{
"id": "3ea3c72a-2b6e-448e-bdf1-ba4a327498db",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1952,
192
],
"parameters": {
"color": 7,
"width": 960,
"height": 928,
"content": "## High Risk Processing\nTriggers only for high-risk suppliers. Generates mitigation actions and fetches backup suppliers, then combines results. It focuses on immediate risk reduction by suggesting practical steps like adjusting order allocation, expediting deliveries, or temporarily shifting to alternative vendors. The system ensures that recommendations are specific to the supplier\u2019s performance issues, making them actionable within a short time frame. This stage helps decision-makers quickly respond to risks instead of just identifying them."
},
"typeVersion": 1
},
{
"id": "2a3abf30-42a5-43eb-b5d3-e6f2a961daa4",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
2960,
208
],
"parameters": {
"color": 7,
"width": 864,
"height": 720,
"content": "## Alerts & Logging\nSends notifications for high-risk suppliers through email and Slack with all key details and recommendations. All results, including high, medium, and low risk, are stored in Google Sheets for tracking. This helps maintain a complete history of supplier performance. It also ensures better monitoring and future decision-making."
},
"typeVersion": 1
},
{
"id": "30de7838-ff94-4924-806d-e1d613166e41",
"name": "Daily Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
48,
672
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 9
}
]
}
},
"typeVersion": 1.3
},
{
"id": "06e72124-4933-4f41-8c62-0e4a4249e85e",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-48,
544
],
"parameters": {
"color": 7,
"height": 352,
"content": "## Schedule Trigger\nRuns workflow automatically at scheduled time"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "557ed711-d357-4bc7-a610-09277cc7cd0c",
"connections": {
"Daily Trigger": {
"main": [
[
{
"node": "Initialize Risk Config",
"type": "main",
"index": 0
}
]
]
},
"LLM Risk Engine": {
"ai_languageModel": [
[
{
"node": "Classify Supplier Risk (AI)",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Check Valid Orders": {
"main": [
[
{
"node": "Normalize Supplier Data",
"type": "main",
"index": 0
}
]
]
},
"Compute Risk Metrics": {
"main": [
[
{
"node": "Classify Supplier Risk (AI)",
"type": "main",
"index": 0
}
]
]
},
"LLM Action Generator": {
"ai_languageModel": [
[
{
"node": "Generate Mitigation Actions",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Prepare Alert Payload": {
"main": [
[
{
"node": "Send Email Notification",
"type": "main",
"index": 0
}
]
]
},
"Initialize Risk Config": {
"main": [
[
{
"node": "Get Supplier Performance Data",
"type": "main",
"index": 0
}
]
]
},
"Normalize Supplier Data": {
"main": [
[
{
"node": "Compute Risk Metrics",
"type": "main",
"index": 0
}
]
]
},
"Send Email Notification": {
"main": [
[
{
"node": "Send Slack Notification",
"type": "main",
"index": 0
}
]
]
},
"Send Slack Notification": {
"main": [
[
{
"node": "Log High Risk Event",
"type": "main",
"index": 0
}
]
]
},
"Prepare Non-Critical Log": {
"main": [
[
{
"node": "Log Low/Medium Event",
"type": "main",
"index": 0
}
]
]
},
"Check High Risk Condition": {
"main": [
[
{
"node": "Generate Mitigation Actions",
"type": "main",
"index": 0
},
{
"node": "Get Backup Supplier Options",
"type": "main",
"index": 0
}
],
[
{
"node": "Prepare Non-Critical Log",
"type": "main",
"index": 0
}
]
]
},
"ormat Backup Supplier List": {
"main": [
[
{
"node": "Combine Actions & Backup Data",
"type": "main",
"index": 0
}
]
]
},
"Classify Supplier Risk (AI)": {
"main": [
[
{
"node": "Validate & Merge Risk Output",
"type": "main",
"index": 0
}
]
]
},
"Generate Mitigation Actions": {
"main": [
[
{
"node": "Format Action Recommendations",
"type": "main",
"index": 0
}
]
]
},
"Get Backup Supplier Options": {
"main": [
[
{
"node": "ormat Backup Supplier List",
"type": "main",
"index": 0
}
]
]
},
"Validate & Merge Risk Output": {
"main": [
[
{
"node": "Check High Risk Condition",
"type": "main",
"index": 0
}
]
]
},
"Combine Actions & Backup Data": {
"main": [
[
{
"node": "Prepare Alert Payload",
"type": "main",
"index": 0
}
]
]
},
"Format Action Recommendations": {
"main": [
[
{
"node": "Combine Actions & Backup Data",
"type": "main",
"index": 1
}
]
]
},
"Get Supplier Performance Data": {
"main": [
[
{
"node": "Check Valid Orders",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Supplier Capacity Risk Alert Workflow. Uses httpRequest, lmChatGroq, agent, gmail. Scheduled trigger; 28 nodes.
Source: https://github.com/weblineindia/n8n-Triage-supplier-capacity-risk-with-Groq-Gmail-Slack-and-Google-Sheets/blob/main/workflow-template.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Created by: Peyton Leveillee Last updated: October 2025
This workflow automates invoicing and payment follow-ups using Google Sheets, PDFShift, Groq (LLM), Gmail, and Telegram, sending initial invoices with PDF attachments, scheduling overdue reminders at
Categories Content Creation AI Automation Publishing Social Media
This workflow automates end-to-end ESG (Environmental, Social, and Governance) sustainability reporting for enterprise sustainability teams, compliance officers, and green governance leads. It solves
Automates sales data analysis and strategic insight generation for sales managers and strategists needing actionable intelligence. Fetches multi-source data from sales, marketing, and financial system