AI를 사용한 Gmail에서 Airtable로의 이력서 스크리닝 및 지원자 점수 매기기 자동화
고급
이것은HR, AI Summarization분야의자동화 워크플로우로, 16개의 노드를 포함합니다.주로 Set, Merge, Airtable, GmailTrigger, ExtractFromFile 등의 노드를 사용하며. AI를 사용한 이력서 스크리닝 및 지원자 점수 매기기 자동화: Gmail에서 Airtable로
사전 요구사항
- •Airtable API Key
- •Google 계정 및 Gmail API 인증 정보
- •Google Gemini API Key
사용된 노드 (16)
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"meta": {
"instanceId": "689fa22e68cd4198e4ae37f3cc44f498087edd235a867e22515be823bab694c7",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "ba543316-f00d-452d-bdcb-929d264e2c30",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
-464,
400
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.5-flash-preview-04-17"
},
"credentials": {
"googlePalmApi": {
"id": "oN60i7iTnOJLvzUZ",
"name": "said latihan"
}
},
"typeVersion": 1
},
{
"id": "7a05b84b-ed92-4e55-b932-390725dd9cb2",
"name": "Google Gemini Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
464,
400
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.5-flash-preview-04-17"
},
"credentials": {
"googlePalmApi": {
"id": "oN60i7iTnOJLvzUZ",
"name": "said latihan"
}
},
"typeVersion": 1
},
{
"id": "6cc4f324-dcfe-4e9f-8af3-34074306d37b",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
640,
416
],
"parameters": {
"jsonSchemaExample": "{\n\t\"score\": 100,\n\t\"fit_summary\": \"Los Angeles\"\n}"
},
"typeVersion": 1.2
},
{
"id": "b6b4e893-d011-43d8-9453-cb27fa1a54ab",
"name": "신규 지원서 확인",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
-1280,
16
],
"parameters": {
"simple": false,
"filters": {
"q": "has:attachment OR has:document"
},
"options": {
"downloadAttachments": true,
"dataPropertyAttachmentsPrefixName": "CV_"
},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
}
},
"credentials": {
"gmailOAuth2": {
"id": "bz2ymQsAeALCEssA",
"name": "Ryan Google Credentials"
}
},
"typeVersion": 1.2
},
{
"id": "57948245-8761-4b3d-9493-7ec14bdcbfcb",
"name": "채용 공고 코드 추출",
"type": "n8n-nodes-base.set",
"position": [
-624,
-224
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "4f8f7c3f-3f03-4b99-8332-c1131e7807b1",
"name": "=Job Code",
"type": "string",
"value": "={{ ($json.subject.match(/([A-Z]{2}-\\d{3})/) || [])[1] || null }}"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "026ad70e-f96a-4547-88cb-e95d07bb8d1a",
"name": "채용 공고 찾기",
"type": "n8n-nodes-base.airtable",
"position": [
-224,
-224
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "apppwpxrdT85fG31V",
"cachedResultUrl": "https://airtable.com/apppwpxrdT85fG31V",
"cachedResultName": "UMKM"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblLM8M41XkSaTLxw",
"cachedResultUrl": "https://airtable.com/apppwpxrdT85fG31V/tblLM8M41XkSaTLxw",
"cachedResultName": "Job Posts"
},
"options": {},
"operation": "search",
"filterByFormula": "={Job Code} = '{{ $json[\"Job Code\"] }}'"
},
"credentials": {
"airtableTokenApi": {
"id": "FKcJ1ogNuXHNGNcb",
"name": "Fahmi UMKM"
}
},
"typeVersion": 2.1,
"alwaysOutputData": true
},
{
"id": "31e468c3-3876-4789-bed7-ef9f274d4b0d",
"name": "이력서(PDF) 텍스트 읽기",
"type": "n8n-nodes-base.extractFromFile",
"position": [
-688,
272
],
"parameters": {
"options": {},
"operation": "pdf",
"binaryPropertyName": "CV_0"
},
"typeVersion": 1
},
{
"id": "995b95ca-ee4d-446a-886e-2500c34830c5",
"name": "AI 이력서 파서",
"type": "@n8n/n8n-nodes-langchain.informationExtractor",
"position": [
-464,
272
],
"parameters": {
"text": "=CV Text: {{ $json.text }}\n\nEmail Subject: {{ $('Watch for New Applications').item.json.subject }}",
"options": {
"systemPromptTemplate": "=You are a professional CV parsing and information extraction agent, specialized in structured data extraction for job applications.\nYour task is to extract only the **relevant attributes** from the applicant's CV text. Return the extracted information in **structured JSON format**, using the keys provided below.\nIf an attribute is not found or not confidently identifiable, you may **omit** that key from the response.\n\n### Extract the following attributes (if available):\n* `job_code`: the code of the job from the Email Subject\n* `name`: Full name of the applicant\n* `email`: Email address\n* `phone`: Phone number\n* `address`: Location or city (optional)\n* `education`: Highest education or relevant qualifications\n* `experience_years`: Estimated total years of relevant work experience\n* `skills`: List of relevant skills\n* `last_position`: Most recent job title or role\n* `last_company`: Most recent company worked at\n* `language`: List of languages spoken (optional)\n* `certifications`: Relevant certificates or training (optional)\n\n### Output Rules:\n* Only include fields that are clearly present in the CV and Email Subject.\n* Format your response as a clean, valid JSON object.\n* Do not include any explanations or extra text—**only return JSON**."
},
"schemaType": "fromJson",
"jsonSchemaExample": "{\n \"job_code\": \"AB-001\",\n \"name\": \"Siti Nurhaliza\",\n \"email\": \"siti.nurhaliza@example.com\",\n \"phone\": \"+62 812-3456-7890\",\n \"address\": \"Jakarta Selatan, Indonesia\",\n \"education\": \"Sarjana Teknik Industri, Universitas Indonesia\",\n \"experience_years\": 3.5,\n \"skills\": [\n \"Meracik Kopi\",\n \"Latte Art\",\n \"Customer Service\",\n \"Manajemen Waktu\"\n ],\n \"last_position\": \"Barista Senior\",\n \"last_company\": \"Kopi Kita Coffeehouse\",\n \"language\": [\n \"Bahasa Indonesia\",\n \"Inggris\"\n ],\n \"certifications\": [\n \"Sertifikat Barista dari SCA\",\n \"Pelatihan Latte Art Profesional\"\n ]\n}"
},
"typeVersion": 1.1
},
{
"id": "d36f4b59-cffc-4fa9-bb92-070630555882",
"name": "채용 공고 및 이력서 데이터 결합",
"type": "n8n-nodes-base.merge",
"position": [
32,
192
],
"parameters": {
"mode": "combine",
"options": {},
"advanced": true,
"mergeByFields": {
"values": [
{
"field1": "Job Code",
"field2": "output.job_code"
}
]
}
},
"typeVersion": 3.2
},
{
"id": "17a29a4a-c659-48ba-be25-2a38de28cc58",
"name": "AI 지원자 평가",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
448,
192
],
"parameters": {
"text": "=You are given the following job requirements and a candidate's CV data.\nPlease evaluate the match and return a score from 1 to 100, along with a brief summary of your reasoning.\n\n---\n\n Job Post Data:\n- Job Title: {{ $json['Job Title'] }}\n- Required Skills: {{ $json['Required Skills'].join(', ') }}\n- Minimum Experience: {{ $json['Minimum Experience (Years)'] }} years\n- Job Description: {{ $json['Job Description'] }}\n\n---\n Applicant CV Data:\n- Name: {{ $json.output.name }}\n- Email: {{ $json.output.email }}\n- Phone: {{ $json.output.phone }}\n- Education: {{ $json.output.education }}\n- Experience: {{ $json.output.experience_years }} years\n- Skills: {{ $json.output.skills.join(', ') }}\n- Last Position: {{ $json.output.last_position }}\n- Last Company: {{ $json.output.last_company }}\n- Language: {{ $json.output.language.join(', ') }}\n- Certifications: {{ $json.output.certifications }}",
"batching": {},
"messages": {
"messageValues": [
{
"message": "=You are a professional job application evaluator and recruitment assistant. Your role is to assess the suitability of job applicants based on their CV data and compare it with the job's requirements. You must return a structured JSON response with the following keys: - `score`: A number between 1–100 that reflects how well the applicant matches the job. - `fit_summary`: A short, clear explanation (max 2 sentences) of why you gave that score. Scoring is based primarily on: - Skill match (technical and soft skills) - Relevant experience (including job titles and industries) - Education or certification (if required) - Language and communication skills (optional) Be objective and consistent in your evaluations and use BAHASA INDONESIA. Only give high scores to applicants that strongly match the role requirements. Do not include any extra commentary — only return JSON."
}
]
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.7
},
{
"id": "ad1babe0-ccfb-4941-9b86-cf59ad6c77ca",
"name": "지원자 저장",
"type": "n8n-nodes-base.airtable",
"position": [
1136,
192
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "apppwpxrdT85fG31V",
"cachedResultUrl": "https://airtable.com/apppwpxrdT85fG31V",
"cachedResultName": "UMKM"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblkWxuaAvw0GmeCT",
"cachedResultUrl": "https://airtable.com/apppwpxrdT85fG31V/tblkWxuaAvw0GmeCT",
"cachedResultName": "Applications"
},
"columns": {
"value": {
"Notes": "={{ $json.output.fit_summary }}",
"Score": "={{ $json.output.score }}",
"Job Post": "={{ $('Combine Job & CV Data').item.json['Job Code'] }}",
"Email Address": "={{ $('Combine Job & CV Data').item.json.output.email }}",
"Applicant Name": "={{ $('Combine Job & CV Data').item.json.output.name }}",
"Years of Experience": 0
},
"schema": [
{
"id": "Application ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Application ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Job Post",
"type": "array",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Job Post",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Applicant Name",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Applicant Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email Address",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Email Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "CV File",
"type": "array",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "CV File",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Parsed Skills",
"type": "array",
"display": true,
"options": [],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Parsed Skills",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Years of Experience",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Years of Experience",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Score",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "options",
"display": true,
"options": [
{
"name": "Pending",
"value": "Pending"
},
{
"name": "Shortlisted",
"value": "Shortlisted"
},
{
"name": "Rejected",
"value": "Rejected"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Received At",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Received At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Raw Subject",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Raw Subject",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Notes",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Notes",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Auto ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Auto ID",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "create"
},
"credentials": {
"airtableTokenApi": {
"id": "FKcJ1ogNuXHNGNcb",
"name": "Fahmi UMKM"
}
},
"typeVersion": 2.1
},
{
"id": "25eb8342-394c-4165-9696-3d15097beae2",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2272,
-1104
],
"parameters": {
"width": 656,
"height": 1152,
"content": "## Automate CV Screening and Applicant Scoring from Gmail to Airtable with AI\n**This workflow automates the CV screening process using AI. It monitors a Gmail inbox for incoming applications, extracts and scores CVs based on job requirements stored in Airtable, and logs structured applicant data—saving hours of manual work.**\n\n### How It Works\n1. **Trigger**\n Watches for new emails with attachments in a Gmail label.\n2. **Extract Data**\n * Extracts job code from the email subject (e.g., `FN-001`)\n * Extracts raw text from the attached CV (PDF)\n3. **AI Parsing**\n Uses Google Gemini to parse the CV and extract:\n * Name\n * Email\n * Years of experience\n * Skills\n4. **Job Lookup**\n Uses the extracted job code to retrieve job details from Airtable.\n5. **AI Scoring**\n * Compares applicant data with job requirements\n * Scores from 1–100\n * Generates a brief reasoning summary (in Bahasa Indonesia)\n6. **Log to Airtable**\n Saves applicant data, score, and AI notes to the \"Applications\" table.\n\n### Setup Instructions\n1. **Prepare Airtable Base**\n * **Job Posts Table**\n * Columns: Job Code, Job Title, Required Skills, Minimum Experience, Job Description\n * **Applications Table**\n * Columns: Applicant Name, Email, Score, Notes\n * Include a linked field to the Job Posts table\n2. **Add Credentials in n8n**\n * Gmail\n * Google AI (Gemini)\n * Airtable\n3. **Configure Nodes**\n * **Trigger**: Set Gmail filter (e.g., `label:job-applications`)\n * **Extract Job Code**: Verify regex format, default is `([A-Z]{2}-\\d{3})`\n * **Airtable Nodes**: Select your base and table in:\n * \"Find Job Post...\"\n * \"Save Applicant...\"\n4. **Activate Workflow**\n * Save and enable the workflow\n * New applications will be processed automatically\n\n"
},
"typeVersion": 1
},
{
"id": "5782b22a-f17c-4dd3-bf59-c1929d3d70fe",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1456,
-32
],
"parameters": {
"width": 368,
"height": 224,
"content": "## Watches for email with attachments"
},
"typeVersion": 1
},
{
"id": "7a32ee3d-51b3-48a5-88f6-6b1de399f318",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-736,
-336
],
"parameters": {
"width": 688,
"height": 272,
"content": "## Fetch the Job Post In Airtable\nUses Regex to find a code like FN-001 in the email subject and use it to find the Job Post in Airtable\n\n\n"
},
"typeVersion": 1
},
{
"id": "17e071af-7f26-4c72-a528-9fa8cc026aca",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-768,
176
],
"parameters": {
"width": 688,
"height": 352,
"content": "## Extract and Parse the CV Information\nGemini AI reads the CV text and extracts key info (name, skills, etc.) into structured JSON.\n\n\n"
},
"typeVersion": 1
},
{
"id": "8edcc4d8-58ec-422b-b6c2-df7b883f83cc",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
368,
64
],
"parameters": {
"width": 448,
"height": 496,
"content": "## Score Applicant with AI\nCompares the CV to the job details and generates a score (1-100) and a summary.\n\n\n"
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"995b95ca-ee4d-446a-886e-2500c34830c5": {
"main": [
[
{
"node": "d36f4b59-cffc-4fa9-bb92-070630555882",
"type": "main",
"index": 1
}
]
]
},
"026ad70e-f96a-4547-88cb-e95d07bb8d1a": {
"main": [
[
{
"node": "d36f4b59-cffc-4fa9-bb92-070630555882",
"type": "main",
"index": 0
}
]
]
},
"57948245-8761-4b3d-9493-7ec14bdcbfcb": {
"main": [
[
{
"node": "026ad70e-f96a-4547-88cb-e95d07bb8d1a",
"type": "main",
"index": 0
}
]
]
},
"31e468c3-3876-4789-bed7-ef9f274d4b0d": {
"main": [
[
{
"node": "995b95ca-ee4d-446a-886e-2500c34830c5",
"type": "main",
"index": 0
}
]
]
},
"17a29a4a-c659-48ba-be25-2a38de28cc58": {
"main": [
[
{
"node": "ad1babe0-ccfb-4941-9b86-cf59ad6c77ca",
"type": "main",
"index": 0
}
]
]
},
"d36f4b59-cffc-4fa9-bb92-070630555882": {
"main": [
[
{
"node": "17a29a4a-c659-48ba-be25-2a38de28cc58",
"type": "main",
"index": 0
}
]
]
},
"ba543316-f00d-452d-bdcb-929d264e2c30": {
"ai_languageModel": [
[
{
"node": "995b95ca-ee4d-446a-886e-2500c34830c5",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"6cc4f324-dcfe-4e9f-8af3-34074306d37b": {
"ai_outputParser": [
[
{
"node": "17a29a4a-c659-48ba-be25-2a38de28cc58",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"7a05b84b-ed92-4e55-b932-390725dd9cb2": {
"ai_languageModel": [
[
{
"node": "17a29a4a-c659-48ba-be25-2a38de28cc58",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"b6b4e893-d011-43d8-9453-cb27fa1a54ab": {
"main": [
[
{
"node": "57948245-8761-4b3d-9493-7ec14bdcbfcb",
"type": "main",
"index": 0
},
{
"node": "31e468c3-3876-4789-bed7-ef9f274d4b0d",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 인사, AI 요약
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
Gemini AI와 Decodo 크롤러를 사용하여 이력서와 직업을 자동으로 매칭
Gemini AI와 Decodo 크롤러를 사용하여 이력서와 직업을 자동으로 일치시킵니다.
Set
Gmail
Merge
+
Set
Gmail
Merge
20 노드Fahmi Fahreza
인사
내 워크플로우 3
AI, Gmail, Google Drive 및 Airtable을 사용한 자동 이력서 스크리닝 및 점수 부여
Set
Code
Merge
+
Set
Code
Merge
23 노드usamaahmed
인사
第一轮 Telegram 및 LinkedIn 快速通道 AI 招聘어시스턴트
AI候选人筛选流程:LinkedIn로Telegram,통합Gemini与Apify
If
Set
Code
+
If
Set
Code
55 노드Dean Pike
인사
Decodo와 Gemini를 사용한 Trustpilot 및 Sitejabber 감정 분석 및 Sheets에 저장
Decodo 및 Gemini를 사용하여 Trustpilot 및 Sitejabber 감성 분석 및 Sheets에 저장
Set
Merge
Form Trigger
+
Set
Merge
Form Trigger
18 노드Fahmi Fahreza
시장 조사
이력서와 직무 설명 매칭
Gemini LLM, Gmail 및 Notion 채용 공고 파일을 사용한 자동화된 이력서 점수 매기기
Wait
Gmail
Merge
+
Wait
Gmail
Merge
22 노드Agentick AI
인사
시각화 참조 라이브러리에서 n8n 노드를 탐색
可视化 참조 라이브러리에서 n8n 노드를 탐색
If
Ftp
Set
+
If
Ftp
Set
113 노드I versus AI
기타