Overview
In this tutorial, you will learn how to build an AI-powered resume screening workflow using n8n automation platform. This workflow automates the end-to-end recruitment process by extracting information from resumes, evaluating candidate profiles, scoring them, and routing the best candidates for further action. By leveraging n8n’s advanced AI nodes and integrations with Google Drive and OpenAI, you will create a scalable HR assistant that saves hours of manual work every week.
If you are new to OpenAI integration, consider reviewing the AI Automation with n8n and OpenAI lesson to get a solid foundation before proceeding.
Setting Up the Recruitment Workflow Trigger
The first step in automating resume screening is to capture incoming resumes. These resumes may come from email attachments or job application forms on your website. For this tutorial, you will simulate a job application form using the n8n Forms node.
Steps to Create the Form Trigger
Add a Trigger Node:
Search for and add then8n Forms Triggernode to your workflow. This node will listen for form submissions.Configure the Form:
- Title the form, e.g., Apply for the Job.
- Add form fields:
First Name(Text, Required)Last Name(Text)Email(Email type, Required)Resume(File upload, Required, accept only.pdf)
- Add a hidden field called
jobCodeto differentiate between multiple job postings. For example, assignjobCodevalues such as001for Full Stack Developer,002for Accounts Assistant, etc.
Publish the Form:
Save the form and note the production URL. This URL can be shared or embedded on your job postings to collect applications.Test the Form Submission:
Trigger the form by submitting a sample resume (PDF). The output JSON will contain the form data, including the uploaded file in binary format.
Uploading Resumes to Cloud Storage
To keep all candidate resumes organized, upload each resume to a dedicated Google Drive folder.
Configuring Google Drive Upload
Add the
Google DriveNode:
Connect the form trigger node to a Google Drive node.Set Operation:
- Resource: File
- Operation: Upload
Specify Input Data:
- Input Data Field Name: The name of the field containing the resume file (e.g.,
resume). - File Name: Create a custom filename using an expression combining:
This helps uniquely identify resumes by job code and candidate name.{{$json["jobCode"]}}-{{$json["firstName"]}}-{{$json["lastName"]}}.pdf
- Input Data Field Name: The name of the field containing the resume file (e.g.,
Select Destination Folder:
Choose the folder where resumes will be stored (e.g.,Resumes).Save and Test:
Run the workflow with a sample submission to verify the resume uploads correctly.
For more details on handling file uploads and binary data in n8n, refer to the File Management & Binary Data in n8n lesson. Also, the n8n Google Drive node documentation provides comprehensive guidance on configuration.
Extracting Text from Resume PDFs
Resumes are typically in PDF format, which requires conversion into text for AI processing.
Using the Extract from File Node
Add the
Extract from FileNode:
This node converts binary PDF data into JSON containing the resume’s text content.Configure the Node:
- Operation: Extract from PDF
- Input Binary Field: The field containing the uploaded PDF (e.g.,
resume).
Execute and Inspect Output:
The node outputs raw text extracted from the PDF in a large text blob. This unstructured data will be processed further to extract meaningful information.
For additional information, see the n8n Extract from File node documentation.
Extracting Structured Information with AI Nodes
Raw text from resumes is unstructured and difficult to analyze directly. You will use n8n’s advanced AI nodes to extract structured personal and professional information.
1. Extracting Personal Information
Use the Information Extractor AI node to parse candidate contact details and personal data.
Configuration
- Input Text: Use the extracted text field from the previous node.
- Schema Type: JSON Schema
- JSON Schema Example:
Define a JSON schema specifying the fields you want to extract. For example:
{
"title": "Personal Information",
"type": "object",
"properties": {
"fullName": {
"type": "string",
"description": "Full name of the candidate"
},
"email": {
"type": "string",
"format": "email",
"description": "Email address of the candidate"
},
"telephone": {
"type": "string",
"description": "Phone number, digits only"
},
"city": {
"type": "string",
"description": "Candidate's city of residence"
},
"linkedinProfile": {
"type": "string",
"description": "LinkedIn profile URL"
}
},
"required": ["fullName", "email", "telephone"]
}
System Prompt Template:
Provide instructions to the AI model, such as:
"You are an expert extraction algorithm. Only extract relevant information from the text. If an attribute is missing, set its value to 'NA'."Attach AI Model:
Add an OpenAI Chat Model node (e.g., GPT-4 or GPT-3.5 Turbo) as a child node within this cluster node.
Execution
Run the node and verify that it extracts personal information like the candidate’s full name, email, phone number, city, and LinkedIn profile in a structured JSON format.
2. Extracting Professional Information
Similarly, extract the candidate’s professional background such as education, job history, skills, and experience.
Configuration
- Input Text: Use the same extracted text field.
- Schema Type: Attribute Descriptions (UI-based schema creation)
- Attributes to Extract:
| Attribute | Type | Description | Required |
|---|---|---|---|
| educationalQualification | String | Summary of academic career focusing on undergraduate and university studies (max 100 words). | Yes |
| jobHistory | String | Summary of recent work experience (max 100 words). | Yes |
| skills | String | Technical and functional skills, formatted as a bulleted list. | Yes |
| experience | String | Total years of experience grouped by job function or role type (e.g., Account Executive: 2 years). | Yes |
| title | String | Most recent job title. | No |
| employer | String | Most recent employer. | No |
| totalYearsExperience | String | Total years of experience, formatted as total years exp: X. |
Yes |
- Attach AI Model:
Link the same OpenAI Chat Model used previously.
Execution
Run the node and check the output. The AI will summarize and structure the professional data, giving you clear fields for education, job history, skills, and experience.
For more on configuring AI nodes and OpenAI models, consult the OpenAI platform documentation.
Merging Extracted Data
After extracting personal and professional information in separate branches, merge the data into a single JSON object.
Using the Merge Node
Add a
MergeNode:
Connect the outputs of bothInformation Extractornodes (personal and professional).Configure Merge Mode:
- Mode:
Merge By IndexorCombine(depending on your data flow). - This consolidates both sets of structured data for a unified candidate profile.
- Mode:
Save and Test:
Execute the merge node and verify that the output contains all relevant fields combined appropriately.
Refer to the n8n Merge node documentation for detailed options and best practices.
Scoring Candidates and Automating Decisions
Once you have structured candidate data, you can automate scoring and decision-making.
Example Scoring Logic
- Assign scores based on skills, experience, and education.
- For example:
- Score > 7: Shortlist candidate
- Score 5-7: Add to “Maybe” list
- Score < 5: Archive candidate
You can implement this logic using the IF node or Code node in n8n. To master complex branching and decision-making, review the Master Conditional Logic in n8n lesson.
Automating Notifications
- Use the
Emailnode to notify shortlisted candidates and hiring managers. - Use the
Google Sheetsnode orGoogle Docsnode to update your application tracker with all extracted data and scores.
Common Mistakes & Troubleshooting
Incorrect File Field Names:
Ensure the file upload field matches exactly in all nodes (resumevs.rumétypo). Use consistent naming.Google Drive Credentials:
Make sure your Google Drive credentials are correctly set up and have permission to access the target folder.AI Model Configuration:
If the AI nodes fail, double-check the OpenAI API credentials and model selection.Schema Definitions:
Invalid JSON schemas or missing required fields can cause extraction errors. Validate your schema JSON or attribute definitions.Handling Missing Data:
Use the system prompt to instruct the AI to return "NA" for missing fields to avoid null or empty values.Large PDF Files:
For very large resumes, consider limiting the number of pages extracted or splitting the file to avoid timeouts.
For further troubleshooting and node-specific guidance, the n8n documentation is an excellent resource.
Additional Resources
- n8n Docs - Forms Trigger Node
- n8n Docs - Extract from File Node
- n8n Docs - Information Extractor Node
- n8n Docs - Google Drive Node
- n8n Docs - OpenAI Node
Quick Reference Cheat Sheet
| Step | Node Type | Key Settings |
|---|---|---|
| Trigger form submission | Forms Trigger |
Fields: firstName, lastName, email, resume (PDF), jobCode |
| Upload resume to cloud | Google Drive |
Operation: Upload, File field: resume, Filename: custom |
| Extract text from PDF | Extract from File |
Operation: Extract from PDF, Input Binary Field: resume |
| Extract personal info | Information Extractor |
Schema: JSON Schema, Attach OpenAI Chat Model |
| Extract professional info | Information Extractor |
Schema: Attribute Descriptions, Attach OpenAI Chat Model |
| Merge extracted data | Merge |
Mode: Merge By Index or Combine |
| Score and decision logic | IF / Code |
Custom logic based on extracted data |
| Notify candidates and managers | Email |
Dynamic recipient, customized email content |
| Log application | Google Sheets / Docs |
Append candidate data and scores |
By following this tutorial and adapting the nodes as needed, you will create a powerful AI resume screening assistant that automates tedious manual tasks and enhances your recruitment workflow efficiency. As shown in the video above, breaking down the extraction process into smaller, structured chunks yields better accuracy and easier maintenance. Happy automating!