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 →
{
"name": "ProEx-ENG",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks"
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
-656,
144
],
"id": "c8872076-a6d2-45cb-9a30-955e6d79684a",
"name": "Schedule Trigger"
},
{
"parameters": {
"operation": "executeQuery",
"query": "WITH s7 AS (\n SELECT product_id, SUM(quantity) AS sales_last_7_days\n FROM sales\n WHERE sale_date >= CURDATE() - INTERVAL 7 DAY\n GROUP BY product_id\n)\nSELECT\n p.id AS product_id,\n p.name,\n p.stock,\n COALESCE(s7.sales_last_7_days, 0) AS sales_last_7_days\nFROM products p\nLEFT JOIN s7 ON s7.product_id = p.id\nORDER BY p.id;\n",
"options": {}
},
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [
-368,
-208
],
"id": "28a5dc77-5055-4c50-962e-62b60bdc5dea",
"name": "Execute a SQL query",
"credentials": {
"mySql": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"sendTo": "650112418050@bru.ac.th",
"subject": "\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e04\u0e32\u0e14\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e04\u0e07\u0e04\u0e25\u0e31\u0e07",
"message": "=\u0e2a\u0e27\u0e31\u0e2a\u0e14\u0e35\u0e04\u0e23\u0e31\u0e1a,<br><br>\n\n\u0e23\u0e30\u0e1a\u0e1a\u0e15\u0e34\u0e14\u0e15\u0e32\u0e21\u0e41\u0e25\u0e30\u0e04\u0e32\u0e14\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e04\u0e07\u0e04\u0e25\u0e31\u0e07\u0e44\u0e14\u0e49\u0e17\u0e33\u0e01\u0e32\u0e23\u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e1b\u0e23\u0e30\u0e08\u0e33\u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c\u0e40\u0e23\u0e35\u0e22\u0e1a\u0e23\u0e49\u0e2d\u0e22\u0e41\u0e25\u0e49\u0e27<br>\n\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e19\u0e35\u0e49\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a\u0e14\u0e49\u0e27\u0e22:<br>\n- \u0e2a\u0e23\u0e38\u0e1b\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e2a\u0e15\u0e47\u0e2d\u0e01\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19<br>\n- \u0e04\u0e32\u0e14\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e17\u0e35\u0e48\u0e21\u0e35\u0e41\u0e19\u0e27\u0e42\u0e19\u0e49\u0e21\u0e08\u0e30\u0e2b\u0e21\u0e14\u0e43\u0e19\u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c\u0e2b\u0e19\u0e49\u0e32<br>\n- \u0e04\u0e33\u0e41\u0e19\u0e30\u0e19\u0e33\u0e01\u0e32\u0e23\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21<br>\n- \u0e01\u0e23\u0e32\u0e1f\u0e41\u0e19\u0e27\u0e42\u0e19\u0e49\u0e21\u0e01\u0e32\u0e23\u0e02\u0e32\u0e22\u0e22\u0e49\u0e2d\u0e19\u0e2b\u0e25\u0e31\u0e07<br><br>\n\n\ud83d\udcca <a href=\"https://drive.google.com/file/d/1TtrU_hiKbFVcbLRcDcOZ7D-qxgcs9Wm8/view?usp=drivesdk\">\u0e04\u0e25\u0e34\u0e01\u0e17\u0e35\u0e48\u0e19\u0e35\u0e48\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e1b\u0e34\u0e14\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19</a>\n\n\u0e2b\u0e32\u0e01\u0e21\u0e35\u0e02\u0e49\u0e2d\u0e2a\u0e07\u0e2a\u0e31\u0e22\u0e2b\u0e23\u0e37\u0e2d\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21 \u0e01\u0e23\u0e38\u0e13\u0e32\u0e15\u0e34\u0e14\u0e15\u0e48\u0e2d\u0e1d\u0e48\u0e32\u0e22\u0e04\u0e25\u0e31\u0e07\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e44\u0e14\u0e49\u0e42\u0e14\u0e22\u0e15\u0e23\u0e07<br><br>\n\n\u0e02\u0e2d\u0e1a\u0e04\u0e38\u0e13\u0e04\u0e23\u0e31\u0e1a,<br>\n\u0e23\u0e30\u0e1a\u0e1a\u0e15\u0e34\u0e14\u0e15\u0e32\u0e21\u0e41\u0e25\u0e30\u0e04\u0e32\u0e14\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e04\u0e07\u0e04\u0e25\u0e31\u0e07\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34",
"options": {}
},
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
672,
80
],
"id": "f7a3e639-b94b-48a4-8abf-4c10b741c303",
"name": "Send a message",
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "download",
"fileId": {
"__rl": true,
"value": "1jkOJ35WJ4nRfTfT5Av-WbiwD1i1HR50X2-FUP1leoHs",
"mode": "id"
},
"options": {
"googleFileConversion": {
"conversion": {
"sheetsToFormat": "application/pdf"
}
}
}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
480,
16
],
"id": "d1dc2878-ab42-42dd-bc37-22763a4cff3a",
"name": "Download file",
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"__rl": true,
"value": "1jkOJ35WJ4nRfTfT5Av-WbiwD1i1HR50X2-FUP1leoHs",
"mode": "list",
"cachedResultName": "n8n",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1jkOJ35WJ4nRfTfT5Av-WbiwD1i1HR50X2-FUP1leoHs/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "sheet1",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1jkOJ35WJ4nRfTfT5Av-WbiwD1i1HR50X2-FUP1leoHs/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"product_id": "={{$json[\"product_id\"]}}",
"name": "={{$json[\"name\"]}}",
"stock": "={{$json[\"stock\"]}}",
"sales_last_7_days": "={{$json[\"sales_last_7_days\"]}}",
"forecast_sales_next_7": "={{$json[\"forecast_sales_next_7\"]}}",
"stock_after_7": "={{$json[\"stock_after_7\"]}}",
"explanation": "={{ $json.explanation }}",
"recommendation_detail": "={{ $json.recommendation_detail }}",
"recommendation": "={{ $json.recommendation }}",
"out_of_stock": "={{ $json.out_of_stock }}"
},
"matchingColumns": [
"product_id"
],
"schema": [
{
"id": "product_id",
"displayName": "product_id",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "name",
"displayName": "name",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "stock",
"displayName": "stock",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "sales_last_7_days",
"displayName": "sales_last_7_days",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "forecast_sales_next_7",
"displayName": "forecast_sales_next_7",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "stock_after_7",
"displayName": "stock_after_7",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "out_of_stock",
"displayName": "out_of_stock",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "recommendation",
"displayName": "recommendation",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "recommendation_detail",
"displayName": "recommendation_detail",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "explanation",
"displayName": "explanation",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
-16,
0
],
"id": "2c4b5aba-c3be-4a5e-b047-2795c6990bb1",
"name": "Append or update row in sheet",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {},
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
-672,
-208
],
"id": "d330f7f2-5b8a-4108-b26c-90a4060170f7",
"name": "When clicking \u2018Execute workflow\u2019"
},
{
"parameters": {
"jsCode": "// \u0e1a\u0e31\u0e07\u0e04\u0e31\u0e1a\u0e43\u0e2b\u0e49\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e41\u0e04\u0e48 1 item \u0e01\u0e48\u0e2d\u0e19\u0e2a\u0e48\u0e07\u0e15\u0e48\u0e2d\nreturn [items[0]];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
320,
16
],
"id": "075515c5-21d0-41cb-9725-354dd3793a82",
"name": "Code1"
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"__rl": true,
"value": "1jkOJ35WJ4nRfTfT5Av-WbiwD1i1HR50X2-FUP1leoHs",
"mode": "list",
"cachedResultName": "n8n",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1jkOJ35WJ4nRfTfT5Av-WbiwD1i1HR50X2-FUP1leoHs/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 174413567,
"mode": "list",
"cachedResultName": "trend",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1jkOJ35WJ4nRfTfT5Av-WbiwD1i1HR50X2-FUP1leoHs/edit#gid=174413567"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"date": "={{$json[\"date\"]}}",
"product_id": "={{$json[\"product_id\"]}}",
"name": "={{$json[\"name\"]}}",
"qty": "={{$json[\"qty\"]}}",
"key": "={{$json[\"date\"]}}_{{$json[\"product_id\"]}}"
},
"matchingColumns": [
"key"
],
"schema": [
{
"id": "date",
"displayName": "date",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "product_id",
"displayName": "product_id",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "name",
"displayName": "name",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "qty",
"displayName": "qty",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "key",
"displayName": "key",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
-160,
144
],
"id": "91dea67d-8253-449d-8137-e6ae4683194f",
"name": "Append time series to 'trend'",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "executeQuery",
"query": "SELECT\n p.id AS product_id,\n p.name,\n DATE(s.sale_date) AS date,\n SUM(s.quantity) AS qty\nFROM products p\nJOIN sales s ON s.product_id = p.id\nWHERE s.sale_date >= CURDATE() - INTERVAL 30 DAY\nGROUP BY p.id, p.name, DATE(s.sale_date)\nORDER BY p.id, DATE(s.sale_date);",
"options": {}
},
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [
-368,
144
],
"id": "7cb3b516-ae76-446d-8f68-b34a408819b8",
"name": "Sales time series 30d",
"credentials": {
"mySql": {
"name": "<your credential>"
}
}
},
{
"parameters": {},
"type": "n8n-nodes-base.merge",
"typeVersion": 3.2,
"position": [
160,
128
],
"id": "46506b66-a662-4c35-a363-10e32887a575",
"name": "Merge"
},
{
"parameters": {
"operation": "update",
"fileId": {
"__rl": true,
"value": "1TtrU_hiKbFVcbLRcDcOZ7D-qxgcs9Wm8",
"mode": "list",
"cachedResultName": "Report",
"cachedResultUrl": "https://drive.google.com/file/d/1TtrU_hiKbFVcbLRcDcOZ7D-qxgcs9Wm8/view?usp=drivesdk"
},
"changeFileContent": true,
"options": {}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
672,
-112
],
"id": "3244a5ec-5c20-4c12-a5d1-1a68a76e2231",
"name": "Update file",
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "function toObj(raw) {\n if (raw == null) throw new Error(\"LLM output is null/undefined\");\n let s = raw;\n\n if (typeof s === \"object\") return s;\n s = String(s).trim();\n\n // \u0e25\u0e1a code fences\n s = s.replace(/^```json/i, \"\")\n .replace(/^```/, \"\")\n .replace(/```$/, \"\")\n .trim();\n\n // \u0e25\u0e1a\u0e04\u0e2d\u0e21\u0e40\u0e21\u0e19\u0e15\u0e4c\u0e41\u0e1a\u0e1a JS // \u0e2b\u0e23\u0e37\u0e2d /* */\n s = s.replace(/\\/\\/.*$/gm, \"\").replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\");\n\n // \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19 single quotes \u2192 double quotes \u0e23\u0e2d\u0e1a key \u0e41\u0e25\u0e30\u0e04\u0e48\u0e32\n // key: 'value' \u2192 \"key\": \"value\"\n s = s.replace(/'([^']*)'\\s*:/g, '\"$1\":'); // keys\n s = s.replace(/:\\s*'([^']*)'/g, ':\"$1\"'); // values\n\n // \u0e25\u0e1a \\n, \\r\n s = s.replace(/\\r?\\n+/g, \" \");\n\n // \u0e41\u0e01\u0e49 ,} \u0e2b\u0e23\u0e37\u0e2d ,]\n s = s.replace(/,(\\s*[}\\]])/g, \"$1\");\n\n // \u0e2b\u0e32 block JSON\n const m = s.match(/\\{[\\s\\S]*\\}/);\n if (!m) throw new Error(\"Unable to find JSON object in LLM output: \" + s);\n\n try {\n return JSON.parse(m[0]);\n } catch (e) {\n console.error(\"\u274c Still invalid JSON after cleanup:\", s);\n throw e;\n }\n}\n\nreturn items.map(it => {\n const raw = it.json?.output ?? it.json?.text ?? it.json;\n const o = toObj(raw);\n\n const out = {\n product_id: Number(o.product_id),\n name: String(o.name ?? ''),\n stock: Number(o.stock),\n sales_last_7_days: Number(o.sales_last_7_days),\n forecast_sales_next_7: Number(o.forecast_sales_next_7),\n stock_after_7: Number(o.stock_after_7),\n out_of_stock: String(o.out_of_stock ?? ''),\n recommendation: String(o.recommendation ?? ''),\n recommendation_detail: String(o.recommendation_detail ?? ''),\n explanation: String(o.explanation ?? '')\n };\n\n return { json: out };\n \n});\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
240,
-208
],
"id": "2b522241-feb5-413a-8ede-c42b053ef9e7",
"name": "Code"
},
{
"parameters": {
"model": "openai/gpt-4o-mini",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"typeVersion": 1,
"position": [
-256,
-16
],
"id": "038bf1db-bd42-4ee6-8888-2e690158f9ba",
"name": "OpenRouter Chat Model",
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"promptType": "define",
"text": "=You are an inventory forecasting assistant.\n\nGiven ONE product row in valid JSON here:\n{{ JSON.stringify($json) }}\n\nRules:\n1) daily_avg_sales = sales_last_7_days / 7\n2) forecast_sales_next_7 = round(daily_avg_sales * 7)\n3) stock_after_7 = stock - forecast_sales_next_7\n4) out_of_stock = (stock_after_7 <= 0)\n5) recommendations:\n - TH = \"\u0e04\u0e27\u0e23\u0e2a\u0e31\u0e48\u0e07\u0e40\u0e1e\u0e34\u0e48\u0e21\" if out_of_stock else \"\u0e44\u0e21\u0e48\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\"\n6) lead_time_days = 5\n7) safety_stock = round(daily_avg_sales * lead_time_days * 0.7)\n8) order_up_to_level = round((daily_avg_sales * lead_time_days) + safety_stock + (daily_avg_sales * 7))\n9) reorder_qty = max(0, order_up_to_level - stock)\n10) recommendation_detail:\n - TH = if reorder_qty > 0 \u2192 \"\u0e04\u0e27\u0e23\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e08\u0e33\u0e19\u0e27\u0e19 {reorder_qty} \u0e0a\u0e34\u0e49\u0e19\" else \"\u0e44\u0e21\u0e48\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\"\n11) explanation:\n - TH = \u0e43\u0e2b\u0e49\u0e40\u0e2b\u0e15\u0e38\u0e1c\u0e25\u0e2a\u0e31\u0e49\u0e19 \u0e46 \u0e27\u0e48\u0e32\u0e17\u0e33\u0e44\u0e21\u0e16\u0e36\u0e07 \"\u0e04\u0e27\u0e23\u0e2a\u0e31\u0e48\u0e07\u0e40\u0e1e\u0e34\u0e48\u0e21\" \u0e2b\u0e23\u0e37\u0e2d \"\u0e44\u0e21\u0e48\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\"\n\nReturn ONLY RAW JSON (no code block/backticks, no explanation).\nThe JSON MUST contain EXACTLY these keys and types:\n\n{\n \"product_id\": <number>,\n \"name\": <string>,\n \"stock\": <number>,\n \"sales_last_7_days\": <number>,\n \"forecast_sales_next_7\": <number>,\n \"stock_after_7\": <number>,\n \"out_of_stock\": \"\u0e2b\u0e21\u0e14\u0e2a\u0e15\u0e47\u0e2d\u0e01\" | \"\u0e08\u0e30\u0e2b\u0e21\u0e14\u0e2a\u0e15\u0e47\u0e2d\u0e01\" | \"\u0e21\u0e35\u0e2a\u0e15\u0e47\u0e2d\u0e01\",\n \"recommendation\": \"\u0e04\u0e27\u0e23\u0e2a\u0e31\u0e48\u0e07\u0e40\u0e1e\u0e34\u0e48\u0e21\" | \"\u0e44\u0e21\u0e48\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\",\n \"lead_time_days\": <number>,\n \"safety_stock\": <number>,\n \"order_up_to_level\": <number>,\n \"reorder_qty\": <number>,\n \"recommendation_detail\": <string>,\n \"explanation\": <string>\n}\n",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 2.2,
"position": [
-112,
-208
],
"id": "00293f65-6b6a-4c2f-8b9c-e0818bcd4948",
"name": "AI Agent"
}
],
"connections": {
"Schedule Trigger": {
"main": [
[
{
"node": "Sales time series 30d",
"type": "main",
"index": 0
},
{
"node": "Execute a SQL query",
"type": "main",
"index": 0
}
]
]
},
"Execute a SQL query": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Download file": {
"main": [
[
{
"node": "Update file",
"type": "main",
"index": 0
},
{
"node": "Send a message",
"type": "main",
"index": 0
}
]
]
},
"Append or update row in sheet": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "Execute a SQL query",
"type": "main",
"index": 0
},
{
"node": "Sales time series 30d",
"type": "main",
"index": 0
}
]
]
},
"Code1": {
"main": [
[
{
"node": "Download file",
"type": "main",
"index": 0
}
]
]
},
"Append time series to 'trend'": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Sales time series 30d": {
"main": [
[
{
"node": "Append time series to 'trend'",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Code1",
"type": "main",
"index": 0
}
]
]
},
"Code": {
"main": [
[
{
"node": "Append or update row in sheet",
"type": "main",
"index": 0
}
]
]
},
"OpenRouter Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "5b7890e1-ce83-49f3-872c-8f9f56654017",
"meta": {
"templateCredsSetupCompleted": true
},
"id": "zr7X0afjZn8hLoHJ",
"tags": []
}
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.
gmailOAuth2googleDriveOAuth2ApigoogleSheetsOAuth2ApimySqlopenRouterApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
ProEx-ENG. Uses mySql, gmail, googleDrive, googleSheets. Scheduled trigger; 14 nodes.
Source: https://github.com/piyadanai32/4134901-68/blob/248261e97b56e8f7a86a8c55c068c7f2636ff491/lab6/Lab6-1.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.
Built this workflow because most of our users signed up, then vanished after ~30 days. It runs daily, grabs those stale users from Supabase, updates a Google Sheet for tracking, and automatically send
This n8n workflow automates the transformation of spreadsheet data into professional charts and graphs using AI-driven analysis. Triggered via Slack, it processes uploaded files (Excel, CSV, Google Sh
• Multi-Layer Message Analysis - Every customer interaction passes through three specialized AI classifiers: privacy detection (identifies sensitive data and security requirements), intent recognition
Handles GDPR Article 15 (access) and Article 17 (erasure) requests end-to-end — from inbound email to legally-compliant response — with zero manual intervention and a full audit trail. 📬 Monitors Gmai
This workflow is designed for Customer Success Managers, Growth Teams, and SaaS Business Owners who want to proactively reduce churn using AI. It automates the analysis of customer health and the deli