This workflow corresponds to n8n.io template #10330 — 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": "9F7rxHKt3weSqZaD",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "API Rate Limit & Auth FAQ Test",
"tags": [
{
"id": "DWhGhh4ifGbElCsl",
"name": "Quality Assurance",
"createdAt": "2025-11-03T11:37:00.082Z",
"updatedAt": "2025-11-03T11:37:00.082Z"
},
{
"id": "OaQsaj1GDsV2DDag",
"name": "AI",
"createdAt": "2025-11-03T11:37:00.112Z",
"updatedAt": "2025-11-03T11:37:00.112Z"
},
{
"id": "u5sfzrVZ11a9nsuB",
"name": "Documentation",
"createdAt": "2025-11-03T11:37:00.152Z",
"updatedAt": "2025-11-03T11:37:00.152Z"
}
],
"nodes": [
{
"id": "35aa638c-cbaa-4125-877d-68560d49de34",
"name": "When clicking \u2018Execute workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-944,
3312
],
"parameters": {},
"typeVersion": 1
},
{
"id": "86fc4b54-b1b5-4de7-b98d-22abd8f4ba25",
"name": "Section: Data Input",
"type": "n8n-nodes-base.stickyNote",
"position": [
-848,
3088
],
"parameters": {
"color": 7,
"width": 580,
"content": "## \ud83d\udce5 Data Input\n\nFetches FAQ data from Google Sheets and validates it before processing."
},
"typeVersion": 1
},
{
"id": "dc53c187-0fc4-45e0-a415-13acc67a41f4",
"name": "Section: AI Evaluation",
"type": "n8n-nodes-base.stickyNote",
"position": [
-128,
3088
],
"parameters": {
"color": 7,
"width": 400,
"height": 144,
"content": "## \ud83e\udd16 AI Evaluation\n\nScores each FAQ using GPT-4o-mini based on completeness, clarity, technical accuracy, and actionability."
},
"typeVersion": 1
},
{
"id": "861caa0a-4607-4a31-9682-a193652fb9b1",
"name": "Section: Storage",
"type": "n8n-nodes-base.stickyNote",
"position": [
480,
3088
],
"parameters": {
"color": 7,
"width": 480,
"content": "## \ud83d\udcbe Results Storage\n\nSaves detailed scores to Results sheet and aggregated metrics to History sheet for trend tracking."
},
"typeVersion": 1
},
{
"id": "6e69317c-4cdb-4871-b2e4-0f7dc8022fe5",
"name": "Section: Alerts",
"type": "n8n-nodes-base.stickyNote",
"position": [
1152,
3040
],
"parameters": {
"color": 7,
"width": 540,
"content": "## \ud83d\udce2 Notifications\n\nSends Slack alerts when critical or warning-level issues are detected, then emails a completion summary."
},
"typeVersion": 1
},
{
"id": "073ad6bd-87e2-409d-ab43-2546907c1aef",
"name": "\ud83d\udccb Workflow Overview1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1536,
3056
],
"parameters": {
"width": 420,
"height": 552,
"content": "## How it works\n\nThis workflow automatically evaluates FAQ quality using AI (GPT-4o-mini), scores each entry (0-10), and tracks improvements over time. It reads FAQs from Google Sheets, gets AI feedback on completeness and clarity, then saves detailed results and sends Slack alerts for low-scoring content.\n\n**Key features:** Historical tracking, severity-based alerts (\ud83d\udd34 Critical, \u26a0\ufe0f Warning, \u2705 Good), batch processing, and comprehensive error handling.\n\n## Setup steps\n\n1. **Connect accounts:** Add Google Sheets OAuth and Azure OpenAI credentials\n2. **Configure Sheet ID:** Update the Configuration node with your Google Sheet ID (found in the sheet URL)\n3. **Set up Slack:** Add Slack webhook and update channel ID in Configuration node (optional)\n4. **Prepare your sheet:** Create a sheet named \"TestSet\" with Question (Column A) and Answer (Column B)\n5. **Run:** Click \"Execute workflow\" to start the quality check"
},
"typeVersion": 1
},
{
"id": "aa25afd0-e903-4352-a809-a995941dbee0",
"name": "\u2699\ufe0f Configuration1",
"type": "n8n-nodes-base.set",
"position": [
-736,
3312
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "config_sheet_id",
"name": "sheet_id",
"type": "string",
"value": "1ABC_REPLACE_WITH_YOUR_SHEET_ID_xyz123"
},
{
"id": "config_threshold_critical",
"name": "threshold_critical",
"type": "number",
"value": 5
},
{
"id": "config_threshold_warning",
"name": "threshold_warning",
"type": "number",
"value": 7
},
{
"id": "config_threshold_good",
"name": "threshold_good",
"type": "number",
"value": 8
},
{
"id": "config_slack_channel",
"name": "slack_channel_id",
"type": "string",
"value": "C09GNB90TED"
},
{
"id": "config_batch_size",
"name": "batch_size",
"type": "number",
"value": 10
},
{
"id": "config_test_sheet",
"name": "test_sheet_name",
"type": "string",
"value": "TestSet"
},
{
"id": "config_results_sheet",
"name": "results_sheet_name",
"type": "string",
"value": "Results"
},
{
"id": "config_history_sheet",
"name": "history_sheet_name",
"type": "string",
"value": "History"
},
{
"id": "run_id",
"name": "run_id",
"type": "string",
"value": "={{ $now.format('yyyyMMdd-HHmmss') }}"
}
]
}
},
"typeVersion": 3.3
},
{
"id": "653f3c13-0665-48ad-93a3-ed24e860518f",
"name": "\ud83d\udcd6 Fetch FAQs1",
"type": "n8n-nodes-base.googleSheets",
"position": [
-512,
3312
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "name",
"value": "={{ $json.test_sheet_name }}"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.sheet_id }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "e27c8068-5afc-4cd7-8204-6ba2a43e5b48",
"name": "\ud83d\udd0d Validate & Clean Data1",
"type": "n8n-nodes-base.code",
"position": [
-288,
3312
],
"parameters": {
"jsCode": "// Validate and clean FAQ data\nconst items = $input.all();\nconst config = items[0].json;\nconst cleanedItems = [];\n\nfor (let i = 0; i < items.length; i++) {\n const item = items[i];\n \n // Skip if it's the config item or header row\n if (item.json.sheet_id || i === 0) continue;\n \n // Get question and answer (handle different column name formats)\n const question = item.json.Question || item.json.question || item.json.A || '';\n const answer = item.json.Answer || item.json.answer || item.json.B || '';\n \n // Skip empty rows\n if (!question || !answer || question.trim() === '' || answer.trim() === '') {\n continue;\n }\n \n // Create cleaned item\n cleanedItems.push({\n json: {\n question: question.trim(),\n answer: answer.trim(),\n row_number: i,\n run_id: config.run_id,\n sheet_id: config.sheet_id,\n batch_size: config.batch_size,\n threshold_critical: config.threshold_critical,\n threshold_warning: config.threshold_warning,\n threshold_good: config.threshold_good\n }\n });\n}\n\nif (cleanedItems.length === 0) {\n throw new Error('No valid FAQ entries found in the sheet. Please check your data format.');\n}\n\nconsole.log(`Validated ${cleanedItems.length} FAQ entries for processing`);\nreturn cleanedItems;"
},
"typeVersion": 2
},
{
"id": "5db219e2-af99-4386-b3f9-c53a79cc9cf6",
"name": "\ud83e\udd16 AI Evaluator1",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-64,
3312
],
"parameters": {
"text": "=You are an expert technical documentation reviewer specializing in API documentation, authentication systems, and rate limiting policies.\n\n**Task:** Evaluate the quality and completeness of this FAQ entry.\n\n**Question:** {{ $json.question }}\n\n**Answer:** {{ $json.answer }}\n\n**Evaluation Criteria:**\n1. **Completeness (0-3 points)**: Does it address edge cases and scenarios?\n2. **Clarity (0-3 points)**: Is the explanation clear and unambiguous?\n3. **Technical Accuracy (0-2 points)**: Are technical details correct?\n4. **Actionability (0-2 points)**: Can users act on this information?\n\n**Output Requirements:**\nProvide ONLY valid JSON with this exact structure:\n{\n \"score\": <number 0-10>,\n \"explanation\": \"<brief one-sentence explanation>\",\n \"strengths\": \"<what's good about this answer>\",\n \"improvements\": \"<specific suggestions for improvement>\"\n}\n\n**Important:** Return ONLY the JSON object, no additional text.",
"options": {
"systemMessage": "You are a technical documentation quality analyst. Provide objective, constructive evaluations in valid JSON format only."
}
},
"typeVersion": 1.2
},
{
"id": "9bc66b99-cb86-4c3e-abc4-fa6fa8685e29",
"name": "Azure OpenAI1",
"type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
"position": [
16,
3536
],
"parameters": {
"model": "gpt-4o-mini",
"options": {
"maxTokens": 500,
"temperature": 0.3
}
},
"credentials": {
"azureOpenAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "e2a58c64-1552-43ae-a7df-2bf665ea52a1",
"name": "\ud83d\udcca Parse & Enrich Results1",
"type": "n8n-nodes-base.code",
"position": [
304,
3312
],
"parameters": {
"jsCode": "// Parse and enrich AI evaluation results with error handling\nconst items = $input.all();\nconst enrichedItems = [];\n\nfor (const item of items) {\n try {\n // Get the AI output\n const aiOutput = item.json.output || '{}';\n \n // Try to parse JSON from the output\n let evaluation;\n try {\n // Handle case where output might have markdown code blocks\n const jsonMatch = aiOutput.match(/\\{[\\s\\S]*\\}/);\n const jsonString = jsonMatch ? jsonMatch[0] : aiOutput;\n evaluation = JSON.parse(jsonString);\n } catch (parseError) {\n console.error('Failed to parse AI response:', aiOutput);\n evaluation = {\n score: 0,\n explanation: 'AI response parsing failed',\n strengths: 'N/A',\n improvements: 'Error in evaluation - needs manual review'\n };\n }\n \n // Determine severity level\n let severity = 'good';\n let severity_emoji = '\u2705';\n \n if (evaluation.score < item.json.threshold_critical) {\n severity = 'critical';\n severity_emoji = '\ud83d\udd34';\n } else if (evaluation.score < item.json.threshold_warning) {\n severity = 'warning';\n severity_emoji = '\u26a0\ufe0f';\n } else if (evaluation.score < item.json.threshold_good) {\n severity = 'acceptable';\n severity_emoji = '\ud83d\udfe1';\n }\n \n // Create enriched item\n enrichedItems.push({\n json: {\n // Original data\n question: item.json.question,\n answer: item.json.answer,\n row_number: item.json.row_number,\n run_id: item.json.run_id,\n \n // Evaluation results\n score: evaluation.score || 0,\n explanation: evaluation.explanation || 'No explanation provided',\n strengths: evaluation.strengths || 'N/A',\n improvements: evaluation.improvements || 'N/A',\n \n // Metadata\n severity: severity,\n severity_emoji: severity_emoji,\n timestamp: new Date().toISOString(),\n evaluated_at: new Date().toLocaleString('en-US', { \n timeZone: 'UTC',\n dateStyle: 'medium',\n timeStyle: 'short'\n }),\n \n // For filtering\n needs_attention: evaluation.score < item.json.threshold_warning,\n \n // Config passthrough\n sheet_id: item.json.sheet_id\n }\n });\n } catch (error) {\n console.error('Error processing item:', error);\n // Add error item to results\n enrichedItems.push({\n json: {\n question: item.json.question || 'Unknown',\n answer: item.json.answer || 'Unknown',\n score: 0,\n explanation: `Processing error: ${error.message}`,\n severity: 'error',\n severity_emoji: '\u274c',\n timestamp: new Date().toISOString(),\n needs_attention: true,\n sheet_id: item.json.sheet_id,\n run_id: item.json.run_id\n }\n });\n }\n}\n\nconsole.log(`Processed ${enrichedItems.length} evaluations`);\nreturn enrichedItems;"
},
"typeVersion": 2
},
{
"id": "ad83a4b8-4cdc-40a3-b5de-49fb85ac205c",
"name": "\ud83d\udcbe Save Detailed Results1",
"type": "n8n-nodes-base.googleSheets",
"position": [
528,
3312
],
"parameters": {
"columns": {
"value": {
"Score": "={{ $json.score }}",
"Run ID": "={{ $json.run_id }}",
"Question": "={{ $json.question }}",
"Severity": "={{ $json.severity_emoji }} {{ $json.severity.toUpperCase() }}",
"Strengths": "={{ $json.strengths }}",
"Timestamp": "={{ $json.evaluated_at }}",
"Explanation": "={{ $json.explanation }}",
"Improvements": "={{ $json.improvements }}"
},
"mappingMode": "defineBelow"
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Results"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.sheet_id }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "853e8bba-0d8e-413a-b6fb-959e8ea1896c",
"name": "\ud83d\udcc8 Generate Summary Report1",
"type": "n8n-nodes-base.code",
"position": [
752,
3312
],
"parameters": {
"jsCode": "// Generate comprehensive summary report\nconst items = $input.all();\n\nif (items.length === 0) {\n return [{\n json: {\n error: 'No items to summarize'\n }\n }];\n}\n\n// Calculate statistics\nconst scores = items.map(item => item.json.score);\nconst totalFaqs = scores.length;\nconst avgScore = (scores.reduce((a, b) => a + b, 0) / totalFaqs).toFixed(2);\nconst maxScore = Math.max(...scores);\nconst minScore = Math.min(...scores);\n\n// Count by severity\nconst critical = items.filter(item => item.json.severity === 'critical').length;\nconst warning = items.filter(item => item.json.severity === 'warning').length;\nconst acceptable = items.filter(item => item.json.severity === 'acceptable').length;\nconst good = items.filter(item => item.json.severity === 'good').length;\n\n// Calculate pass rate (score >= 7)\nconst passCount = scores.filter(s => s >= 7).length;\nconst passRate = ((passCount / totalFaqs) * 100).toFixed(1);\n\n// Get config from first item\nconst config = items[0].json;\n\n// Find top 3 worst performing FAQs\nconst worstFaqs = items\n .sort((a, b) => a.json.score - b.json.score)\n .slice(0, 3)\n .map(item => ({\n question: item.json.question.substring(0, 100),\n score: item.json.score,\n improvements: item.json.improvements\n }));\n\n// Create summary\nconst summary = {\n json: {\n // Summary stats\n run_id: config.run_id,\n timestamp: new Date().toISOString(),\n total_faqs: totalFaqs,\n average_score: parseFloat(avgScore),\n max_score: maxScore,\n min_score: minScore,\n pass_rate: parseFloat(passRate),\n \n // Severity breakdown\n critical_count: critical,\n warning_count: warning,\n acceptable_count: acceptable,\n good_count: good,\n \n // Status\n overall_status: critical > 0 ? 'CRITICAL' : warning > 0 ? 'NEEDS_ATTENTION' : 'HEALTHY',\n \n // Worst performers\n worst_performers: JSON.stringify(worstFaqs),\n \n // For display\n summary_text: `\ud83d\udcca FAQ Quality Report\\n\\n` +\n `\ud83d\udcc8 Overall Score: ${avgScore}/10 (${passRate}% pass rate)\\n` +\n `\ud83d\udcdd Total FAQs Evaluated: ${totalFaqs}\\n\\n` +\n `\ud83c\udfaf Severity Breakdown:\\n` +\n ` \ud83d\udd34 Critical: ${critical}\\n` +\n ` \u26a0\ufe0f Warning: ${warning}\\n` +\n ` \ud83d\udfe1 Acceptable: ${acceptable}\\n` +\n ` \u2705 Good: ${good}\\n\\n` +\n `\ud83d\udcc9 Score Range: ${minScore} - ${maxScore}`,\n \n // For alerts\n needs_alert: critical > 0 || warning > 0,\n sheet_id: config.sheet_id,\n \n // Pass through all items for next node\n all_results: items\n }\n};\n\nconsole.log('Summary generated:', summary.json.summary_text);\nreturn [summary];"
},
"typeVersion": 2
},
{
"id": "0cf75d4f-f2e1-47ca-91f1-4ddffd9ff987",
"name": "\ud83d\udcca Save to History1",
"type": "n8n-nodes-base.googleSheets",
"position": [
976,
3312
],
"parameters": {
"columns": {
"value": {
"Good": "={{ $json.good_count }}",
"Run ID": "={{ $json.run_id }}",
"Status": "={{ $json.overall_status }}",
"Warning": "={{ $json.warning_count }}",
"Critical": "={{ $json.critical_count }}",
"Pass Rate": "={{ $json.pass_rate }}%",
"Timestamp": "={{ $json.timestamp }}",
"Acceptable": "={{ $json.acceptable_count }}",
"Total FAQs": "={{ $json.total_faqs }}",
"Average Score": "={{ $json.average_score }}"
},
"mappingMode": "defineBelow"
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "History"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.sheet_id }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "5390e894-108c-462c-8b4e-85fa481a631c",
"name": "\u26a0\ufe0f Check if Alerts Needed1",
"type": "n8n-nodes-base.if",
"position": [
1200,
3312
],
"parameters": {
"options": {},
"conditions": {
"boolean": [
{
"value1": "={{ $json.needs_alert }}",
"value2": true
}
]
}
},
"typeVersion": 2
},
{
"id": "24cdee69-2017-47ba-961f-198a6bea352f",
"name": "\ud83d\udcac Send Slack Alert1",
"type": "n8n-nodes-base.slack",
"position": [
1424,
3232
],
"parameters": {
"text": "=\ud83d\udea8 *FAQ Quality Alert* \ud83d\udea8\n\n{{ $json.summary_text }}\n\n---\n\n\u26a0\ufe0f *Action Required:*\n{{ $json.critical_count > 0 ? '\ud83d\udd34 ' + $json.critical_count + ' CRITICAL issues need immediate attention\\n' : '' }}{{ $json.warning_count > 0 ? '\u26a0\ufe0f ' + $json.warning_count + ' warnings should be reviewed\\n' : '' }}\n\ud83d\udccb View full details: https://docs.google.com/spreadsheets/d/{{ $json.sheet_id }}/edit#gid=0\n\n*Run ID:* `{{ $json.run_id }}`",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "C09GNB90TED"
},
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "4e661beb-0009-4de3-8388-fb7221b9afad",
"name": "\u2705 Completion Summary1",
"type": "n8n-nodes-base.set",
"position": [
1632,
3408
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "complete_message",
"name": "completion_message",
"type": "string",
"value": "=\u2705 FAQ Quality Check Complete!\n\nRun ID: {{ $json.run_id }}\nTotal FAQs Evaluated: {{ $json.total_faqs }}\nAverage Score: {{ $json.average_score }}/10\nPass Rate: {{ $json.pass_rate }}%\n\nResults saved to Google Sheets.\n{{ $json.needs_alert ? 'Alerts sent to team.' : 'No alerts needed - all FAQs meeting quality standards!' }}"
},
{
"id": "results_url",
"name": "results_url",
"type": "string",
"value": "=https://docs.google.com/spreadsheets/d/{{ $json.sheet_id }}/edit"
}
]
}
},
"typeVersion": 3.3
},
{
"id": "e93ce33f-4bbe-476b-82f3-e122987bae3a",
"name": "Send a message1",
"type": "n8n-nodes-base.gmail",
"position": [
1872,
3312
],
"parameters": {
"sendTo": "info@example.com",
"message": "={{ $json.text }}",
"options": {},
"subject": "={{ $json.text }}",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "3fb46229-1e78-4bb1-9e72-90cfba38bf71",
"connections": {
"Azure OpenAI1": {
"ai_languageModel": [
[
{
"node": "\ud83e\udd16 AI Evaluator1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"\ud83d\udcd6 Fetch FAQs1": {
"main": [
[
{
"node": "\ud83d\udd0d Validate & Clean Data1",
"type": "main",
"index": 0
}
]
]
},
"\ud83e\udd16 AI Evaluator1": {
"main": [
[
{
"node": "\ud83d\udcca Parse & Enrich Results1",
"type": "main",
"index": 0
}
]
]
},
"\u2699\ufe0f Configuration1": {
"main": [
[
{
"node": "\ud83d\udcd6 Fetch FAQs1",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udcca Save to History1": {
"main": [
[
{
"node": "\u26a0\ufe0f Check if Alerts Needed1",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udcac Send Slack Alert1": {
"main": [
[
{
"node": "\u2705 Completion Summary1",
"type": "main",
"index": 0
}
]
]
},
"\u2705 Completion Summary1": {
"main": [
[
{
"node": "Send a message1",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udcbe Save Detailed Results1": {
"main": [
[
{
"node": "\ud83d\udcc8 Generate Summary Report1",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udd0d Validate & Clean Data1": {
"main": [
[
{
"node": "\ud83e\udd16 AI Evaluator1",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udcca Parse & Enrich Results1": {
"main": [
[
{
"node": "\ud83d\udcbe Save Detailed Results1",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udcc8 Generate Summary Report1": {
"main": [
[
{
"node": "\ud83d\udcca Save to History1",
"type": "main",
"index": 0
}
]
]
},
"\u26a0\ufe0f Check if Alerts Needed1": {
"main": [
[
{
"node": "\ud83d\udcac Send Slack Alert1",
"type": "main",
"index": 0
},
{
"node": "\u2705 Completion Summary1",
"type": "main",
"index": 0
}
],
[
{
"node": "\u2705 Completion Summary1",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "\u2699\ufe0f Configuration1",
"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.
azureOpenAiApigmailOAuth2googleSheetsOAuth2ApislackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Keep your API documentation accurate and reliable with this n8n automation template. The workflow automatically tests your FAQ content related to authentication and rate limits, evaluating each answer using Azure OpenAI GPT-4o-mini for completeness, edge-case coverage, and…
Source: https://n8n.io/workflows/10330/ — 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.
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 f
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 your weekly social media analytics with this end-to-end AI reporting workflow. 📊🤖 This system collects real-time Twitter (X) and Facebook metrics, merges and validates data, formats it with J
This end-to-end automation transforms developer support emails into actionable FAQs and sentiment insights using Azure OpenAI GPT-4o, Gmail, Notion, Slack, and Google Sheets. It not only classifies an
This automation streamlines client review collection and sentiment summarization for Techdome using HighLevel CRM, Azure OpenAI GPT-4o, Gmail, Slack, and Google Sheets. It starts by pulling recently w