Gmail to Google Sheets, scored resumes in one view
Your inbox turns into a hiring queue. Resumes arrive as PDFs, DOCX files, and the occasional weird text attachment, and then someone has to download everything, rename files, scan for basics, and paste notes into a spreadsheet that’s never quite up to date.
Recruiters feel the pain first, because speed matters. But a hiring manager trying to compare candidates and a small operations lead juggling HR on the side gets buried too. This Gmail Sheets resumes automation turns incoming resume emails into a consistent, scored row in Google Sheets, usually in minutes.
You’ll see how the workflow captures attachments, extracts text, uses GPT-4o to score candidates against your role requirements, and logs everything in one review-ready view.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Gmail to Google Sheets, scored resumes in one view
flowchart LR
subgraph sg0["Incoming Email Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Incoming Email Trigger", pos: "b", h: 48 }
n1@{ icon: "mdi:cog", form: "rounded", label: "Store in Drive", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "File Type Router", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "Download Doc PDF", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Parse PDF Content", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Convert DOCX File"]
n6@{ icon: "mdi:cog", form: "rounded", label: "Fetch Doc Text", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Grab TXT File", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "Read TXT Content", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Normalize Resume Fields", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Define Role Details", pos: "b", h: 48 }
n11@{ icon: "mdi:robot", form: "rounded", label: "AI Screening Review", pos: "b", h: 48 }
n12@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n13@{ icon: "mdi:robot", form: "rounded", label: "Structured Result Parser", pos: "b", h: 48 }
n14@{ icon: "mdi:robot", form: "rounded", label: "Extract Candidate Details", pos: "b", h: 48 }
n15@{ icon: "mdi:database", form: "rounded", label: "Append Sheet Record", pos: "b", h: 48 }
n3 --> n4
n7 --> n8
n12 -.-> n11
n12 -.-> n14
n1 --> n2
n0 --> n1
n6 --> n9
n10 --> n11
n4 --> n9
n2 --> n3
n2 --> n5
n2 --> n7
n8 --> n9
n5 --> n6
n11 --> n14
n14 --> n15
n9 --> n10
n13 -.-> n11
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n11,n13,n14 ai
class n12 aiModel
class n2 decision
class n15 database
class n5 api
classDef customIcon fill:none,stroke:none
class n5 customIcon
The Problem: Resume screening becomes inbox triage
Manual resume screening is the kind of work that looks “quick” until you do it 30 times in a row. You open an email, download the attachment, realize it’s a DOCX, convert it, skim for role basics, then try to remember what you thought about the last candidate. Meanwhile, someone asks, “Who are our top three?” and you have to reconstruct your own opinions from scattered notes. Errors creep in too: wrong file saved to the wrong folder, duplicate entries, missed attachments, and inconsistent scoring because everyone evaluates differently when they’re rushed.
It adds up fast. Here’s where it breaks down in real teams.
- Each resume creates a mini checklist of downloads, naming, saving, and note-taking that quietly eats about 10 minutes per candidate.
- PDFs, DOCX, and TXT formats force you into extra steps, and those steps are where people miss details.
- When feedback isn’t standardized, “good candidate” means something different depending on who reviewed the file.
- Spreadsheets fall behind, so hiring decisions get made from memory instead of a reliable, current view.
The Solution: Gmail-to-Sheets AI resume screening you can trust
This workflow watches your Gmail inbox for resume emails and grabs the attachment as soon as it arrives. It stores the file in Google Drive so you have clean organization (and a consistent place to find originals later). Then it routes the file based on type: PDFs get text extracted, DOCX files get converted and fetched as readable text, and TXT resumes are read directly. Once the resume text is normalized, the workflow adds your role requirements and passes both into a GPT-4o powered screening agent. The AI produces structured scoring and written justification, extracts candidate details like contact info and key qualifications, and finally appends a neat row into Google Sheets for your team to review.
The workflow starts with a Gmail trigger. From there, Google Drive handles storage and file conversion support, while GPT-4o does the screening and consistent scoring. Google Sheets becomes the single, shared dashboard where candidates land with the same format every time.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you receive 25 resumes a week for one open role. Manually, if each one takes about 10 minutes to download, convert (sometimes), skim, and log into a spreadsheet, that’s roughly 4 hours. With this workflow, the “human time” becomes closer to 1 minute per candidate to review the scored row and decide next steps. The processing runs in the background, so you get most of those hours back without losing structure.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Gmail to trigger on incoming resume emails
- Google Drive for storing and accessing resume files
- Google Sheets to log candidate scores and notes
- OpenAI API key (get it from your OpenAI dashboard)
Skill level: Beginner. You will connect accounts, paste an API key, and edit the job description text.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Email trigger from Gmail. When a new resume email arrives (with an attachment), n8n picks it up automatically, so nobody has to “check the inbox” as a process.
File storage and format routing. The attachment is stored in Google Drive, then routed based on file type. PDFs get parsed for text, DOCX files go through conversion and text fetching, and TXT resumes are read directly.
Resume normalization and role context. The workflow cleans the extracted text into a consistent input and merges it with the role requirements you define (the “Define Role Details” part is where your job description lives).
AI screening and structured logging. GPT-4o evaluates the candidate, produces a structured score with reasoning, extracts key candidate details, then appends everything as a new row in Google Sheets for easy sorting and review.
You can easily modify the scoring criteria to match different roles, then map the outputs to new Google Sheets columns based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Incoming Email Trigger
Set up the email trigger to capture incoming resumes and download attachments for processing.
- Add the Incoming Email Trigger node and set Simple to
false. - In Options, enable Download Attachments to collect resume files.
- Set Poll Times to
everyMinute. - Credential Required: Connect your gmailOAuth2 credentials.
Step 2: Connect Google Drive and Route by File Type
Store the resume file in Drive and route it based on the MIME type to the right parser path.
- Configure Store in Drive with Name set to
={{ $json.subject.replace(/[^a-zA-Z0-9]/g, '_') }}_resume_{{ $now.format('yyyy-MM-dd_HH-mm') }}and Input Data Field Name set toattachment_0. - Credential Required: Connect your googleDriveOAuth2Api credentials to Store in Drive.
- In File Type Router, add rules for PDF, DOCX, and TXT using Left Value
={{ $json.mimeType }}with right values ofapplication/pdf,application/vnd.openxmlformats-officedocument.wordprocessingml.document, andtext/plain. - Connect File Type Router outputs to Download Doc PDF, Convert DOCX File, and Grab TXT File respectively.
- Credential Required: Connect your googleDriveOAuth2Api credentials to Download Doc PDF, Convert DOCX File, and Grab TXT File.
Step 3: Extract and Normalize Resume Content
Parse the file content (PDF, DOCX, or TXT) and normalize it into a standard resume field.
- In Download Doc PDF, keep Operation as
downloadand ensure the file ID uses={{ $json.id }}with Google file conversion toapplication/pdf. - Configure Parse PDF Content with Operation set to
pdfand Max Pages set to10. - In Convert DOCX File, set URL to
=https://www.googleapis.com/drive/v2/files/{{ $json.id }}/copyand JSON Body to{ "title": "{{ $json.name }}_converted", "mimeType": "application/vnd.google-apps.document" }. - In Fetch Doc Text, keep Operation as
downloadand convert Google Docs totext/plain. - In Read TXT Content, set Operation to
textand Destination Key toresumeText. - Configure Normalize Resume Fields with these assignments: candidateResume =
={{ $json.text || $json.data || $json.resumeText }}, originalEmail =={{ $('Incoming Email Trigger').item.json }}, and driveLink =={{ $('Store in Drive').item.json.webViewLink }}.
text/plain.Step 4: Set Up AI Screening and Candidate Extraction
Define role details, run the AI screening review, and extract candidate attributes.
- In Define Role Details, set jobDescription to the provided multi-line role description.
- Configure AI Screening Review with Text set to
=**CANDIDATE RESUME:** {{ $('Parse PDF Content').item.json.text }} **JOB DESCRIPTION:** {{ $json.jobDescription }}and keep Has Output Parser enabled. - Connect OpenAI Chat Model as the language model for AI Screening Review and Extract Candidate Details.
- Credential Required: Connect your openAiApi credentials to OpenAI Chat Model. The Structured Result Parser is a sub-node—credentials are added on OpenAI Chat Model, not the parser.
- In Structured Result Parser, keep Schema Type as
manualand use the provided JSON schema in Input Schema. - Set Extract Candidate Details Text to
={{ $('Normalize Resume Fields').item.json.candidateResume }}and keep the listed attributes (full_name, email_address, phone_number, current_title, years_experience, key_skills).
gpt-4o-mini, maxTokens: 2000, temperature: 0.3) only if you need different output length or creativity.Step 5: Configure Output to Google Sheets
Append structured screening results and candidate details into your tracking sheet.
- In Append Sheet Record, set Operation to
append, select your Document ID, and choose Sheet NameSheet1. - Map columns to values, such as Date =
={{ $('Store in Drive').item.json.createdTime }}, Email =={{ $json.output.email_address }}, Strengths =={{ $('AI Screening Review').item.json.output.candidate_strengths.join("\n\n") }}, and Overall Fit =={{ $('AI Screening Review').item.json.output.overall_score }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials.
Overall Fit, Risk Factor, Reward Factor).Step 6: Test and Activate Your Workflow
Verify the workflow end-to-end, then activate it for production use.
- Manually send an email with a resume attachment to the account monitored by Incoming Email Trigger.
- Run the workflow and confirm that Store in Drive creates a file, and File Type Router sends it to the correct branch.
- Verify that Normalize Resume Fields contains
candidateResumeand that AI Screening Review produces structured output parsed by Structured Result Parser. - Check Append Sheet Record to confirm a new row is appended with strengths, weaknesses, and overall score.
- Once verified, switch the workflow to Active to process resumes automatically.
Common Gotchas
- Gmail and Google Drive permissions can be picky. If the workflow suddenly stops seeing attachments, check the OAuth connection inside n8n’s Credentials and confirm the Gmail scope still has access.
- If you’re converting DOCX files via HTTP Request, response speed can vary depending on the service and file size. When downstream nodes fail or return blank text, extend waits or add a retry so the next nodes don’t run on empty content.
- The default AI prompt will feel generic fast. Bake in your job requirements and your “deal-breakers” early, otherwise you will end up re-reading and re-scoring candidates manually anyway.
Frequently Asked Questions
About 20 minutes if your accounts are ready.
No. You’ll connect your accounts and edit the job description and scoring prompt inside n8n.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API costs (often a few cents per resume, depending on length).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s one of the best reasons to use n8n here. Update the role requirements in the “Define Role Details” step, then tailor the scoring rubric in the AI Screening Review prompt for each position. Many teams also adjust what gets extracted in “Extract Candidate Details” so different roles capture different fields (portfolio links, certifications, tools, or location). If you want separate spreadsheets per role, you can switch the Google Sheets destination or add simple routing based on the email label.
Usually it’s expired OAuth credentials or changed permissions. Reconnect Gmail inside n8n Credentials, then confirm the trigger is watching the correct mailbox and label/filter. Also check if your Google Workspace admin restricted third-party access, which can break previously working setups.
On n8n Cloud, your limit depends on plan executions per month, and self-hosting depends on your server. Practically, most small teams can process dozens to a few hundred resumes a week as long as you stay within OpenAI rate limits and keep file conversion reliable.
Often, yes. n8n handles branching logic (PDF vs DOCX vs TXT), structured parsing, and richer AI chains in one place, which means fewer fragile “glue” steps. Self-hosting is also a big deal if your resume volume spikes, because you’re not paying per tiny task. Zapier or Make can be fine for simple “email to sheet” capture, but AI screening plus file handling tends to get messy fast. If you want, Talk to an automation expert and we’ll map the cleanest route for your setup.
Once this is running, your spreadsheet becomes the hiring inbox. You review candidates, not attachments, and you get your week back in the process.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.