πŸ‘₯ Screen job applications from Google Forms with Google Gemini and email results

⚑ 41 views Β· πŸ‘₯ HR & Recruitment

Description

πŸ€– AI Resume Screener β€” Google Forms to Automated Shortlisting & Email

Automatically score every job application with AI, update your tracking sheet, and send personalised emails to candidates β€” all without human review.


πŸ“– Description

This workflow automates your entire first-round resume screening process. When a candidate submits your Google Form application, the workflow triggers, extracts their details, scores them against the job description using AI, writes the results back to your Google Sheet, and sends the right email β€” a congratulations to shortlisted candidates, a polite rejection to others.

Your HR team only reviews candidates the AI has already scored 7 or above.

Built for companies hiring across multiple roles simultaneously, HR teams wanting to reduce screening time, and startups with no dedicated recruiting staff.


✨ Key Features


πŸ”„ How It Works

New Google Form submission
          ↓
Google Sheets Trigger (rowAdded, polls every minute)
          ↓
Read All Rows β†’ Filter Unprocessed Rows (col_18 / Processed β‰  1)
          ↓
Extract Fields + Load Job Description
  β†’ name, email, phone, position, experience, skills, cover note
  β†’ loads matching JD from built-in map
          ↓
AI Resume Scorer (Google Gemini)
  β†’ score: 1–10
  β†’ grade: Strong Yes / Maybe / No
  β†’ strengths, weaknesses, recommendation, summary
          ↓
Parse AI Output (3-layer fallback)
          ↓
Build Sheet Request β†’ Write to Sheet via API
  β†’ writes score, grade, strengths, weaknesses,
    recommendation, summary, status, timestamp, Processed=1
          ↓
Score β‰₯ 7?
  βœ… YES β†’ Alert Email to HR + Wait 10s β†’ Shortlist Email to Candidate
  ❌ NO  β†’ Rejection Email to Candidate

πŸ€– AI Scoring System

The AI scores each candidate from 1 to 10 against the job description:

ScoreGradeAction
8–10Strong YesShortlisted βœ…
7Strong Yes / MaybeShortlisted βœ…
5–6MaybeRejected ❌
1–4NoRejected ❌

For each application the AI also provides:


πŸ“‹ Built-in Job Descriptions

Five roles are pre-configured and auto-matched by position name:

RoleKey Requirements
Frontend Developer2+ yrs React/Vue, HTML/CSS/JS, REST APIs, Git
Backend Developer2+ yrs Node.js/Python/Java, PostgreSQL/MongoDB, Docker
UI/UX Designer2+ yrs UI/UX, Figma or Adobe XD, portfolio
Project Manager3+ yrs PM, PMP/Scrum preferred, Jira/Asana
Digital Marketing Executive2+ yrs digital marketing, Google Ads, Meta Ads, GA4

Add more roles by editing the JD_MAP object in the Extract Fields + Load JD node.


πŸ“§ Email Templates

Shortlist Email (to candidate)

HR Alert Email (internal)

Rejection Email (to candidate)


πŸ›  Setup Requirements

1. Google Form

Create a Google Form with these fields:

FieldType
Full NameShort answer
Email AddressShort answer
Phone NumberShort answer
Select the Position You Are Applying ForDropdown
Years of ExperienceShort answer
Relevant SkillsLong answer
Cover NoteLong answer

Link the form to a Google Sheet (Responses tab).

2. Google Sheet β€” Response Sheet Columns

The form creates columns A–H automatically. Add these columns manually for AI results:

ColHeaderFilled by
ATimestampGoogle Forms
BSelect the Position…Google Forms
CFull NameGoogle Forms
DEmail AddressGoogle Forms
EPhone NumberGoogle Forms
FYears of ExperienceGoogle Forms
GRelevant SkillsGoogle Forms
HUpload CVGoogle Forms
ICover NoteGoogle Forms
JAI ScoreThis workflow
KGradeThis workflow
LStrengthsThis workflow
MWeaknessesThis workflow
NRecommendationThis workflow
OSummaryThis workflow
PStatusThis workflow
QProcessed AtThis workflow
RProcessedThis workflow (1 = done)

> Important: The workflow uses column R (Processed) to track which rows have been scored. Rows where R = 1 are skipped on subsequent triggers.

3. Credentials Required

