{
  "id": "7Pytou63ro4Ht10d",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "JD match score",
  "tags": [],
  "nodes": [
    {
      "id": "b30ed071-9118-4b6c-9645-7f675c7f003a",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -432,
        -112
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "f9c22328-7675-4161-a984-a7704ad41e05",
      "name": "Download file",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        16,
        -112
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "7f63f5cf-8b71-4235-9a38-5fe3b2d01467",
      "name": "Extract from File",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        240,
        -112
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1
    },
    {
      "id": "73d898cf-26f3-468a-adc1-bd18589bea19",
      "name": "Download file1",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        688,
        -112
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "7ec0bfc6-497e-4121-bb5a-420067a9d63a",
      "name": "Extract from File1",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        912,
        -112
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1
    },
    {
      "id": "4958145c-c824-4606-b483-bad0f7a0ef4d",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1136,
        -112
      ],
      "parameters": {
        "text": "=Compare the following job description and resume, then score and evaluate according to the instructions.\n\nJob Description (JD):\n{{ $('Extract from File').item.json.text }}\n\nCandidate Resume:\n{{ $json.text }}\n\nReturn the evaluation in the required JSON format.",
        "options": {
          "systemMessage": "You are an AI resume evaluator.\nYour task is to compare a candidate\u2019s resume against a provided job description and return a structured JSON evaluation.\nFollow these rules:\n\nEvaluate alignment between the job description (JD) and the resume.\n\nAssign a score (0\u2013100) where:\n\n90\u2013100 = Excellent fit\n\n70\u201389 = Good fit with some gaps\n\n50\u201369 = Moderate fit with significant gaps\n\nBelow 50 = Poor fit\n\nIdentify must_have_gaps \u2192 missing critical skills, experience, or qualifications explicitly required in the JD.\n\nIdentify nice_to_have_bonus \u2192 additional desirable skills, certifications, or achievements mentioned in the JD but not mandatory.\n\nProvide a summary (3\u20135 sentences) describing the overall fit and candidate potential.\n\nAlways return output in the following JSON format (no extra text, no markdown):"
        },
        "promptType": "define"
      },
      "typeVersion": 2.1
    },
    {
      "id": "2c36bdc0-ec36-4b8c-bd1e-54e40fdb87a1",
      "name": "Azure OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        1232,
        112
      ],
      "parameters": {
        "model": "gpt-4o-mini",
        "options": {}
      },
      "credentials": {
        "azureOpenAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4cf138e8-9c52-4f5e-89cf-67e1d6b49f14",
      "name": "Search JD",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -208,
        -112
      ],
      "parameters": {
        "filter": {
          "folderId": {
            "__rl": true,
            "mode": "list",
            "value": "1KnopVQ7CIdUl5j9ICwijk1RG5w7050nW",
            "cachedResultUrl": "https://drive.google.com/drive/folders/1KnopVQ7CIdUl5j9ICwijk1RG5w7050nW",
            "cachedResultName": "JD store"
          }
        },
        "options": {},
        "resource": "fileFolder",
        "returnAll": true
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "22daae51-9cb8-4584-8e1a-e8abcea3369f",
      "name": "Search Resume",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        464,
        -112
      ],
      "parameters": {
        "filter": {
          "folderId": {
            "__rl": true,
            "mode": "list",
            "value": "1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
            "cachedResultUrl": "https://drive.google.com/drive/folders/1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
            "cachedResultName": "Resume_store"
          }
        },
        "options": {},
        "resource": "fileFolder",
        "returnAll": true
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "274e9346-1bbc-413b-8a29-0ba32a37f7df",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "position": [
        1536,
        -112
      ],
      "parameters": {
        "jsCode": "return items.map(item => {\n  let text = item.json.output;\n\n  // Remove code fences like ```json ... ```\n  text = text.replace(/```json|```/g, \"\").trim();\n\n  let parsed = {};\n  try {\n    parsed = JSON.parse(text);\n  } catch (err) {\n    parsed = { error: \"Failed to parse JSON\", raw: text };\n  }\n\n  return { json: parsed };\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "e812463c-3796-4f43-9586-efbbf04f1930",
      "name": "Create file from text",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1760,
        -112
      ],
      "parameters": {
        "name": "={{ $('Search Resume').item.json.name }}_result-summary",
        "content": "=Score: {{ $json.score }}\nmust have gaps: {{ $json.must_have_gaps }}\nnice to have bonus: {{ $json.nice_to_have_bonus }}\nsummary: {{ $json.summary }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
          "cachedResultName": "Resume_store"
        },
        "operation": "createFromText"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "6403b230-16ca-4e09-83e4-eadfe14d0fb2",
      "name": "Append or update row in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1984,
        -112
      ],
      "parameters": {
        "columns": {
          "value": {
            "Name": "John Doe",
            "Score": "={{ $('Code').item.json.score }}",
            "Summary": "={{ $('Code').item.json.summary }}"
          },
          "schema": [
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Phone ",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Phone ",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Years of experience",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Years of experience",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "skills",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "skills",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "curent role",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "curent role",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "education",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "education",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Summary",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Summary",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Name"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1424038785,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1JlXxy90s0we_IqErHyvomrJSijb8pd4H91hOUCH6xCA/edit#gid=1424038785",
          "cachedResultName": "Sheet2"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1JlXxy90s0we_IqErHyvomrJSijb8pd4H91hOUCH6xCA",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1JlXxy90s0we_IqErHyvomrJSijb8pd4H91hOUCH6xCA/edit?usp=drivesdk",
          "cachedResultName": "Resume store"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "156e51d2-5eb1-4db4-a108-58845354ef06",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1024,
        -528
      ],
      "parameters": {
        "width": 464,
        "height": 1104,
        "content": "## JD Match Score Workflow\n**Purpose:** Compares candidate resumes against job descriptions and calculates compatibility scores.\n\n**Node Descriptions:**\n\n**Manual Trigger**\nInitiates the job description matching process\nUsed for resume evaluation against specific roles\n\n**Search JD (Google Drive)**\nSearches for job description files in designated Google Drive folder\nRetrieves JD documents for comparison\n\n**Download File (JD)**\nDownloads job description PDF files from Google Drive\nPrepares files for content extraction\n\n**Extract from File (JD)**\nExtracts text content from job description PDFs\nConverts documents to readable text format\n\n**Search Resume (Google Drive)**\nLocates candidate resume files in resume storage folder\nRetrieves resume documents for analysis\n\n**Download File (Resume)**\nDownloads candidate resume PDF files\nPrepares resume files for processing\n\n**Extract from File (Resume)**\nExtracts text content from resume PDFs\nConverts resume documents to analyzable text\n\n**AI Agent**\nCompares job description against candidate resume using Azure OpenAI\nEvaluates alignment and compatibility (0-100 score)\nIdentifies must-have gaps and nice-to-have bonuses\nGenerates detailed summary of candidate fit\n\n**Code Node**\nParses AI evaluation results into structured JSON\nHandles JSON parsing and error management\nCleans evaluation output for database storage\n\n**Create File from Text**\nGenerates evaluation summary reports\nSaves detailed results as text files in Google Drive\nCreates audit trail of evaluations\n\n**Append or Update Row in Sheet**\nUpdates candidate database with JD match scores\nStores evaluation summaries and scores\nMaintains comprehensive candidate profiles"
      },
      "typeVersion": 1
    },
    {
      "id": "fbba0640-0175-437d-9760-cdbbdcc75ef8",
      "name": "Download Job Description PDF",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        2032,
        1584
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "27e2a0af-070e-424a-beef-864ac39eae1a",
      "name": "Extract JD Text Content",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        2256,
        1584
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1
    },
    {
      "id": "451af1bb-e02f-4964-afb2-6d7793954ec8",
      "name": "Download Candidate Resume PDF",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        2704,
        1584
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "7f27b30a-b264-48a9-b42f-54ebca30becc",
      "name": "Extract Resume Text Content",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        2928,
        1584
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1
    },
    {
      "id": "db811ef4-01ad-4c2f-95f8-5513af29fa57",
      "name": "AI Resume Evaluator Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        3152,
        1584
      ],
      "parameters": {
        "text": "=Compare the following job description and resume, then score and evaluate according to the instructions.\n\nJob Description (JD):\n{{ $('Extract JD Text Content').item.json.text }}\n\nCandidate Resume:\n{{ $json.text }}\n\nReturn the evaluation in the required JSON format.",
        "options": {
          "systemMessage": "You are an AI resume evaluator.\nYour task is to compare a candidate's resume against a provided job description and return a structured JSON evaluation.\nFollow these rules:\n\nEvaluate alignment between the job description (JD) and the resume.\n\nAssign a score (0\u2013100) where:\n\n90\u2013100 = Excellent fit\n\n70\u201389 = Good fit with some gaps\n\n50\u201369 = Moderate fit with significant gaps\n\nBelow 50 = Poor fit\n\nIdentify must_have_gaps \u2192 missing critical skills, experience, or qualifications explicitly required in the JD.\n\nIdentify nice_to_have_bonus \u2192 additional desirable skills, certifications, or achievements mentioned in the JD but not mandatory.\n\nProvide a summary (3\u20135 sentences) describing the overall fit and candidate potential.\n\nAlways return output in the following JSON format (no extra text, no markdown):"
        },
        "promptType": "define"
      },
      "typeVersion": 2.1
    },
    {
      "id": "ca6036ea-5fb9-4ca2-aa02-ef53dd890bec",
      "name": "Azure OpenAI GPT-4 Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        3248,
        1808
      ],
      "parameters": {
        "model": "gpt-4o-mini",
        "options": {}
      },
      "credentials": {
        "azureOpenAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "92b8dec7-6906-40fc-978a-864a2b3c693a",
      "name": "Find Job Descriptions in Drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1808,
        1584
      ],
      "parameters": {
        "filter": {
          "folderId": {
            "__rl": true,
            "mode": "list",
            "value": "1KnopVQ7CIdUl5j9ICwijk1RG5w7050nW",
            "cachedResultUrl": "https://drive.google.com/drive/folders/1KnopVQ7CIdUl5j9ICwijk1RG5w7050nW",
            "cachedResultName": "JD store"
          }
        },
        "options": {},
        "resource": "fileFolder",
        "returnAll": true
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "ab51acb4-d1b4-456b-8570-e792678a0fdf",
      "name": "Find Candidate Resumes in Drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        2480,
        1584
      ],
      "parameters": {
        "filter": {
          "folderId": {
            "__rl": true,
            "mode": "list",
            "value": "1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
            "cachedResultUrl": "https://drive.google.com/drive/folders/1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
            "cachedResultName": "Resume_store"
          }
        },
        "options": {},
        "resource": "fileFolder",
        "returnAll": true
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "1ea350f8-a3f2-4570-ac74-21cea7088082",
      "name": "Parse AI Response to JSON",
      "type": "n8n-nodes-base.code",
      "position": [
        3552,
        1584
      ],
      "parameters": {
        "jsCode": "return items.map(item => {\n  let text = item.json.output;\n\n  // Remove code fences like ```json ... ```\n  text = text.replace(/```json|```/g, \"\").trim();\n\n  let parsed = {};\n  try {\n    parsed = JSON.parse(text);\n  } catch (err) {\n    parsed = { error: \"Failed to parse JSON\", raw: text };\n  }\n\n  return { json: parsed };\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "96787a98-f91a-40a1-89b9-baceff8249ee",
      "name": "Save Evaluation Report to Drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        3776,
        1584
      ],
      "parameters": {
        "name": "={{ $('Find Candidate Resumes in Drive').item.json.name }}_result-summary",
        "content": "=Score: {{ $json.score }}\nmust have gaps: {{ $json.must_have_gaps }}\nnice to have bonus: {{ $json.nice_to_have_bonus }}\nsummary: {{ $json.summary }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
          "cachedResultName": "Resume_store"
        },
        "operation": "createFromText"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "dc9cb8cc-34f6-4ce2-ae33-d929126a7370",
      "name": "Update Candidate Database",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        4000,
        1584
      ],
      "parameters": {
        "columns": {
          "value": {
            "Name": "John Doe",
            "Score": "={{ $('Parse AI Response to JSON').item.json.score }}",
            "Summary": "={{ $('Parse AI Response to JSON').item.json.summary }}"
          },
          "schema": [
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Phone ",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Phone ",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Years of experience",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Years of experience",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "skills",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "skills",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "curent role",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "curent role",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "education",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "education",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Summary",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Summary",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Name"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1424038785,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1JlXxy90s0we_IqErHyvomrJSijb8pd4H91hOUCH6xCA/edit#gid=1424038785",
          "cachedResultName": "Sheet2"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1JlXxy90s0we_IqErHyvomrJSijb8pd4H91hOUCH6xCA",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1JlXxy90s0we_IqErHyvomrJSijb8pd4H91hOUCH6xCA/edit?usp=drivesdk",
          "cachedResultName": "Resume store"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "bb89e2d9-4f18-468f-8b28-a0aa8506b92b",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1072,
        1728
      ],
      "parameters": {
        "width": 320,
        "height": 240,
        "content": "## \ud83d\ude80 START PROCESS\n\n**Start Resume Evaluation Process**\n\n\u2022 **Purpose**: Manually trigger the entire resume evaluation workflow\n\u2022 **Action**: Click to begin comparing candidate resumes against job descriptions\n\u2022 **Output**: Initiates the sequential processing of all workflow steps\n\u2022 **Best Practice**: Use this when you have new resumes to evaluate or want to re-run evaluations"
      },
      "typeVersion": 1
    },
    {
      "id": "0343be16-153b-46f2-8675-b7928b289fb2",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1584,
        1280
      ],
      "parameters": {
        "width": 320,
        "height": 280,
        "content": "## \ud83d\udcc1 JOB DESCRIPTION SEARCH\n\n**Find Job Descriptions in Drive**\n\n\u2022 **Purpose**: Locates all job description files stored in the designated Google Drive folder\n\u2022 **Folder**: Searches in 'JD store' folder\n\u2022 **File Types**: Looks for PDF job description documents\n\u2022 **Output**: Returns list of available JD files with their IDs and metadata\n\u2022 **Note**: Ensure JD files are properly uploaded to the correct folder"
      },
      "typeVersion": 1
    },
    {
      "id": "2fe90bdf-4305-40a1-875c-1f773a4e0afb",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1904,
        1792
      ],
      "parameters": {
        "width": 320,
        "height": 260,
        "content": "## \ud83d\udce5 DOWNLOAD JD FILE\n\n**Download Job Description PDF**\n\n\u2022 **Purpose**: Downloads the selected job description PDF file from Google Drive\n\u2022 **Input**: File ID from the search results\n\u2022 **Process**: Retrieves the actual PDF file content for processing\n\u2022 **Output**: Binary PDF data ready for text extraction\n\u2022 **Credentials**: Uses Google Drive OAuth2 API connection"
      },
      "typeVersion": 1
    },
    {
      "id": "efca102d-d66d-4d66-b314-45ed34287b69",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2144,
        1280
      ],
      "parameters": {
        "width": 320,
        "height": 260,
        "content": "## \ud83d\udcc4 EXTRACT JD TEXT\n\n**Extract JD Text Content**\n\n\u2022 **Purpose**: Converts PDF job description into readable text format\n\u2022 **Input**: Binary PDF data from downloaded file\n\u2022 **Process**: Uses PDF parsing to extract all text content\n\u2022 **Output**: Plain text version of the job description\n\u2022 **Quality**: Maintains formatting and structure of original document"
      },
      "typeVersion": 1
    },
    {
      "id": "02c627d4-877e-4d65-8e1d-7ccfbd0b5804",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2352,
        1792
      ],
      "parameters": {
        "width": 320,
        "height": 280,
        "content": "## \ud83d\udd0d RESUME SEARCH\n\n**Find Candidate Resumes in Drive**\n\n\u2022 **Purpose**: Searches for candidate resume files in the resume storage folder\n\u2022 **Folder**: Looks in 'Resume_store' folder\n\u2022 **File Types**: Identifies PDF resume documents\n\u2022 **Process**: Returns all available resume files for batch processing\n\u2022 **Organization**: Maintains separate folders for JDs and resumes"
      },
      "typeVersion": 1
    },
    {
      "id": "13d3d43a-f1b0-45fb-8dfb-7b63496102f9",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2576,
        1264
      ],
      "parameters": {
        "width": 320,
        "height": 260,
        "content": "## \ud83d\udce5 DOWNLOAD RESUME\n\n**Download Candidate Resume PDF**\n\n\u2022 **Purpose**: Downloads individual candidate resume PDF files\n\u2022 **Input**: Resume file ID from search results\n\u2022 **Process**: Retrieves PDF file content for text extraction\n\u2022 **Output**: Binary resume data ready for processing\n\u2022 **Batch Processing**: Handles multiple resumes sequentially"
      },
      "typeVersion": 1
    },
    {
      "id": "610649af-431e-43dd-9278-0b095b194955",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2800,
        1776
      ],
      "parameters": {
        "width": 320,
        "height": 260,
        "content": "## \ud83d\udcc4 EXTRACT RESUME TEXT\n\n**Extract Resume Text Content**\n\n\u2022 **Purpose**: Converts PDF resume into analyzable text format\n\u2022 **Input**: Binary PDF resume data\n\u2022 **Process**: Parses PDF to extract all textual information\n\u2022 **Output**: Clean text version of candidate resume\n\u2022 **Quality**: Preserves resume structure and content integrity"
      },
      "typeVersion": 1
    },
    {
      "id": "0c35ebd4-20fa-4ccc-bf38-65814afbbb5a",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3088,
        1216
      ],
      "parameters": {
        "width": 320,
        "height": 320,
        "content": "## \ud83e\udd16 AI EVALUATION ENGINE\n\n**AI Resume Evaluator Agent**\n\n\u2022 **Purpose**: Intelligently compares resume against job description using AI\n\u2022 **Scoring System**: \n  - 90-100: Excellent fit\n  - 70-89: Good fit with minor gaps\n  - 50-69: Moderate fit with gaps\n  - Below 50: Poor fit\n\u2022 **Analysis**: Identifies must-have gaps and nice-to-have bonuses\n\u2022 **Output**: Structured JSON evaluation with detailed summary"
      },
      "typeVersion": 1
    },
    {
      "id": "32715c21-bd37-4edd-906c-73285919b97c",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3168,
        1968
      ],
      "parameters": {
        "width": 320,
        "height": 260,
        "content": "## \u2699\ufe0f AI MODEL CONFIG\n\n**Azure OpenAI GPT-4 Model**\n\n\u2022 **Model**: GPT-4o-mini for cost-effective evaluation\n\u2022 **Purpose**: Powers the AI evaluation agent\n\u2022 **Capabilities**: Natural language understanding and structured output\n\u2022 **Connection**: Links to Azure OpenAI service\n\u2022 **Performance**: Optimized for resume analysis tasks"
      },
      "typeVersion": 1
    },
    {
      "id": "458a71d5-705e-4107-b827-55188bbba6dc",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3472,
        1264
      ],
      "parameters": {
        "width": 320,
        "height": 280,
        "content": "## \ud83d\udd27 JSON PARSER\n\n**Parse AI Response to JSON**\n\n\u2022 **Purpose**: Converts AI text output into structured JSON format\n\u2022 **Process**: Removes markdown formatting and parses JSON\n\u2022 **Error Handling**: Manages parsing failures gracefully\n\u2022 **Output**: Clean JSON object with score, gaps, bonuses, and summary\n\u2022 **Data Quality**: Ensures consistent data structure for downstream processing"
      },
      "typeVersion": 1
    },
    {
      "id": "3c10aefc-1be1-415e-8707-8e5d44853dcf",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3680,
        1824
      ],
      "parameters": {
        "width": 320,
        "height": 280,
        "content": "## \ud83d\udcca SAVE REPORT\n\n**Save Evaluation Report to Drive**\n\n\u2022 **Purpose**: Creates detailed evaluation report as text file\n\u2022 **Content**: Includes score, gaps, bonuses, and summary\n\u2022 **Naming**: Uses candidate name + '_result-summary' format\n\u2022 **Storage**: Saves to Resume_store folder for organization\n\u2022 **Audit Trail**: Maintains permanent record of all evaluations"
      },
      "typeVersion": 1
    },
    {
      "id": "a7615e89-8b92-4266-b9b6-95d574b5aca6",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3904,
        1280
      ],
      "parameters": {
        "width": 320,
        "height": 280,
        "content": "## \ud83d\udcc8 DATABASE UPDATE\n\n**Update Candidate Database**\n\n\u2022 **Purpose**: Updates Google Sheets database with evaluation results\n\u2022 **Data**: Stores candidate score and summary\n\u2022 **Matching**: Uses candidate name to update existing records\n\u2022 **Tracking**: Maintains comprehensive candidate evaluation history\n\u2022 **Integration**: Enables easy data analysis and reporting"
      },
      "typeVersion": 1
    },
    {
      "id": "9b3d9948-3d7f-4491-abd5-2e7def378c83",
      "name": "Sticky Note13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1008,
        1056
      ],
      "parameters": {
        "width": 400,
        "height": 600,
        "content": "## \ud83d\udccb JD MATCH SCORE WORKFLOW OVERVIEW\n\n**\ud83c\udfaf Purpose:** Automated system to evaluate candidate resumes against job descriptions and generate compatibility scores\n\n**\ud83d\udd04 Workflow Steps:**\n1. **Search & Download**: Locate JD and resume files from Google Drive\n2. **Extract Content**: Convert PDF documents to text format\n3. **AI Analysis**: Use GPT-4 to compare and score candidate fit\n4. **Process Results**: Parse AI output and structure data\n5. **Store Results**: Save reports and update candidate database\n\n**\ud83d\udcca Scoring System:**\n\u2022 90-100: Excellent match (hire immediately)\n\u2022 70-89: Good fit with minor training needed\n\u2022 50-69: Moderate fit requiring skill development\n\u2022 Below 50: Poor fit for this role\n\n**\ud83d\udca1 Benefits:**\n\u2022 Objective, consistent evaluation process\n\u2022 Detailed gap analysis for each candidate\n\u2022 Automated report generation and storage\n\u2022 Comprehensive candidate database tracking"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "7e773013-c40d-4eab-b3ed-6f96bc6fe260",
  "connections": {
    "Code": {
      "main": [
        [
          {
            "node": "Create file from text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search JD": {
      "main": [
        [
          {
            "node": "Download file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download file": {
      "main": [
        [
          {
            "node": "Extract from File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search Resume": {
      "main": [
        [
          {
            "node": "Download file1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download file1": {
      "main": [
        [
          {
            "node": "Extract from File1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract from File": {
      "main": [
        [
          {
            "node": "Search Resume",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract from File1": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create file from text": {
      "main": [
        [
          {
            "node": "Append or update row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Azure OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Extract JD Text Content": {
      "main": [
        [
          {
            "node": "Find Candidate Resumes in Drive",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Azure OpenAI GPT-4 Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Resume Evaluator Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "AI Resume Evaluator Agent": {
      "main": [
        [
          {
            "node": "Parse AI Response to JSON",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse AI Response to JSON": {
      "main": [
        [
          {
            "node": "Save Evaluation Report to Drive",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Resume Text Content": {
      "main": [
        [
          {
            "node": "AI Resume Evaluator Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Job Description PDF": {
      "main": [
        [
          {
            "node": "Extract JD Text Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Candidate Resume PDF": {
      "main": [
        [
          {
            "node": "Extract Resume Text Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Find Job Descriptions in Drive": {
      "main": [
        [
          {
            "node": "Download Job Description PDF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Find Candidate Resumes in Drive": {
      "main": [
        [
          {
            "node": "Download Candidate Resume PDF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save Evaluation Report to Drive": {
      "main": [
        [
          {
            "node": "Update Candidate Database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Search JD",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}