This workflow corresponds to n8n.io template #9681 — we link there as the canonical source.
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": "PHb3oHRnnw1xVTSH",
"name": "EOD Packaging for Automations",
"tags": [],
"nodes": [
{
"id": "4c11828d-d755-4fb1-9a8e-c3083ea21f0c",
"name": " Convert Report to Text File Format",
"type": "n8n-nodes-base.convertToFile",
"position": [
1248,
-48
],
"parameters": {
"options": {},
"operation": "toText",
"sourceProperty": "=text"
},
"typeVersion": 1.1
},
{
"id": "9672ab4c-bae2-4b38-8781-9aa1d4a77b9e",
"name": "Generate Human-Readable Report",
"type": "n8n-nodes-base.code",
"position": [
944,
-48
],
"parameters": {
"jsCode": "// Get the input data\nconst data = $input.all()[0].json.output;\n\n// Create a formatted text report\nconst report = `\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n WORKFLOW ANALYSIS REPORT\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nWORKFLOW DETAILS\n----------------\nName: ${data.workflow_name}\nID: ${data.workflow_id}\n\nCHECKPOINT RESULTS\n------------------\n${data.results.map((result, index) => `\n${index + 1}. ${result.checkpoint}\n Status: ${result.status}\n Reason: ${result.reason}\n`).join('\\n')}\n\nOVERALL ASSESSMENT\n------------------\nStatus: ${data.overall_assessment}\n\nSUMMARY\n-------\n${data.summary}\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nReport Generated: ${new Date().toISOString()}\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n`;\n\n// Return the formatted text\nreturn [{\n json: {\n text: report.trim(),\n workflow_name: data.workflow_name,\n workflow_id: data.workflow_id,\n overall_assessment: data.overall_assessment\n }\n}];"
},
"typeVersion": 2
},
{
"id": "728c4b8d-e544-46a5-bc27-055c036abca8",
"name": "Conversation Context Buffer",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
688,
768
],
"parameters": {
"sessionKey": "\"json_review\"",
"sessionIdType": "customKey",
"contextWindowLength": 7
},
"typeVersion": 1.3
},
{
"id": "5ec687d2-3e50-4397-9894-24a67f27c241",
"name": "GPT-4o Language Model Configuration",
"type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
"position": [
496,
192
],
"parameters": {
"model": "gpt-4o",
"options": {}
},
"credentials": {
"azureOpenAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "2a410088-67f1-4869-acb0-002e41c877b5",
"name": " Format AI Response to JSON Schema",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
992,
624
],
"parameters": {
"jsonSchemaExample": "{\n \"workflow_name\": \" \",\n \"workflow_id\": \" \",\n \"results\": [\n {\n \"checkpoint\": \" \",\n \"status\": \" \",\n \"reason\": \" \"\n }\n ],\n \"overall_assessment\": \" \",\n \"summary\": \" \"\n}\n"
},
"typeVersion": 1.3
},
{
"id": "0811782e-aecb-4575-ad65-94cb8f83c486",
"name": "AI-Powered Workflow Quality Analyzer",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
512,
-48
],
"parameters": {
"text": "=\n{{ JSON.stringify($json) }} \n\nEvaluate this JSON workflow for validity, completeness, and compliance with n8n template publishing guidelines. \n\n",
"options": {
"systemMessage": "=You are an expert n8n template validator. \nYour job is to **analyze the provided workflow JSON** against the official n8n Template Publishing Guidelines. \nBe precise, context-aware, and avoid repeating generic text across different workflows. \nEach evaluation must be based on the actual JSON input.\n\n### Evaluation Criteria\nCheck the workflow against these rules:\n\n1. **JSON Validity**\n - Pass if JSON is well-formed, importable, and contains nodes, connections, and parameters.\n - Fail if malformed, missing required fields, or has syntax issues.\n\n2. **Sticky Notes & Documentation**\n - Pass if sticky notes exist with Markdown (## headings) and useful explanations.\n - Fail if sticky notes are completely missing or use raw HTML.\n - Neutral if notes exist but are minimal \u2014 suggest improvements.\n\n3. **Critical Instructions for Security Rule**\n- Credential IDs or names (e.g., {\"id\": \"...\", \"name\": \"...\"}) are **valid n8n references** and MUST NOT be flagged. \n- Only fail **Security & Credentials** if actual plain-text secrets are found, such as: \n - API keys starting with `sk_` (e.g., Stripe keys) \n - Raw `Bearer YOUR_TOKEN_HERE` tokens \n - Hardcoded passwords or tokens \n- Do not confuse credential references with raw secrets. \n\n4. **Node Naming**\n - Pass if functional nodes (Code, Google Sheets, Slack, etc.) have descriptive names.\n - Fail if left as defaults like `Code`, `HTTP Request`, or `Loop Over Items1`.\n\n5. **Workflow Validity**\n - Pass if all nodes are connected and the workflow is importable.\n - Fail if nodes are isolated or connections are broken.\n\n6. **Originality & Quality**\n - Pass if it solves a real use case and is not trivial or copied.\n - Fail if plagiarized or overly simplistic.\n\n7. **Industry-Readiness**\n - Pass if modular, expandable, and includes at least basic error handling (try/catch, fallback, retries).\n - Fail if completely fragile with no resilience.\n\n8. **Presentation**\n - Pass if layout is neat, nodes are arranged clearly, and sticky notes are formatted cleanly.\n - Fail if messy, cluttered, or contains irrelevant branding.\n\n---\n\n### Output Format\nRespond ONLY in **valid JSON**, following this structure:\n\n```json\n{\n \"workflow_name\": \"Name from JSON or 'Unknown'\",\n \"workflow_id\": \"ID or versionId\",\n \"results\": [\n {\n \"checkpoint\": \"JSON Validity\",\n \"status\": \"\u2705 or \u274c\",\n \"reason\": \"Explain briefly why it passed/failed, referencing specific JSON elements.\"\n },\n {\n \"checkpoint\": \"Sticky Notes & Documentation\",\n \"status\": \"\u2705 or \u274c\",\n \"reason\": \"...\"\n },\n {\n \"checkpoint\": \"Security & Credentials\",\n \"status\": \"\u2705 or \u274c\",\n \"reason\": \"...\"\n },\n {\n \"checkpoint\": \"Node Naming\",\n \"status\": \"\u2705 or \u274c\",\n \"reason\": \"...\"\n },\n {\n \"checkpoint\": \"Workflow Validity\",\n \"status\": \"\u2705 or \u274c\",\n \"reason\": \"...\"\n },\n {\n \"checkpoint\": \"Originality & Quality\",\n \"status\": \"\u2705 or \u274c\",\n \"reason\": \"...\"\n },\n {\n \"checkpoint\": \"Industry-Readiness\",\n \"status\": \"\u2705 or \u274c\",\n \"reason\": \"...\"\n },\n {\n \"checkpoint\": \"Presentation\",\n \"status\": \"\u2705 or \u274c\",\n \"reason\": \"...\"\n }\n ],\n \"overall_assessment\": \"PASSED or FAILED\",\n \"summary\": \"One or two sentences summarizing strengths and weaknesses.\"\n}\n"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.1
},
{
"id": "5dc81493-3d56-43c1-af60-78ac649be6af",
"name": "Parse JSON Workflow Structure",
"type": "n8n-nodes-base.extractFromFile",
"position": [
224,
-48
],
"parameters": {
"options": {},
"operation": "fromJson"
},
"typeVersion": 1
},
{
"id": "bf65a234-f54f-4d4a-a076-500e1bea2bc1",
"name": "Validate File Download Success",
"type": "n8n-nodes-base.if",
"position": [
-48,
-32
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "3a31cd82-1bf2-4ffb-ae01-fa0a6cc217ee",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.id }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "eec8e484-72f4-43ef-9283-489fb6b6fd02",
"name": "Download Workflow JSON File",
"type": "n8n-nodes-base.googleDrive",
"position": [
-304,
-48
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{$json[\"id\"]}}"
},
"options": {},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "f1bc060f-d9bf-4d52-81d8-5338789a2c82",
"name": "Process Files One by One",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-640,
-48
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "4f10d88a-addf-491b-bf2b-85289287a460",
"name": "Fetch Workflow Files from Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
-896,
-48
],
"parameters": {
"filter": {
"folderId": {
"__rl": true,
"mode": "list",
"value": "1HP3LnTPLwe81xUrp0P6aV2nJKdX6BIcM",
"cachedResultUrl": "https://drive.google.com/drive/folders/1HP3LnTPLwe81xUrp0P6aV2nJKdX6BIcM",
"cachedResultName": "n8n json checker"
}
},
"options": {},
"resource": "fileFolder",
"returnAll": true
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3,
"alwaysOutputData": true
},
{
"id": "60172ded-ddbe-4e3f-a2b5-c0ced80e0457",
"name": "When clicking \u2018Execute workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-1152,
-48
],
"parameters": {},
"typeVersion": 1
},
{
"id": "d89cae23-8df0-42f0-a5d7-95488a45c407",
"name": "Archive Validation Report to Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
1552,
-48
],
"parameters": {
"name": "=workflow_report_{{ $now.format('YYYY-MM-DD_HHmmss') }}.txt",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "16G1pZ3DwtgDz7byZpqpTWEaBCXK8lrrS",
"cachedResultUrl": "https://drive.google.com/drive/folders/16G1pZ3DwtgDz7byZpqpTWEaBCXK8lrrS",
"cachedResultName": "EOD Updates report "
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "faa863cd-7b04-4e33-85ef-3d6a87f24f1f",
"name": "Send Validation Summary to Slack",
"type": "n8n-nodes-base.slack",
"position": [
1920,
-272
],
"parameters": {
"text": "=:white_check_mark: *Workflow Analysis Report Generated*\n\n*Workflow Name:* {{ $(' Convert Report to Text File Format').first().json.workflow_name || 'N/A' }}\n*Assessment:* {{ $(' Convert Report to Text File Format').first().json.overall_assessment || 'PASSED' }} \u2705\n\n:file_folder: *Report Details*\n- File Name: `{{ $json.name }}`\n- File Size: {{ (parseInt($json.size) / 1024).toFixed(2) }} KB\n- Created: {{ new Date($json.createdTime).toLocaleString('en-US', { month: 'short', day: 'numeric', year: 'numeric', hour: '2-digit', minute: '2-digit' }) }}\n\n:link: *Access Report*\n- <{{ $json.webViewLink }}|View in Google Drive>\n- <{{ $json.webContentLink }}|Download Report>\n\n---\n_Automated workflow validation completed successfully_ :rocket:",
"user": {
"__rl": true,
"mode": "list",
"value": "U09HMPVD466",
"cachedResultName": "newscctv22"
},
"select": "user",
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.3
},
{
"id": "d780c603-d64e-4147-8dc8-048a56b85a8b",
"name": "Email Detailed Report to Stakeholders",
"type": "n8n-nodes-base.gmail",
"position": [
1936,
256
],
"parameters": {
"toList": [
"user@example.com"
],
"message": "EOD Update",
"subject": "=EOD Update",
"resource": "message",
"htmlMessage": "=<!DOCTYPE html>\n<html>\n<head>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif; line-height: 1.6; color: #333; background: #f5f5f5; margin: 0; padding: 0; }\n .email-wrapper { max-width: 600px; margin: 40px auto; background: white; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 6px rgba(0,0,0,0.1); }\n .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 40px 30px; text-align: center; }\n .content { padding: 40px 30px; }\n .info-box { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; padding: 20px; margin: 20px 0; }\n .info-row { padding: 10px 0; border-bottom: 1px solid #e2e8f0; }\n .info-row:last-child { border-bottom: none; }\n .label { font-weight: 600; color: #475569; margin-bottom: 4px; }\n .value { color: #1e293b; word-break: break-word; }\n .btn { display: inline-block; padding: 14px 28px; margin: 10px 8px; background: #667eea; color: white; text-decoration: none; border-radius: 6px; font-weight: 600; }\n .btn-secondary { background: #10b981; }\n .status-badge { display: inline-block; padding: 6px 16px; border-radius: 20px; font-size: 14px; font-weight: 600; }\n .status-passed { background: #d1fae5; color: #065f46; }\n .status-failed { background: #fee2e2; color: #991b1b; }\n .footer { text-align: center; padding: 20px; color: #64748b; font-size: 14px; background: #f8fafc; }\n </style>\n</head>\n<body>\n <div class=\"email-wrapper\">\n <div class=\"header\">\n <h1 style=\"margin: 0; font-size: 28px;\">\ud83d\udcca Workflow Report Generated</h1>\n <p style=\"margin: 10px 0 0 0; opacity: 0.9;\">{{ $now.format('MMMM DD, YYYY [at] HH:mm') }}</p>\n </div>\n \n <div class=\"content\">\n <p style=\"font-size: 16px;\">Hello,</p>\n \n <p>A new workflow report has been generated and saved to your Google Drive.</p>\n \n {{ $json.name ? '<div class=\"info-box\"><div class=\"info-row\"><div class=\"label\">\ud83d\udcc4 File Name</div><div class=\"value\">' + $json.name + '</div></div>' : '' }}\n \n {{ $json.size ? '<div class=\"info-row\"><div class=\"label\">\ud83d\udcbe File Size</div><div class=\"value\">' + (parseInt($json.size) / 1024).toFixed(2) + ' KB</div></div>' : '' }}\n \n {{ $json.mimeType ? '<div class=\"info-row\"><div class=\"label\">\ud83d\udcce File Type</div><div class=\"value\">' + $json.mimeType + '</div></div>' : '' }}\n \n {{ $json.createdTime ? '<div class=\"info-row\"><div class=\"label\">\ud83d\udd50 Created</div><div class=\"value\">' + new Date($json.createdTime).toLocaleString('en-US', { dateStyle: 'long', timeStyle: 'short' }) + '</div></div>' : '' }}\n \n {{ $json.owners && $json.owners[0] ? '<div class=\"info-row\"><div class=\"label\">\ud83d\udc64 Owner</div><div class=\"value\">' + $json.owners[0].displayName + '</div></div></div>' : '</div>' }}\n \n <div style=\"text-align: center; margin: 30px 0;\">\n {{ $json.webViewLink ? '<a href=\"' + $json.webViewLink + '\" class=\"btn\">\ud83d\udcc4 View Report</a>' : '' }}\n {{ $json.webContentLink ? '<a href=\"' + $json.webContentLink + '\" class=\"btn btn-secondary\">\u2b07\ufe0f Download</a>' : '' }}\n </div>\n \n <div style=\"background: #e0e7ff; padding: 15px; border-radius: 8px; margin-top: 20px;\">\n <p style=\"margin: 0;\"><strong>\ud83d\udca1 Note:</strong> This report is automatically archived in your Google Drive and can be accessed anytime.</p>\n </div>\n </div>\n \n <div class=\"footer\">\n <p>Automated by n8n Workflow System<br>\u00a9 {{ $now.format('YYYY') }} Techdome Solutions</p>\n </div>\n </div>\n</body>\n</html>",
"includeHtml": true,
"additionalFields": {
"ccList": []
}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "79977199-08cc-4a24-a83e-2a86117bd96c",
"name": "Log Failed Downloads to Error Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
224,
880
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "error_id",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "error_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "error",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "error",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"error_id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1338537721,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit#gid=1338537721",
"cachedResultName": "error log sheet"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit?usp=drivesdk",
"cachedResultName": "Interviewer Brief Pack "
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "00557898-70cf-407f-b510-f30676dedeeb",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1840,
-752
],
"parameters": {
"width": 640,
"height": 576,
"content": "## \ud83e\udde0 Automated Workflow Quality Validator \nThis automation validates uploaded n8n workflows for correctness, documentation quality, and security compliance. \nIt fetches workflow files from Google Drive, analyzes them via GPT-4o, and generates a formatted text + HTML report \u2014 automatically archived and shared with the team.\n\n### \ud83d\udd39 Core Capabilities\n1. Fetch JSON workflows from Google Drive \n2. Validate structure, documentation, and naming \n3. AI-driven scoring with GPT-4o model \n4. Generate human-readable summary report (.txt) \n5. Archive report in Drive and send to Gmail + Slack \n6. Log errors for failed downloads or parsing\n\n### \ud83d\udd39 Technologies\n- **AI Model:** GPT-4o (Azure OpenAI) \n- **Storage:** Google Drive + Sheets \n- **Communication:** Slack + Gmail \n- **Validation Schema:** JSON-based structured analysis\n\n### \ud83d\udd39 Recommended Usage\n- Schedule weekly workflow audits \n- Keep folder \u201cn8n json checker\u201d organized \n- Use reports for peer review and publishing decisions\n"
},
"typeVersion": 1
},
{
"id": "63cf8652-5e99-40ef-9f4f-7327360e949c",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-960,
-368
],
"parameters": {
"color": 7,
"height": 528,
"content": "## \ud83d\udd0d Fetch Workflow Files from Drive \nRetrieves all JSON workflows awaiting validation from the Google Drive folder \u201cn8n json checker.\u201d \nSupports batch processing and returns file metadata including IDs, names, and timestamps. \nActs as the entry point for the workflow validation pipeline.\n"
},
"typeVersion": 1
},
{
"id": "e2eb6789-5afd-4cdd-9404-e354508699c3",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-704,
-352
],
"parameters": {
"color": 7,
"height": 496,
"content": "## \u2699\ufe0f Process Files One by One \nSplits fetched workflow files into manageable batches. \nEnsures sequential validation and prevents overload of API limits. \nEach file is processed individually through the downstream validation sequence.\n"
},
"typeVersion": 1
},
{
"id": "77a59371-bff6-48c3-a08a-6958377730e8",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-352,
-336
],
"parameters": {
"color": 7,
"width": 432,
"height": 528,
"content": "## \u2b07\ufe0f Download & Verify Workflow File \nDownloads workflow JSON content from Drive using file IDs. \nRuns validation to ensure file integrity and prevents corrupt or empty downloads. \nIf validation fails, logs errors to Google Sheets for review.\n"
},
"typeVersion": 1
},
{
"id": "ab513910-6a6a-4671-bfae-f46a6963462e",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
160,
-352
],
"parameters": {
"color": 7,
"height": 480,
"content": "## \ud83e\udde9 Parse JSON Workflow Structure \nConverts raw JSON files into readable object format. \nPrepares data for GPT-4o-powered analysis and structural validation. \nEnsures correct syntax and readable schema before AI processing.\n"
},
"typeVersion": 1
},
{
"id": "e53ab7c1-9ad0-4d38-9a62-1dd8efc6fb17",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
448,
-384
],
"parameters": {
"color": 7,
"width": 320,
"height": 704,
"content": "## \ud83e\udd16 AI-Powered Workflow Quality Analyzer \nAnalyzes parsed workflow JSON using GPT-4o against official n8n publishing guidelines. \nEvaluates eight checkpoints: validity, documentation, security, naming, linkage, originality, resilience, and presentation. \nOutputs a structured JSON assessment for reporting.\n"
},
"typeVersion": 1
},
{
"id": "b851941a-2f24-4eea-863d-32d8b25441cf",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
592,
512
],
"parameters": {
"color": 7,
"height": 384,
"content": "## \ud83e\udde0 Conversation Context Buffer \nMaintains short-term conversational memory for multi-file analysis. \nEnsures consistent AI evaluation across multiple workflows in a batch.\n"
},
"typeVersion": 1
},
{
"id": "3db69206-ea93-4b37-9bee-589bd86faa63",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
912,
304
],
"parameters": {
"color": 7,
"height": 480,
"content": "## \ud83e\uddfe Format AI Response to JSON Schema \nStandardizes GPT-4o output into consistent, machine-readable JSON fields. \nEnsures downstream nodes can process and summarize data cleanly.\n"
},
"typeVersion": 1
},
{
"id": "b348e55a-9b02-493b-a963-6d10bdf5f402",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
880,
-336
],
"parameters": {
"color": 7,
"height": 480,
"content": "## \ud83d\udcdd Generate Human-Readable Report \nTransforms structured JSON analysis into a formatted text summary with clear headers and section dividers. \nHighlights workflow performance across all evaluation checkpoints.\n"
},
"typeVersion": 1
},
{
"id": "bffe1b67-e8ea-48fa-9f7c-22d957f4a0d1",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
1184,
-320
],
"parameters": {
"color": 7,
"height": 464,
"content": "## \ud83d\udccb Convert Report to Text File Format \nConverts formatted analysis report into a `.txt` file ready for archival. \nMaintains spacing, dividers, and alignment for readability.\n"
},
"typeVersion": 1
},
{
"id": "9437a260-03e8-4a95-8ca6-cee70850ff7a",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
1472,
-384
],
"parameters": {
"color": 7,
"height": 528,
"content": "## \u2601\ufe0f Archive Validation Report to Drive \nUploads generated text report to the Google Drive folder \u201cEOD Updates report.\u201d \nNames the file with a timestamp (e.g., `workflow_report_YYYY-MM-DD_HHmmss.txt`). \nTriggers notification sequence upon successful upload.\n"
},
"typeVersion": 1
},
{
"id": "1ce263b7-66e4-434a-badb-4ebc15e881cd",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
1840,
-592
],
"parameters": {
"color": 7,
"height": 512,
"content": "## \ud83d\udcac Slack Notification Summary \nPosts a concise validation summary message to Slack with key details: \n- Workflow name \n- Validation status (\u2705 PASSED / \u274c FAILED) \n- File size and creation time \nIncludes quick Drive access links for team visibility.\n"
},
"typeVersion": 1
},
{
"id": "fe65d0c6-99a3-4d10-a357-6779b928d878",
"name": "Sticky Note12",
"type": "n8n-nodes-base.stickyNote",
"position": [
1856,
-16
],
"parameters": {
"color": 7,
"height": 464,
"content": "## \ud83d\udce7 Email Detailed Report to Stakeholders \nSends an HTML-formatted summary email with embedded style and report metadata. \nIncludes file details (name, size, owner, creation time) and quick access buttons for viewing or downloading the report.\n"
},
"typeVersion": 1
},
{
"id": "01a6ef0e-57c2-4e88-88ee-41a4e228a527",
"name": "Sticky Note13",
"type": "n8n-nodes-base.stickyNote",
"position": [
160,
576
],
"parameters": {
"color": 7,
"height": 544,
"content": "## \u26a0\ufe0f Log Failed Downloads to Error Sheet \nCaptures failed file downloads or validation issues in a dedicated Google Sheet tab. \nEnsures transparency and quick debugging for workflow review errors.\n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "13fbf6ad-db38-4c00-af65-e8df17cfba5f",
"connections": {
"Process Files One by One": {
"main": [
[],
[
{
"node": "Download Workflow JSON File",
"type": "main",
"index": 0
}
]
]
},
"Conversation Context Buffer": {
"ai_memory": [
[
{
"node": "AI-Powered Workflow Quality Analyzer",
"type": "ai_memory",
"index": 0
}
]
]
},
"Download Workflow JSON File": {
"main": [
[
{
"node": "Validate File Download Success",
"type": "main",
"index": 0
}
]
]
},
"Parse JSON Workflow Structure": {
"main": [
[
{
"node": "AI-Powered Workflow Quality Analyzer",
"type": "main",
"index": 0
}
]
]
},
"Generate Human-Readable Report": {
"main": [
[
{
"node": " Convert Report to Text File Format",
"type": "main",
"index": 0
}
]
]
},
"Validate File Download Success": {
"main": [
[
{
"node": "Parse JSON Workflow Structure",
"type": "main",
"index": 0
}
],
[
{
"node": "Log Failed Downloads to Error Sheet",
"type": "main",
"index": 0
}
]
]
},
"Fetch Workflow Files from Drive": {
"main": [
[
{
"node": "Process Files One by One",
"type": "main",
"index": 0
}
]
]
},
" Format AI Response to JSON Schema": {
"ai_outputParser": [
[
{
"node": "AI-Powered Workflow Quality Analyzer",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Archive Validation Report to Drive": {
"main": [
[
{
"node": "Email Detailed Report to Stakeholders",
"type": "main",
"index": 0
},
{
"node": "Send Validation Summary to Slack",
"type": "main",
"index": 0
}
]
]
},
" Convert Report to Text File Format": {
"main": [
[
{
"node": "Archive Validation Report to Drive",
"type": "main",
"index": 0
}
]
]
},
"GPT-4o Language Model Configuration": {
"ai_languageModel": [
[
{
"node": "AI-Powered Workflow Quality Analyzer",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"AI-Powered Workflow Quality Analyzer": {
"main": [
[
{
"node": "Generate Human-Readable Report",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "Fetch Workflow Files from Drive",
"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.
azureOpenAiApigmailOAuth2googleDriveOAuth2ApigoogleSheetsOAuth2ApislackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automates end-to-end validation, assessment, and reporting of n8n workflow JSON templates using Google Drive, Azure OpenAI GPT-4o, Gmail, and Slack. It retrieves workflows from a Drive folder, validates their integrity, analyzes their quality against official n8n…
Source: https://n8n.io/workflows/9681/ — 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.
Who is this for? Agencies, consultants, and service providers who conduct discovery calls and need to quickly turn conversations into professional proposals.
This workflow intelligently analyzes incoming Gmail emails, classifies intent using GPT-4, and sends real-time Slack notifications while logging structured data into Google Sheets. It provides a smart
Automatically capture customer onboarding help requests from Typeform, log them in Google Sheets, validate email addresses, and send a professional HTML welcome email via Gmail. Ensures smooth onboard
Automate customer feedback analysis and action planning by integrating Monday.com, Azure OpenAI, Jira, Google Sheets, and Outlook. This workflow classifies customer feedback with AI, calculates busine
Automatically generate polished, n8n-ready template descriptions from your saved JSON workflows in Google Drive. This AI-powered automation processes workflow files, drafts compliant descriptions, and