CredentialUsed forFree?
Google Sheets Trigger OAuth2Detects new rowsFree
Google Sheets OAuth2Read rows + write resultsFree
Google Gemini (PaLM) APIAI resume scoringFree tier available
SMTPSending emailsDepends on provider

4. Update Sheet ID

In the Read All Rows and Write to Sheet via API nodes, replace the Sheet ID with your own:

https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID/...

5. Update Email Addresses

In all three email nodes, update:


βš™οΈ Workflow Nodes

NodeTypePurpose
Google Sheets TriggerTriggerFires on new row (polls every minute)
Read All RowsGoogle SheetsReads all form responses
Filter Unprocessed RowsCodeSkips rows where Processed = 1
Extract Fields + Load JDCodeExtracts candidate data + matches JD
AI Resume ScorerAI AgentScores candidate vs JD using Gemini
Google Gemini Chat ModelLLMAI model for scoring
Parse AI OutputCodeParses JSON with 3-layer fallback
Build Sheet RequestCodePrepares API write request for exact row
Write to Sheet via APIHTTP RequestWrites results to columns J–R
Score β‰₯ 7?IFRoutes by score
Alert Email - HR TeamEmail SendNotifies HR of strong candidates
Wait 10sWaitPrevents SMTP rate limiting
Shortlist Email - CandidateEmail SendCongratulations to shortlisted
Rejection Email - CandidateEmail SendPolite rejection to others

πŸ”‘ Key Technical Details

Why HTTP Request for sheet write instead of Google Sheets node? The standard Google Sheets node cannot reliably write to a specific row by row number. Using the Sheets API PUT values/{range} endpoint writes to the exact cell range Form responses 1!J{rowNum}:R{rowNum} β€” always the correct row regardless of concurrent submissions.

Why Read All Rows then Filter instead of reading one row? The Google Sheets Trigger fires on rowAdded but may not pass the exact new row data reliably. Reading all rows and filtering by Processed β‰  1 is more reliable and handles backlog processing too.

The Processed column (R) Set to 1 after scoring completes. This prevents re-processing if the trigger fires again before the workflow finishes, or if old unprocessed rows exist.

3-layer AI output fallback:

  1. Direct JSON parse
  2. Strip markdown fences then parse
  3. Regex extract JSON block
  4. Default values if all fail (score: 5, grade: Maybe)

πŸ“Š Sample Sheet Output After Scoring

Col J  (AI Score):      8
Col K  (Grade):         Strong Yes
Col L  (Strengths):     3+ yrs React experience; Strong TypeScript skills; Relevant API work
Col M  (Weaknesses):    No Docker experience mentioned; No TypeScript explicitly listed
Col N  (Recommendation): Invite for technical interview
Col O  (Summary):       Strong frontend candidate with solid React/Vue background. Experience aligns well with role requirements. Minor gaps in DevOps knowledge.
Col P  (Status):        Shortlisted
Col Q  (Processed At):  2026-03-18T10:30:00.000Z
Col R  (Processed):     1

πŸ”§ Customisation

Add more roles: Edit the JD_MAP object in Extract Fields + Load JD:

const JD_MAP = {
  'Your New Role': 'ROLE: ... REQUIREMENTS: ...',
  // add as many as needed
};

Change the score threshold: In the Score β‰₯ 7? IF node, change rightValue: 5 to any number. Setting to 8 makes the bar higher (only Strong Yes candidates shortlisted).

Add a second HR alert channel: After the HR Alert Email, add a Slack or Telegram node to ping your team instantly for high-scoring candidates.

Add calendar booking link: Include a Calendly link in the shortlist email so candidates can self-schedule interviews immediately.

Extend with CV parsing: Add a Google Drive node before the AI scorer to download the CV attachment, extract text, and include it in the AI prompt for more accurate scoring.


⚠️ Important Notes


πŸ’‘ Enhancement Ideas


πŸ“¦ Requirements Summary


Built with n8n Β· Google Gemini AI Β· Google Forms Β· Google Sheets Β· SMTP

πŸ”— Nodes Used

Send Email, Google Sheets, HTTP Request, Google Sheets Trigger, AI Agent, Google Gemini Chat Model

πŸ“₯ Import

Download workflow.json and import into n8n: Workflow menu β†’ Import from File

πŸ“– Importing guide Β· πŸ”‘ Credential setup