Notion + Google Sheets for faster resume screening
Resume screening starts simple. Then you’re buried in PDFs, half-filled forms, and “where did that candidate go?” messages that eat your morning.
This Notion resume screening automation hits recruiters first, but hiring managers and ops leads feel the drag too. You get a consistent score, a clean Notion record, and an audit trail in Google Sheets without chasing files or re-reading the same resume twice.
Below, you’ll see how the workflow routes applicants from an application form into Notion, uses AI to summarize and score, then updates the record again after an AI voice interview.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Notion + Google Sheets for faster resume screening
flowchart LR
subgraph sg0["Application Form 1 of 3 Flow"]
direction LR
n0["<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/merge.svg' width='40' height='40' /></div><br/>Merge"]
n1@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n2@{ icon: "mdi:robot", form: "rounded", label: "HR Expert", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "Upload CV", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Extract Resume", pos: "b", h: 48 }
n5@{ icon: "mdi:robot", form: "rounded", label: "Applicant Summary", pos: "b", h: 48 }
n6@{ icon: "mdi:robot", form: "rounded", label: "Job Description Summary", pos: "b", h: 48 }
n7@{ icon: "mdi:robot", form: "rounded", label: "Applicant Qualifications", pos: "b", h: 48 }
n8@{ icon: "mdi:robot", form: "rounded", label: "Applicant Personal Data", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Application Data", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-vertical", form: "rounded", label: "Resume URL", pos: "b", h: 48 }
n17["<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/notion.dark.svg' width='40' height='40' /></div><br/>Get Applicant Record"]
n18["<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/notion.dark.svg' width='40' height='40' /></div><br/>Embed Resume in Notion"]
n19@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n20["<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/form.svg' width='40' height='40' /></div><br/>Application Form 1 of 3"]
n21["<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/form.svg' width='40' height='40' /></div><br/>Application Form 2 of 3"]
n22["<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/form.svg' width='40' height='40' /></div><br/>Application form 3 of 3"]
n23["<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/notion.dark.svg' width='40' height='40' /></div><br/>Get Job Description"]
n24@{ icon: "mdi:swap-vertical", form: "rounded", label: "Job Description Mapping", pos: "b", h: 48 }
n25@{ icon: "mdi:database", form: "rounded", label: "Applicant Data Backup", pos: "b", h: 48 }
n26["<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/notion.dark.svg' width='40' height='40' /></div><br/>Create Applicant Record"]
n28@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini", pos: "b", h: 48 }
n19 --> n17
n0 --> n5
n2 --> n25
n3 --> n16
n16 --> n19
n28 -.-> n5
n28 -.-> n7
n28 -.-> n2
n28 -.-> n8
n28 -.-> n6
n4 --> n7
n4 --> n8
n9 --> n4
n5 --> n23
n23 --> n6
n17 --> n18
n25 --> n26
n8 --> n0
n20 --> n3
n20 --> n9
n21 --> n3
n21 --> n9
n22 --> n3
n22 --> n9
n24 --> n2
n6 --> n24
n7 --> n0
n1 -.-> n2
end
subgraph sg1["AI Agent Flow"]
direction LR
n10["<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/webhook.dark.svg' width='40' height='40' /></div><br/>ElevenLabs Web Hook"]
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "ai_convo_items", pos: "b", h: 48 }
n12["<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/>Extract_Audio"]
n13@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter_Notion_db", pos: "b", h: 48 }
n14@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n15["<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/notion.dark.svg' width='40' height='40' /></div><br/>Link Audio in Notion"]
n27@{ icon: "mdi:cog", form: "rounded", label: "Upload Audio to Drive", pos: "b", h: 48 }
n29@{ icon: "mdi:database", form: "rounded", label: "Evaluation Criteria", pos: "b", h: 48 }
n30["<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/notion.dark.svg' width='40' height='40' /></div><br/>Applicant Record"]
n31["<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/notion.dark.svg' width='40' height='40' /></div><br/>Update_Applicant_Record"]
n32@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Model", pos: "b", h: 48 }
n14 --> n30
n12 --> n27
n11 --> n14
n30 --> n13
n13 --> n31
n10 --> n11
n29 -.-> n14
n32 -.-> n14
n27 --> n15
n31 --> n12
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 n20,n21,n22 trigger
class n1,n2,n5,n6,n7,n8,n14 ai
class n28,n32 aiModel
class n13 decision
class n17,n18,n23,n25,n26,n15,n29,n30,n31 database
class n10,n12 api
classDef customIcon fill:none,stroke:none
class n0,n17,n18,n20,n21,n22,n23,n26,n10,n12,n15,n30,n31 customIcon
Why This Matters: Resume screening slows hiring decisions
Most hiring bottlenecks aren’t “lack of candidates.” It’s the messy middle: resumes arrive in different formats, details are missing, and screening notes end up scattered across email threads, docs, and someone’s private spreadsheet. So you re-open the same PDF three times. You second-guess your own scoring. And the moment you finally identify a top fit, scheduling and the first interview becomes another round of manual follow-ups. It’s exhausting, and frankly it makes good hiring feel random.
The friction compounds. Here’s where things usually break down.
- Resumes and notes live in too many places, so “one source of truth” never actually happens.
- Different screeners use different criteria, which means inconsistent scores and more debate than progress.
- Compliance and audit requests turn into a scramble because there’s no reliable log of what you reviewed and when.
- First-round interviews take days to schedule, even though most of them are meant to filter, not finalize.
What You’ll Build: Notion-first screening with a Google Sheets audit log
This workflow creates a single pipeline from “new applicant” to “screened, scored, and ready to interview,” with Notion as your dashboard and Google Sheets as your compliance-friendly log. It starts when an applicant submits an n8n application form (the template supports three roles in parallel). Their resume is uploaded to Google Drive, then the PDF is parsed so AI can extract contact data and qualifications. Next, the workflow generates a candidate summary and evaluates fit against the role’s job description and criteria stored in Notion. Finally, it creates or updates the applicant record in your Notion ATS, logs the intake to Google Sheets, and keeps enriching that record after an ElevenLabs voice interview by attaching audio, transcript-derived insights, and an interview score.
The workflow begins at the application form, then moves through resume parsing and AI scoring, and finishes by writing clean records into Notion plus a backup row in Sheets. When an AI interview happens, a webhook brings results back, audio is saved to Drive, and the same Notion profile gets updated with an interview assessment.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say you receive 20 resumes a week for one role. Manually, it’s easy to spend about 10 minutes per resume saving files, extracting details, adding notes, and copying basics into a tracker, which is roughly 3 hours. Then add another couple hours for writing a consistent summary and aligning on a score with the hiring manager. With this workflow, intake is a form submission plus automated processing and updates, so your hands-on time is closer to quick review and decision-making. You typically get those 4–5 hours back each week, and the shortlist is clearer.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Notion to store applicants, roles, and evaluation criteria
- Google Sheets to maintain an applicant audit log
- ElevenLabs API key (create it in ElevenLabs account settings)
Skill level: Intermediate. You’ll connect accounts, map a few fields, and adjust prompts and rubrics to match your hiring process.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
An applicant submits your application form. One of the n8n form triggers fires (the template includes three), capturing applicant details and the uploaded resume.
The resume is stored and parsed. The workflow uploads the file to Google Drive, then extracts text from the PDF so AI can work with it reliably instead of guessing from a screenshot or a messy paste.
AI summarizes and scores against the role. Role details and evaluation criteria are pulled from Notion, then an AI agent produces a candidate summary, qualifications breakdown, and a resume score (1–10) with rationale you can skim.
Records are created, logged, and later enriched after interviews. The workflow writes the applicant into your Notion ATS, adds a Google Sheets backup row for audit and compliance needs, and when ElevenLabs posts interview results via webhook, it attaches audio and updates the same Notion profile with an interview score (1–5) and insights.
You can easily modify the scoring rubric and the “advance” thresholds in Notion based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Triggers
Set up the three application intake forms that feed candidate data and resumes into the workflow.
- Open Application Form A and set Form Title to
Sr Account Executiveand Form Description to[Company Name]. - In Application Form A, confirm the hidden job_code field value is
300and the Resume field accepts.pdf. - Open Application Form B and set Form Title to
Full Stack Developerand Form Description to[Company Name]. - In Application Form B, confirm the hidden Job Code field value is
200and Resume accepts.pdf. - Open Application Form C and set Form Title to
IT Support Analystand Form Description to[Company Name]. - In Application Form C, confirm the hidden Job Code field value is
100and Resume accepts.pdf.
Execution Flow: Application Form A outputs to both Upload Resume File and Applicant Intake Data in parallel. The same parallel flow applies to Application Form B and Application Form C.
Step 2: Connect Google Drive for Resume and Audio Storage
Store uploaded resumes and interview audio files in Google Drive.
- Open Upload Resume File and set Input Data Field Name to
Resume. - Credential Required: Connect your googleDriveOAuth2Api credentials in Upload Resume File.
- Open Save Audio to Drive and set Name to
{{ $json.name }}. - Credential Required: Connect your googleDriveOAuth2Api credentials in Save Audio to Drive.
- Open Resume Preview URL and set resume_url to
https://drive.google.com/file/d/{{ $json.id }}/preview.
Step 3: Parse and Extract Resume Data
Convert PDF resumes into structured candidate information and merge the extracted data.
- Open Applicant Intake Data and confirm the assignments use
{{ $json.undefined }}for job_code and{{ $json.submittedAt }}for date_time, with Include Other Fields enabled. - Open Parse Resume PDF and set Operation to
pdfand Binary Property Name toResume. - Open Candidate Qualifications and set Text to
{{ $json.text }}to extract education, job history, skills, and experience. - Open Candidate Contact Data and set Text to
{{ $json.text }}with the provided schema for telephone, city, full_name, and email. - Open Combine Streams and set Mode to
combineand Combine By tocombineAll.
Execution Flow: Parse Resume PDF outputs to both Candidate Qualifications and Candidate Contact Data in parallel, then both feed into Combine Streams.
Step 4: Configure AI Summaries and HR Alignment Scoring
Summarize candidates and roles, then score alignment using Gemini-based chains and a structured output parser.
- Open Candidate Summary and keep the summarization prompt that references
{{ $json.output["Educational qualification"] }},{{ $json.output["Job History"] }}, and{{ $json.output.Skills }}. - Open Fetch Role Details and ensure the filter matches Job Code|select to
{{ $('Applicant Intake Data').item.json.job_code }}. Credential Required: Connect your notionApi credentials. - Open Role Summary and set Text to
{{ $json.property_job_description }}. - Open Map Role Description and set job_description to
{{ $json.response.text }}. - Open HR Alignment Reviewer and keep Text as
Profile received: {{ $json.job_description }} ... {{ $('Candidate Summary').item.json.response.text }}, with Has Output Parser enabled. - Open Structured Result Parser and confirm the schema includes
resume_scoreandresume_evaluation. - Credential Required: Connect your googlePalmApi credentials in Gemini Chat Model and Gemini Model Agent, then ensure these are connected as the language model for Candidate Summary, Candidate Qualifications, Candidate Contact Data, Role Summary, and Interview Evaluation Agent.
AI Tool Reminder: Structured Result Parser is an AI output parser; credentials are added on the parent chain node, not on the parser itself.
Step 5: Create and Update Notion Applicant Records
Write candidate records to Notion and embed resume links after upload.
- Open Create Applicant Entry and set Title to
{{ $('Applicant Intake Data').item.json.Name }} | {{ $('Combine Streams').item.json.output['Title & Employer'] }}. Credential Required: Connect your notionApi credentials. - Open Fetch Applicant Entry and confirm the filter uses Resume |files with condition
is_empty. Credential Required: Connect your notionApi credentials. - Open Embed Resume Link and set the file URL to
{{ $('Resume Preview URL').item.json.resume_url }}for Resume |files. Credential Required: Connect your notionApi credentials. - Open Pause Processing to keep the wait behavior between resume upload and Notion update.
Execution Flow: Resume Preview URL → Pause Processing → Fetch Applicant Entry → Embed Resume Link.
Step 6: Log Applicants to Google Sheets Backup
Append a structured record of each applicant to Google Sheets for backup and reporting.
- Open Log Applicant Backup and confirm Operation is
append. - Verify the column mappings use expressions like
{{ $('Combine Streams').item.json.output['Total Years Experience'] }}and{{ $json.output.resume_score }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Log Applicant Backup.
Step 7: Configure Interview Evaluation Intake and Matching
Capture ElevenLabs interview analysis data, evaluate responses, and match to Notion applicants.
- Open ElevenLabs Incoming Hook and keep HTTP Method set to
POST. - Open AI Conversation Fields and confirm the fields map to expressions like
{{ $json.body.data.analysis.evaluation_criteria_results.problem_solving.result }}and{{ $json.body.data.conversation_initiation_client_data.dynamic_variables.system__conversation_id }}. - Open Interview Evaluation Agent and set Text to
{{ $json.full_transcript }}with Has Output Parser enabled. - Open Retrieve Evaluation Rules and confirm it filters Notion records where evaluation_criteria|rich_text is not empty. Credential Required: Connect your notionApi credentials.
- Open Applicant Record Lookup and set Operation to
getAll. Credential Required: Connect your notionApi credentials. - Open Filter Notion Records and confirm the condition compares
{{ $json.property_phone }}to{{ $('AI Conversation Fields').item.json.ai_screen_phone_number_value }}. - Open Update Applicant Entry and set the evaluation fields using expressions like
Interview Criteria 1 | {{ $('AI Conversation Fields').item.json.criteria_1_result }} | {{ $('AI Conversation Fields').item.json.criteria_1_rationale }}. Credential Required: Connect your notionApi credentials.
AI Tool Reminder: Retrieve Evaluation Rules is an AI tool sub-node for Interview Evaluation Agent—credentials must be added to Retrieve Evaluation Rules and the parent agent uses its outputs.
Step 8: Store Interview Audio and Attach to Notion
Download the ElevenLabs interview audio, save it to Drive, and attach it to the candidate record in Notion.
- Open Retrieve Interview Audio and set URL to
https://api.elevenlabs.io/v1/convai/conversations/{{ $node["AI Conversation Fields"].json.ai_screen_conversation_id }}/audio. - In Retrieve Interview Audio, set JSON Headers to
{"xi-api-key":"[CONFIGURE_YOUR_API_KEY]"}and enable Send Headers. - Open Save Audio to Drive and confirm Name is
{{ $json.name }}. - Open Attach Audio in Notion and set the file URL to
https://drive.google.com/file/d/{{ $json.id }}/preview. Credential Required: Connect your notionApi credentials.
[CONFIGURE_YOUR_API_KEY] in Retrieve Interview Audio with a valid ElevenLabs API key, or audio retrieval will fail.Step 9: Connect Notion Credentials Across All Notion Nodes
This workflow uses multiple Notion nodes; ensure they all point to the correct workspace and databases.
- Credential Required: Connect your notionApi credentials to all Notion nodes, including Fetch Applicant Entry, Embed Resume Link, Fetch Role Details, Create Applicant Entry, Applicant Record Lookup, Update Applicant Entry, and Attach Audio in Notion.
- Verify each Notion node’s Database ID points to the intended database (Applicant Tracker, Work at [Company Name]).
Note: There are 7 Notion nodes in this workflow; confirm they all use the same authorized integration.
Step 10: Test and Activate Your Workflow
Run a complete test to verify data flows from application intake and interview analysis through to Notion and Google Sheets.
- Click Execute Workflow and submit a test record through Application Form A, Application Form B, or Application Form C with a PDF resume.
- Confirm the resume file is stored in Drive, a preview URL is generated in Resume Preview URL, and the resume link is embedded via Embed Resume Link.
- Check that Candidate Qualifications and Candidate Contact Data run in parallel and merge correctly in Combine Streams.
- Verify the applicant appears in Notion via Create Applicant Entry and a backup record is appended in Log Applicant Backup.
- Send a test POST to ElevenLabs Incoming Hook and confirm Update Applicant Entry and Attach Audio in Notion complete successfully.
- When everything works as expected, toggle the workflow to Active for production use.
Troubleshooting Tips
- Notion permissions are the usual culprit. If records aren’t created or updated, check the integration access to the correct databases in Notion first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Quick Answers
Plan for about 1–2 hours if your Notion databases and keys are ready.
No. You’ll mostly connect accounts, map fields, and adjust the scoring prompts and criteria.
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 AI and voice costs (OpenAI or Gemini usage plus ElevenLabs, which varies with interview 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 you should. Most teams start by swapping the role-specific pieces: update the Notion job description database pages, then adjust the “Fetch Role Details” mapping and the AI evaluation prompts used by the HR Alignment Reviewer and Interview Evaluation Agent. Common customizations include changing the resume score threshold that triggers a notification (for example, only flag 8+), adding knockout rules (work authorization, location), and tailoring the question rubric per role before ElevenLabs runs interviews.
Usually it’s access scope. Reconnect Notion in n8n and confirm the integration is invited to the exact databases you’re writing to (Applicant Tracker, job descriptions, and any criteria tables). If your database structure changed, field mapping can break silently, so open the Notion nodes and reselect the properties. Also check rate limits if you process many applicants in a burst.
On n8n Cloud Starter, you can usually handle a few thousand executions per month; self-hosting removes the hard cap and shifts the limit to your server and API quotas. Practically, resume parsing and AI calls are the throttle, not Notion. If you’re screening dozens of resumes a day, expect occasional queueing, and consider staggering form triggers or adding extra Wait time around file parsing and audio retrieval.
For this workflow, n8n is usually the better fit because you’re doing multi-step logic, AI agent chains, file parsing, and post-call webhooks, which gets expensive and awkward in simpler tools. You also get self-hosting, which matters when applicant volume spikes. Zapier or Make can work if you only want “form submission → create Notion record,” but the moment you add scoring, Drive storage, and interview callbacks, you’ll feel the ceiling. Compliance is another factor: keeping a Google Sheets audit log plus controlled Notion criteria is easier when everything runs in one orchestrated workflow. If you want a second opinion on your stack, Talk to an automation expert.
The workflow keeps your screening consistent and your pipeline moving. You get your time back, and candidates get faster answers.
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.