AutomationFlowsAI & RAG › Run Hr Interview Agent with Trugen, Openai, and Google Sheets

Run Hr Interview Agent with Trugen, Openai, and Google Sheets

ByTruGen.AI @trugenai on n8n.io

This workflow creates a TruGen.ai interview agent from a pasted job description, saves the agent and interview link to Google Sheets, then receives call-ended webhook to fetch the interview transcript, analyze it with OpenAI, and log structured candidate evaluation results back…

Event trigger★★★★☆ complexityAI-powered22 nodesGoogle SheetsOpenAIN8N Nodes Trugen
AI & RAG Trigger: Event Nodes: 22 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Google Sheets → OpenAI 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": "CxWyZoQ2r8Tdufg0",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Trugen's HR Interview Agent",
  "tags": [],
  "nodes": [
    {
      "id": "fcb9bce9-8f31-4613-beee-53168e4832c5",
      "name": "Main Overview Sticky",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1120,
        64
      ],
      "parameters": {
        "width": 544,
        "height": 672,
        "content": "## HR Interview Video AI Agent\n\nThis workflow automates the **End-to-End Interview Process**. It allows you to create an AI interviewer based on a job description, capture candidate responses, and perform a deep AI-driven evaluation.\n\n### ## How it works\n1. **Setup**: Paste your Job Description and click \"Start Setup\" to create a custom Trugen agent.\n2. **Interaction**: Candidates call the agent link. Their conversation is transcribed in real-time.\n3. **Evaluation**: When the call ends, the transcript is sent back via Webhook for structured AI analysis.\n4. **Archive**: Results (Fit Score, Strengths, Concerns) are logged in Google Sheets.\n\n### ## Setup steps\n1. **Job Description**: Paste your requirements into the `\ud83d\udcdd Your Job Description` node.\n2. **Initialize**: Click the Manual Trigger node to create your agent.\n3. **Google Auth**: Connect your \"Google Sheets\" account to save links and results.\n4. **Webhook**: Copy the Webhook URL to your Trugen Agent's 'Callback URL' settings.\n\n### ## Requirements\n- OpenAI API Details\n- Google Workspace Access\n- Trugen API Key"
      },
      "typeVersion": 1
    },
    {
      "id": "eefba234-49c4-4338-bc7f-45e75383fa62",
      "name": "\ud83d\udcdd Your Job Description",
      "type": "n8n-nodes-base.code",
      "position": [
        336,
        80
      ],
      "parameters": {
        "jsCode": "// ========== PASTE YOUR JOB DESCRIPTION HERE ==========\n// Simply paste your entire job posting between the quotes below\n// Include everything: job title, company name, requirements, etc.\n\nconst jobDescription = `\nProduct Marketing Manager \u2013 TruGen.ai\n\nTruGen.ai is redefining human-computer interaction with hyper-realistic, emotionally intelligent digital communication agents that deliver human-like, real-time conversations at scale. Our proprietary AI technology powers next-generation customer support, sales, HR, and training experiences for leading brands worldwide. We are seeking a dynamic Product Marketing Manager to drive the go-to-market strategy and accelerate adoption of our cutting-edge platform.\n\nResponsibilities\nDevelop and execute go-to-market strategies for new and existing TruGen.ai products, with a focus on driving demand, adoption, and customer engagement.\n\nCraft compelling product positioning and messaging that differentiates our conversational agents and platform in the market.\n\nConduct market, competitor, and user research to identify trends, customer needs, and growth opportunities.\n\nBuild and maintain detailed buyer personas to guide targeted marketing and sales initiatives.\n\nCollaborate closely with product, engineering, and sales teams to align on product vision, roadmap, and feature launches.\n\nLead cross-functional product launches, including launch planning, sales enablement, and campaign execution.\n\nCreate and manage marketing collateral, demos, website content, case studies, and sales tools that clearly communicate product value.\n\nGather and analyze customer feedback and campaign performance data to optimize messaging and marketing programs.\n\nSupport the sales team with training, product presentations, and competitive insights to drive conversions and upsells.\n\nRepresent TruGen.ai at industry events, webinars, and customer meetings as a product evangelist.\n\nRequirements\n4+ years of experience in product marketing, preferably in B2B SaaS, AI, or related technology sectors.\n\nProven track record of launching and scaling innovative technology products, ideally in AI, conversational platforms, or digital agents.\n\nDeep understanding of go-to-market strategies, product positioning, and value-based messaging.\n\nExceptional written and verbal communication skills, including copywriting and storytelling.\n\nStrong analytical skills with experience in market research, data analysis, and campaign optimization.\n\nDemonstrated ability to influence and collaborate with cross-functional teams without direct authority.\n\nExperience supporting sales teams with enablement materials and training.\n\nBachelor\u2019s degree in marketing, business, or a related field; advanced degree a plus.\n\nPassion for emerging technologies, AI, and shaping the future of human-computer interaction.\n\nWhy TruGen.ai?\nJoin a visionary, fast-growing team with deep expertise in AI and conversational agent technology.\n\nShape the future of digital communication and help global brands deliver human-like experiences at scale.\n\nWork with a collaborative, mission-driven team backed by proven founders and industry leaders.\n\nCompetitive compensation, flexible work environment, and opportunities for rapid career growth.\n\nReady to help define the future of human-AI interaction? Apply now and join TruGen.ai!\n`;\n\n// Don't change anything below this line\nreturn [{\n  json: {\n    jobDescription: jobDescription.trim(),\n    timestamp: new Date().toISOString()\n  }\n}];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "69e068c3-80f3-4b2c-83f7-1ee32836a41e",
      "name": "\u25b6\ufe0f Click to Start Setup",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        112,
        80
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "5ad060e1-ecaa-47d3-91a6-966f7a9f124e",
      "name": "Prepare Interview Agent",
      "type": "n8n-nodes-base.set",
      "position": [
        592,
        80
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "7865fb06-18cf-4a2e-93a7-45e86c7ccada",
              "name": "avatarId",
              "type": "string",
              "value": "60a0926a"
            },
            {
              "id": "b1dce28c-eea1-42bb-9d51-39462d7cea1a",
              "name": "agentName",
              "type": "string",
              "value": "=HR Interview Bot "
            },
            {
              "id": "46f927ce-40b6-4121-b956-e8ee9b0481b1",
              "name": "welcomeMessage",
              "type": "string",
              "value": "Hello! Welcome to our interview. I'm excited to learn about your background and discuss this opportunity with you.   Let's start with you telling me a bit about yourself and what interests you about this position."
            },
            {
              "id": "b5fcf2ac-705d-49c9-84c9-287b20e8b4cb",
              "name": "systemPrompt",
              "type": "string",
              "value": "=You are a professional HR interviewer conducting job interviews. Your goal is to assess candidates thoroughly while making them feel comfortable and valued.  Job Description: {{ $json.jobDescription }} Interview Approach: - Start with a warm welcome and brief introduction - Ask about their interest in the role and company - Explore their relevant experience with specific examples - Assess technical skills and cultural fit - Allow time for their questions - Close professionally with next steps  Be conversational, ask follow-up questions, and show genuine interest in their responses. If they seem nervous, help them feel at ease. Always maintain a professional yet friendly tone."
            },
            {
              "id": "715849ae-8722-40c3-a093-bcc54699e483",
              "name": "jobDescription",
              "type": "string",
              "value": "={{$input.first().json.jobDescription}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "527fe0b6-5081-4210-8e34-fd7ca5501762",
      "name": "Save Agent Info",
      "type": "n8n-nodes-base.code",
      "position": [
        1120,
        80
      ],
      "parameters": {
        "jsCode": "const workflowStaticData = $getWorkflowStaticData('global');\n\n\n\nconst agentId = $input.first().json.id;\nconst interviewLink = $input.first().json.call_link;\nconst jobDescription = $('Prepare Interview Agent').first().json.jobDescription;\n\nworkflowStaticData.agentId = agentId;\nworkflowStaticData.jobDescription = jobDescription;\nworkflowStaticData.interviewLink = interviewLink;\n\n\n\nreturn [{\n  json: {\n    \"Agent ID\": workflowStaticData.agentId,\n    \"Agent Name\":$('Prepare Interview Agent').first().json.agentName,\n    \"Interview Link\": interviewLink,\n    \"Job Description\": workflowStaticData.jobDescription,\n    \"System Prompt\": $('Prepare Interview Agent').first().json.systemPrompt,\n    \"Welcome Message\": $('Prepare Interview Agent').first().json.welcomeMessage\n    \n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "bd640ee0-379e-4974-a825-b0eb66b80f8e",
      "name": "Save to Google Sheets1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1520,
        80
      ],
      "parameters": {
        "columns": {
          "value": {
            "Agent ID": "={{ $json['Agent ID'] }}",
            "Agent Name": "={{ $json['Agent Name'] }}",
            "System Prompt": "={{ $json['System Prompt'] }}",
            "Interview Link": "={{ $json['Interview Link'] }}",
            "Job Description": "={{ $json['Job Description'] }}",
            "Welcome Message": "={{ $json['Welcome Message'] }}"
          },
          "schema": [
            {
              "id": "Agent ID",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Agent ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Agent Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Agent Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Interview Link",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Interview Link",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Job Description",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Job Description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "System Prompt",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "System Prompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Welcome Message",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Welcome Message",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1130239116,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1nF0fW0HLMqCAgH0O9CcmCkH6_eKOFTi8sQxHG6hFecs/edit#gid=1130239116",
          "cachedResultName": "Interview Agents"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1nF0fW0HLMqCAgH0O9CcmCkH6_eKOFTi8sQxHG6hFecs",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1nF0fW0HLMqCAgH0O9CcmCkH6_eKOFTi8sQxHG6hFecs/edit?usp=drivesdk",
          "cachedResultName": "n8n sid"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "5fa0c4ea-be14-4def-9bed-8ddffff45313",
      "name": "Analyze Interview",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        848,
        960
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "id",
          "value": "gpt-4o-mini"
        },
        "options": {
          "temperature": 0.3
        },
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "=You are an AI interviewer evaluator with expertise in assessing candidates across technical, behavioral, and strategic competencies.\n\nAnalyze the completed interview conversation below and produce a comprehensive hiring assessment.\n\nJob Context:\n{{ $json.job_context || 'This is a role-related interview focused on product positioning, go-to-market strategy, communication skills, and relevant domain expertise.' }}\n\nRole Details:\n- Position: {{ $json.role_title || 'Not specified' }}\n- Department: {{ $json.department || 'Not specified' }}\n- Level: {{ $json.level || 'Not specified' }}\n\nCandidate Name:\n{{ $json.user_name || 'Unknown' }}\n\nCandidate ID:\n{{ $json.user_id || 'N/A' }}\n\nConversation ID:\n{{ $json.conversation_id || $json.id || 'N/A' }}\n\nInterview Transcript:\n{{ \n  ($json.transcript || [])\n    .map(t => `[${t.message_timestamp || t.timestamp || 'N/A'}] ${t.role?.toUpperCase() || 'UNKNOWN'}: ${t.content || ''}`)\n    .join('\\n')\n}}\n\n---\n\n## Evaluation Framework\n\n### Core Competencies (Assess each):\n\n1. **Role Understanding** (0-100)\n   - Grasp of position requirements and responsibilities\n   - Industry and domain knowledge relevance\n   - Alignment between experience and role expectations\n   - Understanding of key success factors\n\n2. **Communication Clarity** (0-100)\n   - Articulation quality and coherence\n   - Completeness of responses\n   - Grammar and vocabulary appropriateness\n   - Ability to structure thoughts logically\n   - Response to follow-up questions\n\n3. **Strategic Thinking** (0-100)\n   - Problem-solving approach and methodology\n   - Use of frameworks or structured thinking\n   - Long-term vision and planning\n   - Ability to connect tactical actions to strategic goals\n   - Market and competitive awareness\n\n4. **Relevance of Examples** (0-100)\n   - Quality and specificity of past experience examples\n   - Applicability to the role requirements\n   - Evidence of impact and outcomes\n   - Use of metrics and quantifiable results\n   - Ownership and accountability demonstrated\n\n5. **Depth of Answers** (0-100)\n   - Substantive vs. superficial responses\n   - Level of detail and elaboration\n   - Proactive expansion on topics\n   - Technical or domain-specific depth\n   - Follow-through on questions asked\n\n6. **Confidence & Coherence** (0-100)\n   - Self-assurance without arrogance\n   - Consistency across responses\n   - Logical flow of ideas\n   - Handling of difficult questions\n   - Energy and engagement level\n\n7. **Analytical & Data Skills** (0-100)\n   - Data-driven decision making\n   - Metrics and measurement understanding\n   - Problem decomposition ability\n   - Evidence of analytical rigor\n\n8. **Collaboration & Leadership** (0-100)\n   - Cross-functional teamwork examples\n   - Stakeholder management capability\n   - Influence without authority\n   - Conflict resolution and negotiation\n\n### Critical Assessment Factors\n\n**Red Flags to Identify:**\n- Incomplete, fragmented, or incoherent responses\n- Inability to provide specific examples when directly asked\n- Vague or evasive answers to direct questions\n- Lack of metrics, data, or measurable outcomes\n- Significant communication issues despite claimed senior experience\n- Inconsistencies or contradictions in stated experience\n- Minimal responses like \"Go on\" or \"Yes\" without elaboration\n- Repetitive phrases without adding substance\n- Avoiding ownership or accountability\n- Negative attitude or blame-shifting\n\n**Positive Indicators:**\n- Specific, quantifiable examples with clear outcomes\n- Structured responses (STAR method, frameworks)\n- Unprompted elaboration on complex topics\n- Questions demonstrating strategic thinking\n- Evidence of learning from failures\n- Clear articulation of impact and ownership\n- Natural use of metrics and data\n- Collaborative mindset with appropriate confidence\n- Enthusiasm and genuine interest in role\n\n### Scoring Calibration\n\n**Fit Score Ranges (0-100):**\n- **90-100**: Exceptional - Strong Hire\n  - Exceeds requirements significantly\n  - Immediate high impact expected\n  - Minimal onboarding needed\n  - Clear culture fit\n\n- **75-89**: Strong Candidate - Hire\n  - Meets or exceeds most requirements\n  - High confidence in success\n  - Normal onboarding expected\n  - Good culture fit\n\n- **60-74**: Good Candidate - Hire with Reservations\n  - Meets core requirements\n  - Some development areas identified\n  - May need additional support\n  - Acceptable culture fit\n\n- **45-59**: Borderline - Requires Additional Evaluation\n  - Mixed signals on key requirements\n  - Significant concerns exist\n  - Additional interviews recommended\n  - Unclear culture fit\n\n- **Below 45**: Weak Candidate - Reject\n  - Does not meet minimum requirements\n  - Multiple critical gaps\n  - High risk of failure\n  - Poor culture fit\n\n**Recommendation Types:**\n- **strong_hire**: Exceptional fit, compete aggressively to secure\n- **hire**: Good fit, extend offer with standard terms\n- **borderline**: Mixed, conduct additional evaluation before decision\n- **reject**: Insufficient fit, decline to move forward\n\n---\n\n## Output Requirements\n\nReturn ONLY valid JSON with NO markdown, NO code fences, NO explanations.\n\n**Required JSON Structure:**\n\n{\n  \"candidateName\": \"{{ $json.user_name || 'Unknown' }}\",\n  \"candidateId\": \"{{ $json.user_id || 'N/A' }}\",\n  \"conversationId\": \"{{ $json.conversation_id || $json.id || 'N/A' }}\",\n  \"roleAppliedFor\": \"string - extract from context\",\n  \"interviewDate\": \"string - extract from timestamps\",\n  \"interviewDuration\": \"string - calculate from first to last timestamp\",\n  \"fitScore\": 0-100,\n  \"recommendation\": \"strong_hire | hire | borderline | reject\",\n  \"confidenceLevel\": \"high | medium | low\",\n  \"competencyScores\": {\n    \"roleUnderstanding\": 0-100,\n    \"communicationClarity\": 0-100,\n    \"strategicThinking\": 0-100,\n    \"relevanceOfExamples\": 0-100,\n    \"depthOfAnswers\": 0-100,\n    \"confidenceCoherence\": 0-100,\n    \"analyticalSkills\": 0-100,\n    \"collaborationLeadership\": 0-100\n  },\n  \"strengths\": [\n    \"Specific strength with supporting evidence from transcript - include quote or example\",\n    \"Another strength with concrete evidence\"\n  ],\n  \"concerns\": [\n    \"Specific concern with supporting evidence from transcript - include quote or example\",\n    \"Another concern with concrete evidence\"\n  ],\n  \"redFlags\": [\n    \"Critical issue with evidence (only if severe concerns exist)\"\n  ],\n  \"summary\": \"2-3 sentence balanced, concise assessment that synthesizes overall findings and compares candidate against role requirements. Must be objective and evidence-based.\",\n  \"detailedAnalysis\": {\n    \"communicationQuality\": \"string - detailed assessment with examples from transcript\",\n    \"experienceDepth\": \"string - evaluation of past experience relevance and depth\",\n    \"strategicCapability\": \"string - analysis of strategic thinking with examples\",\n    \"technicalKnowledge\": \"string - assessment of domain/technical expertise\",\n    \"culturalFit\": \"string - evaluation based on values, attitude, and approach\"\n  },\n  \"keyQuotes\": [\n    {\n      \"quote\": \"Exact verbatim quote from candidate\",\n      \"context\": \"What question/topic this was addressing\",\n      \"analysis\": \"What this quote reveals about the candidate\",\n      \"impact\": \"positive | neutral | negative\"\n    }\n  ],\n  \"gapsIdentified\": [\n    \"Specific skill/knowledge gap with explanation and evidence\"\n  ],\n  \"hiringRisk\": \"low | medium | high\",\n  \"riskFactors\": [\n    \"Specific risk factor with explanation and potential mitigation\"\n  ],\n  \"developmentAreas\": [\n    \"Area where candidate would need support/training if hired\"\n  ],\n  \"nextSteps\": [\n    \"Specific, actionable recommendation for hiring process\",\n    \"Another concrete next step\"\n  ],\n  \"comparisonToBenchmark\": \"string - how candidate compares to typical successful hires for this role level and function\",\n  \"interviewQuality\": \"string - assessment of interview depth, candidate engagement, and data quality for decision-making\"\n}\n\n---\n\n## Critical Rules - MUST FOLLOW\n\n### Objectivity & Evidence Standards:\n1. \u2705 **Evidence-Based ONLY**: Base ALL assessments exclusively on actual transcript content\n2. \u2705 **No Assumptions**: Never invent facts, assume capabilities, or fill gaps with speculation\n3. \u2705 **No Hallucinations**: Do not reference information not present in the transcript\n4. \u2705 **Quote Accuracy**: All quotes must be verbatim from the transcript\n5. \u2705 **Balanced Assessment**: Identify both strengths AND weaknesses fairly\n6. \u2705 **Context Awareness**: Consider role level (junior/mid/senior) in setting expectations\n7. \u2705 **Pattern Recognition**: Look for consistency or inconsistency across multiple responses\n8. \u2705 **Incomplete = Red Flag**: Note when answers are incomplete, vague, or avoid the question\n\n### Scoring Integrity:\n- Fit score must be mathematically justified by competency scores\n- Higher scores (75+) require multiple strong examples and clear evidence\n- Lower scores (below 60) require specific concerns and gaps\n- Borderline scores (55-70) must explain mixed signals clearly\n- Do not inflate scores based on claimed experience alone - evaluate actual demonstrated capability\n\n### Response Quality:\n- Summary must be 2-3 sentences, not longer\n- Strengths must include specific evidence/quotes\n- Concerns must include specific evidence/quotes\n- All assessments must tie back to actual transcript content\n- Use professional, objective language without bias\n- Avoid generic statements - be specific and evidence-based\n\n### Output Format:\n- Return ONLY pure JSON\n- NO markdown formatting\n- NO code fence blocks (```)\n- NO explanatory text before or after JSON\n- NO comments in JSON\n- Ensure valid JSON syntax (proper quotes, commas, brackets)\n- Test JSON validity before returning\n\n---\n\nNow analyze the interview transcript provided above and return your evaluation in the exact JSON format specified."
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "id": "8a630553-ff05-424d-8831-27d3db5b0bd1",
      "name": "Format for Sheets",
      "type": "n8n-nodes-base.code",
      "position": [
        1440,
        960
      ],
      "parameters": {
        "jsCode": "// ===============================\n// Parse AI analysis output\n// ===============================\nconst aiOutput = $input.first().json.message.content;\n\n// Convert from string to JSON\nlet analysis;\ntry {\n  analysis = JSON.parse(aiOutput);\n} catch (err) {\n  throw new Error('Failed to parse LLM output: ' + err.message);\n}\n\n// ===============================\n// Extract metadata from the AI output itself\n// ===============================\nconst candidateName = analysis.candidateName || 'Unknown';\nconst candidateId = analysis.candidateId || 'N/A';\nconst conversationId = analysis.conversationId || $json.conversation_id || $json.id || 'N/A';\nconst callLink = $json.call_link || 'N/A';\nconst interviewDate = $now.toFormat('dd.MM.yyyy');\nconst duration = $json.duration_minutes || 'N/A';\n\n// ===============================\n// Format output for Google Sheets\n// ===============================\nreturn [{\n  json: {\n    \"Candidate Name\": candidateName,\n    \"Candidate ID\": candidateId,\n    \"Conversation ID\": conversationId,\n    \"Interview Date\": interviewDate,\n    \"Duration (minutes)\": duration,\n    \"Fit Score\": analysis.fitScore || '',\n    \"Recommendation\": analysis.recommendation || '',\n    \"Strengths\": analysis.strengths?.join(\"; \") || '',\n    \"Concerns\": analysis.concerns?.join(\"; \") || '',\n    \"Summary\": analysis.summary || '',\n    \"Next Steps\": analysis.nextSteps?.join(\"; \") || '',\n    \"Call ID\": callLink,\n    \"Analyzed On\": $now.toISO(),\n  }\n}];\n"
      },
      "typeVersion": 2,
      "alwaysOutputData": true
    },
    {
      "id": "550fc48b-395d-4687-a66f-2dadfd4c4d67",
      "name": "Save to Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1696,
        960
      ],
      "parameters": {
        "columns": {
          "value": {
            "Summary": "={{ $json.Summary }}",
            "Concerns": "={{ $json.Concerns }}",
            "Fit Score": "={{ $json['Fit Score'] }}",
            "Strengths": "={{ $json.Strengths }}",
            "Next Steps": "={{ $json['Next Steps'] }}",
            "Analyzed On": "={{ $json['Analyzed On'] }}",
            "Candidate Name": "={{ $json['Candidate Name'] }}",
            "Interview Date": "={{ $json['Interview Date'] }}",
            "Recommendation": "={{ $json.Recommendation }}"
          },
          "schema": [
            {
              "id": "Candidate Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Candidate Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Interview Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Interview Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Fit Score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Fit Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Recommendation",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Recommendation",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Strengths",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Strengths",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Concerns",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Concerns",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Summary",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Summary",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Next Steps",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Next Steps",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Analyzed On",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Analyzed On",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1941360756,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1nF0fW0HLMqCAgH0O9CcmCkH6_eKOFTi8sQxHG6hFecs/edit#gid=1941360756",
          "cachedResultName": "Interview Results"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1nF0fW0HLMqCAgH0O9CcmCkH6_eKOFTi8sQxHG6hFecs",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1nF0fW0HLMqCAgH0O9CcmCkH6_eKOFTi8sQxHG6hFecs/edit?usp=drivesdk",
          "cachedResultName": "n8n sid"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "881ea4f6-07e2-4e9f-91fd-434835bb0e59",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        176,
        960
      ],
      "parameters": {
        "path": "a5b6faad-8f40-4639-8a10-af4d939c88e3",
        "options": {},
        "httpMethod": "POST",
        "responseData": "allEntries",
        "responseMode": "lastNode"
      },
      "typeVersion": 2.1
    },
    {
      "id": "b335ae39-5ea7-4160-a85e-a55e694720d2",
      "name": "Job Description Instructions",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        64,
        -272
      ],
      "parameters": {
        "color": 5,
        "width": 432,
        "height": 520,
        "content": "## \ud83d\udfe2 Step 1: Add Your Job Description\n\n**Simply paste your complete job posting in the job description node**\n\nInclude:\n- Job title\n- Company name\n- Responsibilities\n- Requirements\n- Any other relevant details\n\nThe AI will understand everything from your text!"
      },
      "typeVersion": 1
    },
    {
      "id": "f2faf5fe-1349-494b-b60d-8238a394df2d",
      "name": "Setup Instructions",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        -176
      ],
      "parameters": {
        "color": 7,
        "width": 478,
        "height": 424,
        "content": "## \ud83d\udd35 Step 2: Create Your Interview Agent\n\n**Click the button below to:**\n1. Create your AI interviewer\n2. Get your interview link\n\nThis only needs to be done ONCE!"
      },
      "typeVersion": 1
    },
    {
      "id": "513eb880-d886-4c0d-8907-f8ff98d3ce62",
      "name": "Success!",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1008,
        -160
      ],
      "parameters": {
        "color": 2,
        "width": 331,
        "height": 408,
        "content": "## \u2705 Setup Complete!\n\n**Your interview link:**\n`https://app.trugen.ai/agent/[agent-id]`\n\n \nThis step will now setup our agent id and job description which is now automatically passed and used by webhook."
      },
      "typeVersion": 1
    },
    {
      "id": "fec1100a-3d07-43a2-a89a-5285f8927856",
      "name": "Sheet Headers",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1360,
        -208
      ],
      "parameters": {
        "color": 6,
        "width": 444,
        "height": 520,
        "content": "## \ud83d\udcca Google Sheets Setup\n\n**Quick Start**:\n1. Copy our template sheet:  https://docs.google.com/spreadsheets/d/1_hqZsoN92-F7teX5sBkvb-BJ8U_6jTsJP90hOQKUE4c/edit?usp=sharing\n2. Connect your account credential in the node.\n3. Update the Google Sheets node with your new document and select **'Interview Agents'**  sheet\n (if not automatically set)\n3. You will get interview link in this sheet which you can share with candidates and start interviewing\n\n**Connect your Google Sheets here \u2192**"
      },
      "typeVersion": 1
    },
    {
      "id": "7353ef50-b7de-404a-8e9d-a35f7eaaa536",
      "name": "Automated Analysis",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        112,
        688
      ],
      "parameters": {
        "color": 6,
        "width": 488,
        "height": 444,
        "content": "## \ud83d\udfe3 Step 3: Automated Interview Analysis\n\n**This section runs automatically to:**\n- Receive completed interviews\n- Analyze candidate responses\n- Save results to Google Sheets\n\n**Before activating:**  \nMake sure to configure the webhook URL in the **Create Agents \u2192 Callback URL** settings and set the **Callback Event** to **Call Ended**.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "a3116100-b91d-4b58-9d1f-f9b40be41770",
      "name": "Processing Steps",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        624,
        304
      ],
      "parameters": {
        "color": 4,
        "width": 684,
        "height": 844,
        "content": "## \ud83d\udd0d Interview Processing & AI Evaluation\n\nThis section performs an automated, in-depth assessment of completed interviews by:\n\n1. **Extracting Interview Data**  \n   - Captures candidate details, metadata, and the full interview transcript from completed conversations.\n\n2. **AI Interview Evaluation**  \n   - Analyzes candidate responses across technical, behavioral, strategic, and role-specific competencies using a structured evaluation framework.\n\n3. **Structured Assessment Output**  \n   - Generates a detailed, evidence-based hiring assessment in a strict JSON format for downstream processing, storage, or review.\n\n### The AI evaluation includes:\n- Overall fit score (0\u2013100)\n- Hiring recommendation (strong_hire, hire, borderline, reject)\n- Competency-wise scores (communication, strategy, role understanding, etc.)\n- Key strengths with supporting evidence from the transcript\n- Concerns, gaps, and red flags (if any), backed by quotes\n- Risk assessment and confidence level\n- Suggested next steps in the hiring process\n- Concise executive summary and detailed analysis sections\n\nThis automated analysis enables consistent, objective, and data-driven hiring decisions by evaluating candidates strictly based on interview evidence, without assumptions or bias.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "c6bd2441-d3c0-450a-afc2-a4553e4ced00",
      "name": "Sheet Headers1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1376,
        752
      ],
      "parameters": {
        "color": 6,
        "width": 480,
        "height": 364,
        "content": "## \ud83d\udcca Google Sheets Connection\n\n**Quick Start**:\n1. Use the same document but select **'Interview Results'**  sheet this time, the template includes all required columns!\n\n**Connect your Google Sheets here \u2192**"
      },
      "typeVersion": 1
    },
    {
      "id": "43352c50-b4a3-48ce-a121-ab6334fd3e1c",
      "name": "Important!",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -512,
        -32
      ],
      "parameters": {
        "color": 3,
        "width": 516,
        "height": 932,
        "content": "## \u26a0\ufe0f Important Notes\n\n### 1. API Key Setup\nTo use this workflow, you must first generate an API key from the dashboard:  \nhttps://app.trugen.ai/dashboard/home  \n\nAdd this API key to the relevant credential or environment configuration before running the workflow.\n\n### 2. Agent Creation & Identification\nEnsure the agent is successfully created during the setup flow. The generated **Agent ID** is stored and reused throughout the workflow for interview handling and analysis.\n\n### 3. Run the Setup Flow at Least Once\nYou must run the setup flow at least once so that:\n- The agent information is created and saved\n- The connected Google Sheet contains the required initial structure and columns\n\nThis is required before interview results can be stored correctly.\n\n### 4. Webhook Configuration Is Mandatory\nBefore activating the interview analysis flow:\n- Configure the **Webhook URL** in **Create Agents \u2192 Callback URL**\n- Set the **Callback Event** to **Call Ended**\n\nWithout this configuration, completed interviews will not trigger automated analysis.\n\n### 5. Agent Selection Logic\nBy default, the workflow uses the **most recently created agent** from the setup step.\nIf you want to analyze interviews for a **specific agent**:\n- Manually copy the required Agent ID from the **Save Agent Info** node\n- Use it explicitly when fetching or filtering conversation data\n\nThis ensures analysis is performed on the intended agent only.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "977097c8-cfbd-4760-bd6e-cce9e6ec908f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -416,
        -160
      ],
      "parameters": {
        "color": 7,
        "width": 352,
        "height": 80,
        "content": "# SETUP FLOW ->"
      },
      "typeVersion": 1
    },
    {
      "id": "69b64a9b-da3f-433e-b480-81026123ec1e",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -432,
        960
      ],
      "parameters": {
        "color": 7,
        "width": 384,
        "height": 80,
        "content": "# INTERVIEW FLOW ->"
      },
      "typeVersion": 1
    },
    {
      "id": "a1351ae3-1c4f-4771-bc25-c6ac9a60acc5",
      "name": "TruGen",
      "type": "n8n-nodes-trugen.trugen",
      "position": [
        832,
        80
      ],
      "parameters": {
        "name": "={{ $json.agentName }}",
        "greeting": "={{ $json.welcomeMessage }}",
        "callback_url": "https://nailless-ungrainable-therese.ngrok-free.dev/webhook-test/a5b6faad-8f40-4639-8a10-af4d939c88e3",
        "system_prompt": "={{ $json.systemPrompt }}",
        "callback_events": [
          "call_ended"
        ],
        "maxSessionLengthMinutes": 5
      },
      "credentials": {
        "trugenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "243115dc-81a1-48ea-9872-4b7c0b4bb3f7",
      "name": "TruGen1",
      "type": "n8n-nodes-trugen.trugen",
      "position": [
        416,
        960
      ],
      "parameters": {
        "operation": "getConversation"
      },
      "credentials": {
        "trugenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "475ba5ea-1658-429e-9fe3-b78a12915ddd",
  "connections": {
    "TruGen": {
      "main": [
        [
          {
            "node": "Save Agent Info",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "TruGen1": {
      "main": [
        [
          {
            "node": "Analyze Interview",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "TruGen1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save Agent Info": {
      "main": [
        [
          {
            "node": "Save to Google Sheets1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze Interview": {
      "main": [
        [
          {
            "node": "Format for Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format for Sheets": {
      "main": [
        [
          {
            "node": "Save to Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Interview Agent": {
      "main": [
        [
          {
            "node": "TruGen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udcdd Your Job Description": {
      "main": [
        [
          {
            "node": "Prepare Interview Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u25b6\ufe0f Click to Start Setup": {
      "main": [
        [
          {
            "node": "\ud83d\udcdd Your Job Description",
            "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 creates a TruGen.ai interview agent from a pasted job description, saves the agent and interview link to Google Sheets, then receives call-ended webhook to fetch the interview transcript, analyze it with OpenAI, and log structured candidate evaluation results back…

Source: https://n8n.io/workflows/16033/ — 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

🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.

OpenAI, HTTP Request, Form Trigger +7
AI & RAG

BoomerBobBot.TP. Uses agent, telegramTrigger, telegram, memoryBufferWindow. Event-driven trigger; 95 nodes.

Agent, Telegram Trigger, Telegram +10
AI & RAG

Generate AI viral videos with NanoBanana & VEO3, shared on socials via Blotato 2. Uses @blotato/n8n-nodes-blotato, googleSheets, lmChatOpenAi, toolThink. Event-driven trigger; 94 nodes.

@Blotato/N8N Nodes Blotato, Google Sheets, OpenAI Chat +9
AI & RAG

Inbox Guardian. Uses gmailTrigger, lmChatOpenAi, agent, textClassifier. Event-driven trigger; 66 nodes.

Gmail Trigger, OpenAI Chat, Agent +12
AI & RAG

This template is designed for marketers, content creators, and e-commerce brands who want to automate the creation of professional ad videos at scale. It’s ideal for teams looking to generate consiste

Telegram, Telegram Trigger, Google Drive +8