Stop manually reading every CV. This workflow watches your inbox, extracts CV text using Mistral OCR, scores every candidate against your job description using Google Gemini AI, and automatically routes them - shortlisted candidates get a professional interview invite, rejected ones get a polite decline, and HR receives a full AI summary with the CV attached. All hands-free.
Manually reviewing CVs is time-consuming, inconsistent, and expensive. This workflow eliminates the bottleneck by automatically:
You focus on interviewing. The pipeline handles everything else.
mistral-ocr-latest model reads the CV and outputs clean structured textfrom field, and passes the binary CV forwardshortlisted candidates to the true branch and rejected to the false branchYou need to set up 4 credentials in n8n:
| Credential | Node Used | Where to Get It |
|---|---|---|
| IMAP account | Email Trigger | Your email provider settings (Gmail: use App Password) |
| Mistral Cloud API | OCR Extraction | Mistral AI Studio → API Keys |
| Google Gemini (PaLM) API | AI Scoring | Google AI Studio → Get API Key |
| SMTP account | All 3 email nodes | Your email provider SMTP settings |
💡 Gmail users: Enable 2FA and generate an App Password for both IMAP and SMTP. Use
imap.gmail.com:993andsmtp.gmail.com:587.
In all 3 Send Email nodes, replace the placeholder emails:
fromEmail → your sending address (e.g. [email protected])toEmail in the HR node → your HR team's inbox{{ $json.candidate_email }})Open the 🤖 AI Score CV (Gemini) node and replace the JOB DESCRIPTION: section in the prompt with your actual role requirements. The current template uses an AI Engineer JD from AppStoneLab as a working example.
In the 📧 Send Interview Invite to Candidate node, find YOUR_CALENDLY_OR_CAL_LINK_HERE in the HTML and replace it with your actual booking link (Calendly, Cal.com, TidyCal, etc.).
| What to Change | Where | Example |
|---|---|---|
| Job description | Gemini node prompt | Swap in your own role requirements |
| Scoring threshold | IF node condition | Change "shortlisted" to score-based logic e.g. score >= 70 |
| Company name & branding | All 3 HTML email templates | Replace "AppStoneLab Technologies" with your company |
| Careers page URL | Decline email HTML | Replace appstonelab.com/career with your URL |
| AI model | Gemini node | Switch to gemini-3-flash-preview or gemini-3.1-pro-preview for different speed/quality |
| Watched mailbox | IMAP trigger | Change INBOX to a dedicated folder like INBOX.careers |
| Interview questions | Invite email HTML | Add/edit the "What to Expect" section steps |
mistral-ocr-latestgemini-3-flash-preview is fast and cheap for productionResolved (not Simple) - this is required for binary attachment data to flow correctly through the workflowExtract from File nodefrom.value[0].address path to extract the candidate's email from the IMAP trigger output - this is the correct path for the Resolved formatDrop a comment on this template or reach out on the n8n community forum. Happy to help you adapt this for your specific hiring use case.