AutomationFlowsAI & RAG › Audit Interview Feedback & Report via Slack with Gpt-4o-mini and Google Sheets

Audit Interview Feedback & Report via Slack with Gpt-4o-mini and Google Sheets

ByRahul Joshi @rahul08 on n8n.io

This workflow automates the evaluation of interviewer feedback using AI. It retrieves raw notes from Google Sheets, processes them through GPT-4o-mini for structured scoring, validates outputs, and calculates weighted quality scores. The system provides real-time Slack feedback…

Event trigger★★★★☆ complexityAI-powered23 nodesGoogle SheetsLm Chat Azure Open AiChain LlmSlack
AI & RAG Trigger: Event Nodes: 23 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Chainllm → Google Sheets recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

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

Download .json
{
  "id": "DZrX6urOE53Tm4jp",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Interview Quality Audit",
  "tags": [],
  "nodes": [
    {
      "id": "9e228e13-31c4-4f40-8bc1-83ffc0c0df21",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -176,
        16
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "4656de9f-4ad6-4b48-a8b0-6802cd1e88ca",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        576,
        160
      ],
      "parameters": {
        "height": 384,
        "content": " \u2705 Validate AI Response\nType: Conditional Logic\nPurpose: Quality control checkpoint\nValidation:\n\nResponse text is not undefined\nContains valid data structure\n\nRouting:\n\n\u2705 Valid \u2192 Continue to JSON parsing\n\u274c Invalid \u2192 Log to error sheet\n\nFunction: Prevents malformed responses from corrupting pipeline"
      },
      "typeVersion": 1
    },
    {
      "id": "ed2e275a-ea76-4d78-b9da-2149ec9f5b50",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        224,
        352
      ],
      "parameters": {
        "height": 320,
        "content": "\ud83e\udd16 AI Quality Evaluator (GPT-4o)\nType: AI Language Model\nPurpose: Cognitive engine for feedback analysis\nConfiguration:\n\nModel: gpt-4o-mini\nPlatform: Azure OpenAI\nIntegration: LangChain\n\nConnects to Azure GPT-4o-mini\nPowers NLP evaluation\nGenerates structured JSON outputs"
      },
      "typeVersion": 1
    },
    {
      "id": "97cdbdb7-5306-4910-8e93-927940ed699d",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        224,
        -560
      ],
      "parameters": {
        "width": 336,
        "height": 544,
        "content": "\ud83d\udd0d Analyze Feedback Quality\nType: LangChain LLM Chain\nPurpose: Core AI evaluation engine\nEvaluation Dimensions (1-5 Scale):\n\nSpecificity (35%) - Concrete details\nStructure/STAR (15%) - Situation-Task-YOUR_OPENAI_KEY_HERE-Result\nBias-Free Language (15%) - No gender/appearance bias\nActionability (10%) - Decision usefulness\nDepth (25%) - Multiple competencies\n\nScoring:\n\n5: Excellent - Clear STAR with evidence\n3: Adequate - Some info but vague\n1: Unusable - Purely subjective\n\nSpecial Rules:\n\nFeedback <30 words \u2192 Scores \u22642\nExtracts vague phrases (\"great guy\", \"nice energy\")\n\nOutput: JSON with scores and vague_phrases array"
      },
      "typeVersion": 1
    },
    {
      "id": "6681d513-9520-4c78-8595-cbb27bdfff9c",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -64,
        192
      ],
      "parameters": {
        "height": 368,
        "content": "\ud83d\udccb Fetch Interview Feedback\nType: Google Sheets Read\nPurpose: Retrieve raw feedback data\nConfiguration:\n\nDocument: Interviewer Brief Pack\nSheet: Raw_Feedback\nOperation: Read all rows\n\nData Retrieved:\nTimestamp, Candidate_ID, Role, Stage, Interviewer_Email, Feedback_Text, row_number\nOutput: All feedback records passed to AI evaluation"
      },
      "typeVersion": 1
    },
    {
      "id": "f3e8a974-86fa-4a81-a5bd-3cbebf6302b4",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        928,
        -224
      ],
      "parameters": {
        "width": 288,
        "height": 208,
        "content": "\ud83d\udd04 Parse AI JSON Output\nType: JavaScript Code\nPurpose: Convert string to structured data\nFunction:\n\nSafely parses AI text to JSON object\nTry-catch error handling\nThrows descriptive errors for debugging"
      },
      "typeVersion": 1
    },
    {
      "id": "78deb6fe-c12f-4281-974d-19a9155f0f0e",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1664,
        448
      ],
      "parameters": {
        "width": 320,
        "height": 224,
        "content": "\ud83c\udfaf Check if Training Needed\nType: Conditional Logic\nPurpose: Identify low performers\nCondition: Score < 50\nRouting:\n\n\u2705 <50 \u2192 Send training resources\n\u274c \u226550 \u2192 No additional action\n\nFunction: Triggers enhanced coaching for scores below threshold"
      },
      "typeVersion": 1
    },
    {
      "id": "97e18f0a-359c-4bf3-8ff8-bfe51a193e7d",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2064,
        464
      ],
      "parameters": {
        "width": 400,
        "height": 304,
        "content": "\ud83d\udcda Send Training Recommendations\nType: Slack Notification\nPurpose: Deliver coaching resources\nMessage Content:\n\nScore, Flags, Specific vague phrases\nImprovement guidance (STAR method)\n\ud83d\udcd8 STAR Method Guide link\n\ud83c\udfa5 Bias-Free Interviewing Video link\n\nFunction:\n\nDetailed coaching for scores <50\nLinks to training resources\nSupportive, growth-focused tone"
      },
      "typeVersion": 1
    },
    {
      "id": "b88c8198-7941-41a6-8b7f-406f62371288",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        880,
        464
      ],
      "parameters": {
        "height": 320,
        "content": "\ud83d\udea8 Log AI Errors\nType: Google Sheets Append\nPurpose: Error tracking\nConfiguration:\n\nSheet: error log sheet\nOperation: APPEND\n\nFunction:\n\nCaptures AI failures\nCreates error audit trail\nEnables debugging and monitoring\nTracks system reliability\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "a98fbf8e-388a-40fe-a7a7-5e54866da422",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1808,
        -144
      ],
      "parameters": {
        "width": 336,
        "height": 304,
        "content": "\ud83d\udcac Send Feedback Summary\nType: Slack Notification\nPurpose: Deliver quality report\nMessage Structure:\n\nRole, Stage, Score (X/100), Flags\nHigh Quality: Congratulations message\nNeeds Improvement: Vague phrases + STAR tips\n\nFunction:\n\nImmediate feedback to interviewer\nSpecific, actionable guidance\nEncourages continuous improvement"
      },
      "typeVersion": 1
    },
    {
      "id": "989baf43-960a-4393-9640-02b4454289d3",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1488,
        -592
      ],
      "parameters": {
        "width": 352,
        "height": 336,
        "content": "\ud83d\udcbe Save Scores to Spreadsheet\nType: Google Sheets Update\nPurpose: Persist quality metrics\nConfiguration:\n\nSheet: Raw_Feedback\nOperation: UPDATE (match by row_number)\n\nFields Updated:\n\nScore (0-100)\nFlags (quality issues)\nLLM_JSON (complete AI analysis)\n\nFunction: Updates original rows, creates audit trail for trend analysis"
      },
      "typeVersion": 1
    },
    {
      "id": "c7fbcc25-cdde-4b02-b4ec-afdae31fff2e",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1152,
        160
      ],
      "parameters": {
        "width": 288,
        "height": 480,
        "content": "\ud83e\uddee Calculate Weighted Quality Score\nType: JavaScript Code\nPurpose: Compute final score and flags\nWeights:\nSpecificity 35% | Depth 25% | Structure 15% | Bias-Free 15% | Actionability 10%\nFlags:\n\n\"low_detail\": specificity < 3 OR depth < 3\n\"bias\": bias_free_language < 3\n\nFunction:\n\nCalculates 0-100 score\nGenerates quality flags\nFormats vague phrases for Slack\nPreserves context (Role, Stage, row_number)\n\nOutput: Score, Flags, LLM_JSON, VaguePhrasesFormatted"
      },
      "typeVersion": 1
    },
    {
      "id": "69339a87-95fa-4827-a768-a6a9aa1def9e",
      "name": "Fetch Raw Feedback Data",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        32,
        16
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 315277036,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit#gid=315277036",
          "cachedResultName": "Raw_Feedback"
        },
        "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,
      "alwaysOutputData": false
    },
    {
      "id": "99814f2b-ab97-49bf-8eec-43083f731dad",
      "name": "AI Quality Evaluator (GPT-4o1",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        272,
        192
      ],
      "parameters": {
        "model": "gpt-4o-mini",
        "options": {}
      },
      "credentials": {
        "azureOpenAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "6517c215-19c5-4644-97f6-26d650c65540",
      "name": "Analyze Feedback Quality",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        288,
        16
      ],
      "parameters": {
        "text": "=You are an Interview Feedback Quality Auditor.\n\nYour task is to evaluate interviewer feedback notes and score them across 5 dimensions:\n- specificity (1\u20135)\n- structure_STAR (1\u20135)\n- bias_free_language (1\u20135)\n- actionability (1\u20135)\n- depth (1\u20135)\n\n\u2696\ufe0f Scoring Guidelines:\n- 5 = Excellent: Clear, detailed, STAR format (Situation, Task, Action, Result) explicitly used or strongly implied, with evidence/examples.\n- 4 = Good: Mostly structured, some detail, minor gaps, still useful for decisions.\n- 3 = Adequate: Some relevant info but mixed with vagueness, missing STAR elements.\n- 2 = Poor: Mostly vague or generic, no clear evidence, over-reliant on subjective phrasing.\n- 1 = Unusable: Purely subjective (\u201cgreat guy\u201d, \u201cnice energy\u201d), no actionable details.\n\nBias-free language: Score low if feedback references gender, looks, personality, or irrelevant traits.\n\nActionability: Score higher if the feedback directly helps in making a decision (e.g., \u201cpassed all test cases under time constraint\u201d vs \u201cseems smart\u201d).\n\nDepth: Score higher if multiple competencies or dimensions are covered, lower if only 1 vague point.\n\n\ud83d\udea8 Additional Rules:\n- If text <30 words OR contains mostly emojis/placeholders \u2192 set ALL scores \u22642 and add `\"too_short\"` to vague_phrases.\n- Extract vague phrases (e.g., \u201cgood energy\u201d, \u201csmart guy\u201d, \u201cshould be fine\u201d) into `\"vague_phrases\"` array.\n\nReturn ONLY valid JSON in this schema:\n{\n  \"specificity\": <1\u20135>,\n  \"structure\": <1\u20135>,\n  \"bias_free_language\": <1\u20135>,\n  \"actionability\": <1\u20135>,\n  \"depth\": <1\u20135>,\n  \"vague_phrases\": [ ... ]\n}\n",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "You are an Interview Feedback Quality Auditor.   Evaluate interview feedback for specificity, structure (STAR), bias-free language, actionability, and depth.   Be strict but fair. Always return **only valid JSON** that follows the given schema.Return ONLY valid JSON, no explanations, no markdown, no quotes wrapping the whole object.\n"
            },
            {
              "type": "HumanMessagePromptTemplate",
              "message": "=Role: {{$json[\"Role\"]}}   Stage: {{$json[\"Stage\"]}}   Feedback: {{$json[\"Feedback_Text\"]}}"
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "0612aeb7-a3a2-4215-9910-4cd077e06586",
      "name": "Validate AI Response",
      "type": "n8n-nodes-base.if",
      "position": [
        640,
        16
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "4901c65c-6aaf-4efe-a133-1fedfedc0bca",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json.text }}",
              "rightValue": "undefined "
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "f89f5698-5d3c-4771-8b0b-511b32b9fc33",
      "name": "Parse AI JSON Output",
      "type": "n8n-nodes-base.code",
      "position": [
        1024,
        0
      ],
      "parameters": {
        "jsCode": "// OpenAI output comes as string in $json.text\nconst raw = $json[\"text\"];\n\n// Parse safely\nlet parsed;\ntry {\n  parsed = JSON.parse(raw);\n} catch (e) {\n  throw new Error(\"Invalid JSON returned by OpenAI: \" + raw);\n}\n\nreturn parsed;\n"
      },
      "typeVersion": 2
    },
    {
      "id": "1174cddb-9bf5-4582-a7ba-aed412336b7f",
      "name": "Calculate Weighted Quality Score",
      "type": "n8n-nodes-base.code",
      "position": [
        1232,
        0
      ],
      "parameters": {
        "jsCode": "// Input = parsed JSON from AI\nconst data = $json;\n\n// Weights (can be adjusted or moved to Config sheet later)\nconst weights = {\n  specificity: 0.35,\n  structure: 0.15,\n  bias_free_language: 0.15,\n  actionability: 0.10,\n  depth: 0.25,\n};\n\n// \u2705 Fallback for structure (AI might send structure or structure_star)\nconst structureValue = data.structure ?? data.structure_star ?? 0;\n\n// Calculate weighted score safely\nlet total = (\n  (data.specificity * weights.specificity) +\n  (structureValue * weights.structure) +\n  (data.bias_free_language * weights.bias_free_language) +\n  (data.actionability * weights.actionability) +\n  (data.depth * weights.depth)\n) / (\n  weights.specificity +\n  weights.structure +\n  weights.bias_free_language +\n  weights.actionability +\n  weights.depth\n);\n\n// Scale to 0\u2013100\ntotal = Math.round(total * 20);\n\n// Flags\nconst flags = [];\nif ((data.specificity ?? 0) < 3 || (data.depth ?? 0) < 3) {\n  flags.push(\"low_detail\");\n}\nif ((data.bias_free_language ?? 0) < 3) {\n  flags.push(\"bias\");\n}\n\n// Format vague phrases if they exist\nlet vagueFormatted = \"\";\nif (Array.isArray(data.vague_phrases) && data.vague_phrases.length > 0) {\n  vagueFormatted = data.vague_phrases.map(p => `\u2022 ${p}`).join(\"\\n\");\n}\n\n// Return clean JSON\nreturn {\n  json: {\n    Score: total,\n    Flags: flags.join(\", \"),\n    LLM_JSON: JSON.stringify(data),\n    VaguePhrasesFormatted: vagueFormatted,   // for Slack message\n    row_number: $json.row_number,            // keep tracking the row\n    Role: $item(0).$node[\"Fetch Raw Feedback Data\"].json.Role,\n    Stage: $item(0).$node[\"Fetch Raw Feedback Data\"].json.Stage\n  }\n};\n"
      },
      "typeVersion": 2
    },
    {
      "id": "5d940fc3-8727-4dc4-9a58-133ab5180f08",
      "name": "Save Scores to Spreadsheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1600,
        -208
      ],
      "parameters": {
        "columns": {
          "value": {
            "Flags": "={{ $json.Flags }}",
            "Score": "={{ $json.Score }}",
            "LLM_JSON": "={{ $json.LLM_JSON }}",
            "row_number": "={{ $('Fetch Raw Feedback Data').item.json.row_number }}"
          },
          "schema": [
            {
              "id": "Timestamp",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Timestamp",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Candidate_ID",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Candidate_ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Role",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Role",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Stage",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Stage",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Interviewer_Email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Interviewer_Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Feedback_Text",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Feedback_Text",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Flags",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Flags",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "LLM_JSON",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "LLM_JSON",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "row_number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 315277036,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit#gid=315277036",
          "cachedResultName": "Raw_Feedback"
        },
        "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,
      "alwaysOutputData": true
    },
    {
      "id": "40df551b-4ca7-4268-a1fe-4ebb01fd304f",
      "name": "Send Feedback Summary to Interviewer",
      "type": "n8n-nodes-base.slack",
      "position": [
        1616,
        0
      ],
      "parameters": {
        "text": "=:mag: *Interview Feedback Audit*\n\n*Role:* {{ $json[\"Role\"] }}\n*Stage:* {{ $json[\"Stage\"] }}\n\n:bar_chart: *Score:* {{ $json[\"Score\"] }}/100  \n:warning: *Flags:* {{ $json[\"Flags\"] || \"none\" }}\n\n{{ $json[\"VaguePhrasesFormatted\"] ? \n    (\"_We noticed vague or incomplete feedback. Examples:_\\n\" + $json[\"VaguePhrasesFormatted\"] + \n    \"\\n\\n_To improve: try being more specific and evidence-based (e.g., STAR method)._\") \n    : \n    \"_\u2705 Great job! Your feedback was specific, structured, and bias-free._\" \n}}\n\nKeep it up \u2014 your detailed notes help us make fairer hiring decisions \ud83d\ude80\n\n_Automated with this n8n workflow_\n",
        "user": {
          "__rl": true,
          "mode": "list",
          "value": "U09HMPVD466",
          "cachedResultName": "newscctv22"
        },
        "select": "user",
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "de2e5d93-df58-41ef-a22f-e7a681308a64",
      "name": "Check if Training Needed",
      "type": "n8n-nodes-base.if",
      "position": [
        1776,
        288
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "62f94225-d1b6-42a0-a3e9-7afceb9b937d",
              "operator": {
                "type": "number",
                "operation": "lt"
              },
              "leftValue": "={{$json[\"Score\"]}}",
              "rightValue": 50
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "49b80e52-27d3-455d-8082-e3e0f2365a69",
      "name": "Send Training Recommendations",
      "type": "n8n-nodes-base.slack",
      "position": [
        2064,
        272
      ],
      "parameters": {
        "text": "=:books: *Training Recommendation*\n\nYour interview feedback for **{{$json[\"Role\"]}} ({{$json[\"Stage\"]}})** was reviewed.\n\n\ud83d\udcca **Score:** {{$json[\"Score\"]}}/100  \n\u26a0\ufe0f **Flags:** {{$json[\"Flags\"] || \"none\"}}  \n\nWe noticed vague or incomplete feedback. Here are some examples:  \n{{  $json.VaguePhrasesFormatted }}\n\nTo improve: try using structured, evidence-based feedback (e.g., STAR method).  \n\n\ud83d\udc49 Helpful resources:  \n\ud83d\udcd8 [STAR Method Guide](https://example.com/star-training)  \n\ud83c\udfa5 [Bias-Free Interviewing Video](https://example.com/interview-bias)  \n\nYour detailed notes help us make fairer hiring decisions \ud83d\ude80\n",
        "user": {
          "__rl": true,
          "mode": "list",
          "value": "U09HMPVD466",
          "cachedResultName": "newscctv22"
        },
        "select": "user",
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "48988700-46e2-4464-87a5-99054d6e9cbc",
      "name": "Log AI Errors",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        944,
        304
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "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.7
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "e2d8cf56-20c5-4e9a-9d03-d8b8536128fe",
  "connections": {
    "Parse AI JSON Output": {
      "main": [
        [
          {
            "node": "Calculate Weighted Quality Score",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate AI Response": {
      "main": [
        [
          {
            "node": "Parse AI JSON Output",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Log AI Errors",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Raw Feedback Data": {
      "main": [
        [
          {
            "node": "Analyze Feedback Quality",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze Feedback Quality": {
      "main": [
        [
          {
            "node": "Validate AI Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if Training Needed": {
      "main": [
        [
          {
            "node": "Send Training Recommendations",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save Scores to Spreadsheet": {
      "main": [
        []
      ]
    },
    "AI Quality Evaluator (GPT-4o1": {
      "ai_languageModel": [
        [
          {
            "node": "Analyze Feedback Quality",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Calculate Weighted Quality Score": {
      "main": [
        [
          {
            "node": "Send Feedback Summary to Interviewer",
            "type": "main",
            "index": 0
          },
          {
            "node": "Save Scores to Spreadsheet",
            "type": "main",
            "index": 0
          },
          {
            "node": "Check if Training Needed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Fetch Raw Feedback Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

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

Pro

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

About this workflow

This workflow automates the evaluation of interviewer feedback using AI. It retrieves raw notes from Google Sheets, processes them through GPT-4o-mini for structured scoring, validates outputs, and calculates weighted quality scores. The system provides real-time Slack feedback…

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

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

This end-to-end AI-powered recruitment automation workflow helps HR and talent acquisition teams automate the complete hiring pipeline—from resume intake and parsing to GPT-4-based evaluation, TA appr

Form Trigger, Output Parser Structured, Google Drive +10
AI & RAG

This workflow automates the candidate rejection process after interviews. It retrieves interview feedback from Google Sheets, uses AI to structure and score candidate data, applies a scoring threshold

Google Sheets, ClickUp, Chain Llm +2
AI & RAG

Automate your lead intake, scoring, and outreach pipeline. This workflow collects leads from forms, enriches and scores them using Relevance AI, routes them by quality, and triggers the right follow-u

Form Trigger, HTTP Request, Chain Llm +6
AI & RAG

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

Gmail Trigger, Slack, Output Parser Structured +4
AI & RAG

This workflow turns your sales calls + intake form into a polished, send-ready proposal. It pulls the latest call transcript from Fireflies, generates structured proposal content with Azure OpenAI, bu

Form Trigger, Chain Llm, Lm Chat Azure Open Ai +5