AutomationFlowsAI & RAG › Personalize Candidate Feedback with Gpt-4o, Google Sheets & Gmail for Hr Teams

Personalize Candidate Feedback with Gpt-4o, Google Sheets & Gmail for Hr Teams

ByRahul Joshi @rahul08 on n8n.io

This workflow automates personalized candidate communication for both shortlisted and rejected applicants. It fetches candidate details, processes resumes, checks for errors, and uses GPT-4o to generate professional HTML emails. Shortlisted candidates receive congratulatory…

Event trigger★★★★☆ complexityAI-powered27 nodesGoogle SheetsGoogle DriveLm Chat Azure Open AiChain LlmGmail
AI & RAG Trigger: Event Nodes: 27 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Chainllm → 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 →

Download .json
{
  "id": "yJCeYlxqx7UUotqy",
  "name": "Skill Gap \u2192 Training Recommendation",
  "tags": [],
  "nodes": [
    {
      "id": "be44de54-9c31-45da-aac1-fae1dabef3bb",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        160,
        -112
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "b814bb56-45a5-470b-99c6-d86eee0a9c7b",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2160,
        336
      ],
      "parameters": {
        "width": 352,
        "height": 400,
        "content": "## \ud83d\ude4f Polite Rejection + Learning Plan  \n\n**Action:**  \n- Generates a professional HTML email for candidates who are not shortlisted.  \n\n**Description:**  \n- Politely communicates that the candidate won\u2019t move forward.  \n- Provides constructive value by highlighting skill gaps and linking to high-quality online courses.  \n- Encourages candidates to keep improving and reapply in the future.  \n- Differentiates the company by showing empathy and professionalism in rejection.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "d725ed44-7c21-4d2b-9438-7cdbfc72c4f6",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2720,
        -544
      ],
      "parameters": {
        "width": 304,
        "height": 368,
        "content": "## \ud83d\udce7 Candidate Mailer \u2013 Shortlisted  \n\n**Action:**  \n- Sends the congratulatory onboarding email created by the AI to the candidate\u2019s email address.  \n\n**Description:**  \n- Delivers positive news along with the personalized learning plan.  \n- Ensures shortlisted candidates receive actionable steps for onboarding.  \n- Maintains professionalism by sending emails via the company\u2019s Gmail integration.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "8dce4943-50d5-4e04-a087-3d137c12263b",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2144,
        -768
      ],
      "parameters": {
        "width": 400,
        "height": 352,
        "content": "## \ud83c\udf89 Congrats + Onboarding Plan  \n\n**Action:**  \n- Generates a warm, congratulatory HTML email for shortlisted candidates.  \n\n**Description:**  \n- Uses an encouraging and celebratory tone while providing practical learning recommendations.  \n- Includes identified skill gaps, recommended courses, and onboarding steps.  \n- Frames the plan as part of the candidate\u2019s onboarding journey, showing company investment in growth.  \n- Strengthens employer brand while motivating candidates.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "e7449bde-b1ca-4962-a2b7-c67a82e05342",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2176,
        -176
      ],
      "parameters": {
        "width": 480,
        "height": 272,
        "content": "## \ud83e\udd16 LLM Backend  \n\n**Action:**  \n- Provides access to the GPT-4o-mini model hosted on Azure OpenAI.  \n\n**Description:**  \n- Acts as the foundation for downstream LLM Chains.  \n- Powers both shortlisted and rejected communication flows.  \n- Ensures the AI can analyze resume data, compare it with JD requirements, and generate professional HTML-ready output.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "5570e85e-58b1-464e-a901-17ddb6870441",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1104,
        -576
      ],
      "parameters": {
        "width": 272,
        "height": 416,
        "content": "## \ud83d\udcc4 PDF \u2192 Text Extractor  \n\n**Action:**  \n- Extracts raw text content from the candidate\u2019s resume PDF.  \n\n**Description:**  \n- Unlocks crucial details such as education, skills, projects, and work history from the resume.  \n- Converts unstructured resume data into a usable format for AI-driven analysis.  \n- Without this step, the AI would be limited to only metadata from the sheet, reducing accuracy in gap detection.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "13bd06cb-af9f-43cc-b953-c197828c446d",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1088,
        320
      ],
      "parameters": {
        "height": 464,
        "content": "## \u26a0\ufe0f Error Logging  \n\n**Action:**  \n- Logs failed or empty resume downloads into a designated \u201cError Log\u201d Google Sheet.  \n\n**Description:**  \n- Provides visibility when resumes cannot be processed.  \n- Ensures HR teams can manually follow up with candidates or fix data entry issues.  \n- Prevents silent drops of candidates due to technical problems.  \n- Strengthens reliability of the overall workflow by documenting failures for audit and review.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "00e5b685-e037-4fe6-88fb-e09ddea4bfa0",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        784,
        48
      ],
      "parameters": {
        "width": 272,
        "height": 432,
        "content": "## \u2705/\u274c Resume File Check  \n\n**Action:**  \n- Validates whether the resume file was downloaded successfully.  \n\n**Description:**  \n- Prevents the workflow from breaking when the resume link is broken or file is empty.  \n- Ensures only valid resumes are passed for text extraction.  \n- If validation fails, the workflow redirects to the error logging branch for tracking.  \n- Adds resilience to the hiring process by catching and managing errors early.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "10876e91-a0bf-4281-9d10-dbf1a71c187d",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        576,
        -544
      ],
      "parameters": {
        "width": 288,
        "height": 400,
        "content": "## \ud83d\udce5 Resume Downloader  \n\n**Action:**  \n- Downloads the candidate\u2019s resume PDF using the link provided in the Google Sheet.  \n\n**Description:**  \n- Makes the candidate\u2019s raw resume accessible to the workflow.  \n- Bridges structured metadata from the sheet with unstructured information inside the PDF.  \n- Without this step, the AI would only have surface-level candidate details, missing critical context about skills and experience.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "054d2b9a-627a-46bc-a7e8-99a6f2080db6",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        320,
        64
      ],
      "parameters": {
        "width": 288,
        "height": 432,
        "content": "## \ud83d\udcd1 Candidate Data Fetch  \n\n**Action:**  \n- Retrieves the candidate\u2019s details from the designated Google Sheet.  \n\n**Description:**  \n- Pulls structured information such as name, email, resume link, experience, job title, job requirements, notes, skills, and application status.  \n- This sheet acts as the source of truth for all further processing.  \n- Ensures every decision and communication later in the workflow is based on up-to-date and accurate candidate records.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "56d51999-418d-4df5-bf74-c7395a07aa7e",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2672,
        112
      ],
      "parameters": {
        "width": 272,
        "height": 400,
        "content": "## \ud83d\udce7 Candidate Mailer \u2013 Rejected  \n\n**Action:**  \n- Sends the polite rejection + training recommendation email generated by the AI.  \n\n**Description:**  \n- Ensures rejected candidates leave with a positive impression.  \n- Provides learning resources instead of silence or a generic rejection.  \n- Improves candidate experience and employer branding even when candidates aren\u2019t hired.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "4a8d8604-b798-432c-8df5-f9bcbfe13816",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1552,
        -592
      ],
      "parameters": {
        "width": 304,
        "height": 432,
        "content": "## \ud83c\udfaf Shortlisted vs Rejected  \n\n**Action:**  \n- Compares the candidate\u2019s status field to \u201cShortlisted\u201d and splits the workflow into two paths.  \n\n**Description:**  \n- Creates a personalized communication experience for candidates.  \n- Shortlisted candidates receive onboarding-focused emails.  \n- Rejected candidates still get constructive feedback and growth plans.  \n- This branching logic transforms the workflow into a thoughtful candidate engagement system.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "c66a244d-b7ec-4fcf-a8b6-867f6ea86df5",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1376,
        16
      ],
      "parameters": {
        "width": 272,
        "height": 464,
        "content": "## \ud83e\udde9 Candidate Data Builder  \n\n**Action:**  \n- Combines structured data from Google Sheets with unstructured text extracted from the PDF.  \n\n**Description:**  \n- Produces a single, enriched JSON object containing candidate details, resume text, and application status.  \n- Ensures AI receives complete context: what the sheet says, what the resume shows, and what the JD requires.  \n- By merging all sources, the AI can provide highly personalized and accurate learning recommendations.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "b5e9d9e8-54f7-4068-9be8-6c57f64c5992",
      "name": "\ud83d\udcd1 Candidate Data Fetch",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        416,
        -112
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "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
    },
    {
      "id": "c7437cf6-5813-408f-9c3e-5026ad1d8ef6",
      "name": "\ud83d\udce5 Resume Downloader",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        672,
        -112
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "url",
          "value": "={{ $json[\"Resume Link\"] }}"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "ebf66f0f-2b52-4c19-946d-ffb37ed62476",
      "name": "Resume File Check",
      "type": "n8n-nodes-base.if",
      "position": [
        880,
        -112
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "ccbf3814-369c-4dc8-9a47-8aa496da368a",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "{{ $json.data }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "d2097c78-69ea-426f-a325-d6eaea9011ed",
      "name": "Error Logging",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1168,
        160
      ],
      "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
    },
    {
      "id": "034504d1-bdcc-49e0-a88f-a3905001eab3",
      "name": "PDF \u2192 Text Extractor",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        1184,
        -128
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1
    },
    {
      "id": "aac37887-0a3e-4d4d-ad84-878833ec4ad9",
      "name": "Candidate Data Builder",
      "type": "n8n-nodes-base.code",
      "position": [
        1424,
        -128
      ],
      "parameters": {
        "jsCode": "// Get PDF extracted data\nconst pdfData = $json;\n\n// Get original Google Sheets row (from earlier node)\nconst sheetData = $item(0).$node[\"\ud83d\udcd1 Candidate Data Fetch\"].json;\n\nreturn [{\n  json: {\n    candidateName: sheetData[\"Candidate Name\"],\n    email: sheetData[\"Email\"],\n    resumeLink: sheetData[\"Resume Link\"],\n    experience: sheetData[\"Experience\"],\n    jdTitle: sheetData[\"JD Title\"],\n    jdKeyRequirements: sheetData[\"JD Key Requirements\"],\n    notes: sheetData[\"Notes\"],\n    skills_sheet: sheetData[\"Skills\"],   // skills column from sheet\n    status: sheetData[\"Status\"],         // \u2705 include status from sheet\n    resumeText: pdfData.text             // raw resume text\n  }\n}];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "643e3a82-f587-494e-a744-9ca92c06e876",
      "name": "Shortlisted vs Rejected",
      "type": "n8n-nodes-base.if",
      "position": [
        1632,
        -128
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "39d3ca19-fe1f-42c4-b0dd-54b2069b5a34",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{$json.status}}",
              "rightValue": "Shortlisted"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "e35e2e2f-ecc0-442e-8731-d4a85caf9129",
      "name": "LLM Backend",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        2064,
        -112
      ],
      "parameters": {
        "model": "gpt-4o-mini",
        "options": {}
      },
      "credentials": {
        "azureOpenAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4d81897f-89cd-4f7f-9c85-17dd8f153675",
      "name": "Sticky Note13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1728,
        496
      ],
      "parameters": {
        "width": 368,
        "height": 320,
        "content": "## \ud83e\udd16 LLM Backend  \n\n**Action:**  \n- Provides access to the GPT-4o-mini model hosted on Azure OpenAI.  \n\n**Description:**  \n- Acts as the foundation for downstream LLM Chains.  \n- Powers both shortlisted and rejected communication flows.  \n- Ensures the AI can analyze resume data, compare it with JD requirements, and generate professional HTML-ready output.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "652033a3-0bb9-4eaa-8126-60d8bfe5c963",
      "name": "LLM Backend1",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        1920,
        368
      ],
      "parameters": {
        "model": "gpt-4o-mini",
        "options": {}
      },
      "credentials": {
        "azureOpenAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "2596cbb6-bb80-43bc-bce1-477021f2c997",
      "name": "Congrats + Onboarding Plan",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        2176,
        -384
      ],
      "parameters": {
        "text": "=Candidate Details:\n- Name: {{ $json.candidateName }}\n- Email: {{ $json.email }}\n- Experience: {{ $json.experience }}\n- Resume (text extract): {{ $json.resumeText }}\n\nJob Information:\n- Job Title: {{ $json.jdTitle }}\n- Key Requirements: {{ $json.jdKeyRequirements }}\n- Candidate Skills (from Sheet): {{ $json.skills_sheet }}\n- Notes: {{ $json.notes }}\n\nTask:\nGenerate a congratulatory onboarding email titled \u201cLearning Plan for {{ $json.candidateName }}\u201d \nwith Skill Gaps, Recommended Courses, and Next Steps. \nHighlight that this plan will guide their onboarding.\n",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "You are an onboarding assistant.  Write a warm, congratulatory email in HTML.  Congratulate the candidate for being shortlisted and clearly mention that the following learning plan is part of their onboarding journey.  Include sections for Skill Gaps, Recommended Courses (with real Coursera/Udemy/LinkedIn Learning links), and Next Steps.  Use a positive, professional, and encouraging tone.  Return only clean HTML (no explanations)."
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "2212e77e-f9d1-4bd3-9aa5-4f35ab849e27",
      "name": "Polite Rejection + Learning Plan",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        2128,
        176
      ],
      "parameters": {
        "text": "=Candidate Details:\n- Name: {{ $json.candidateName }}\n- Email: {{ $json.email }}\n- Experience: {{ $json.experience }}\n- Resume (text extract): {{ $json.resumeText }}\n\nJob Information:\n- Job Title: {{ $json.jdTitle }}\n- Key Requirements: {{ $json.jdKeyRequirements }}\n- Candidate Skills (from Sheet): {{ $json.skills_sheet }}\n- Notes: {{ $json.notes }}\n\nTask:\n1. Compare the candidate\u2019s skills and resume with the job requirements.\n2. Identify the missing or weaker skills (skill gaps).\n3. For each skill gap, suggest 1\u20132 relevant online courses with real URLs (Coursera, Udemy, LinkedIn Learning).\n4. Write a polished, professional HTML email titled \u201cLearning Plan for {{ $json.candidateName }}\u201d.\n5. The HTML should include sections: **Skill Gaps**, **Recommended Courses**, and **Next Steps**.\n6. Keep tone polite, constructive, and encouraging.\n7. Return only the final HTML (no explanations, no markdown).\n",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "You are a Skill Gap & Learning Plan Generator. Compare a candidate\u2019s resume skills with the job\u2019s required skills. 1. Identify missing or weaker skills (skill gaps). 2. For each gap, recommend 1\u20132 high-quality online courses with real URLs (Coursera, Udemy, LinkedIn Learning). 3. Build a short, encouraging Learning Plan in clean HTML (headings, bullet points, links). 4. Always include at least one free course option if possible. 5. Keep tone polite, constructive, and employer-brand friendly."
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "30e10fc2-8e1c-4cae-ba9d-88d38f364d03",
      "name": "Candidate Mailer \u2013 Shortlisted",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2528,
        -384
      ],
      "parameters": {
        "sendTo": "={{ $('\ud83d\udcd1 Candidate Data Fetch').item.json.Email }}",
        "message": "={{ $json.text }}",
        "options": {},
        "subject": "Your Personalized Learning Plan"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "9d63e1fd-a697-4bf5-aff5-e29588675413",
      "name": "Candidate Mailer \u2013 Rejected",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2480,
        176
      ],
      "parameters": {
        "sendTo": "={{ $('\ud83d\udcd1 Candidate Data Fetch').item.json.Email }}",
        "message": "={{ $json.text }}",
        "options": {},
        "subject": "Your Personalized Learning Plan"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "dc10189d-a8a2-42d5-a9d5-9788a4fc8f3b",
  "connections": {
    "LLM Backend": {
      "ai_languageModel": [
        [
          {
            "node": "Congrats + Onboarding Plan",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "LLM Backend1": {
      "ai_languageModel": [
        [
          {
            "node": "Polite Rejection + Learning Plan",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Resume File Check": {
      "main": [
        [
          {
            "node": "PDF \u2192 Text Extractor",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Error Logging",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Candidate Data Builder": {
      "main": [
        [
          {
            "node": "Shortlisted vs Rejected",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "PDF \u2192 Text Extractor": {
      "main": [
        [
          {
            "node": "Candidate Data Builder",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udce5 Resume Downloader": {
      "main": [
        [
          {
            "node": "Resume File Check",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Shortlisted vs Rejected": {
      "main": [
        [
          {
            "node": "Congrats + Onboarding Plan",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Polite Rejection + Learning Plan",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udcd1 Candidate Data Fetch": {
      "main": [
        [
          {
            "node": "\ud83d\udce5 Resume Downloader",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Congrats + Onboarding Plan": {
      "main": [
        [
          {
            "node": "Candidate Mailer \u2013 Shortlisted",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Polite Rejection + Learning Plan": {
      "main": [
        [
          {
            "node": "Candidate Mailer \u2013 Rejected",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "\ud83d\udcd1 Candidate Data Fetch",
            "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 personalized candidate communication for both shortlisted and rejected applicants. It fetches candidate details, processes resumes, checks for errors, and uses GPT-4o to generate professional HTML emails. Shortlisted candidates receive congratulatory…

Source: https://n8n.io/workflows/9140/ — 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 workflow automates the creation of comprehensive interviewer brief packs by extracting candidate resume data and generating professional HTML interview preparation materials. It saves recruiters

Gmail, Google Sheets, Chain Llm +2
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

This workflow is perfect for graphic designers, creative agencies, marketing teams, or freelancers who regularly use AI-generated images in their projects. It's specifically beneficial for teams that

Google Sheets, Google Drive, HTTP Request +5
AI & RAG

This workflow automates the full lifecycle of a vehicle insurance claim — from an incoming Gmail email to a signed, watermarked PDF decision letter delivered back to the claimant.

Gmail Trigger, N8N Nodes Pdf Api Hub, Google Sheets +4
AI & RAG

This workflow automates the creation, storage, and reporting of personalized sales collateral for booked leads using GPT-4o, Google Sheets, Google Drive, and Gmail. It pulls leads from a central sheet

Google Sheets, Lm Chat Azure Open Ai, Agent +2