Airtable + OpenAI: consistent resume screening
Resume screening gets messy fast. Files live in someone’s inbox, notes live in someone else’s head, and “quick rankings” turn into slow debates because nobody remembers what “good” looked like last week.
This hits HR managers hardest, honestly. But recruiters and hiring leads feel it too, especially when you’re trying to scale a consistent resume screening automation without turning your process into a spreadsheet horror show.
This workflow takes applicants from form submission to Airtable tracking, Drive file storage, OpenAI scoring, shortlist decisions, and candidate emails. You’ll see what it does, what you need, and where teams usually trip up.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Airtable + OpenAI: consistent resume screening
flowchart LR
subgraph sg0["Application Form 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/form.svg' width='40' height='40' /></div><br/>Application Form Trigger"]
n1["<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/airtable.svg' width='40' height='40' /></div><br/>Airtable Create Record"]
n2@{ icon: "mdi:cog", form: "rounded", label: "Drive CV Upload", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Applicant Info Map", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Download CV File", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Extract PDF Text", pos: "b", h: 48 }
n6@{ icon: "mdi:robot", form: "rounded", label: "AI Scoring Agent", pos: "b", h: 48 }
n7@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Engine", pos: "b", h: 48 }
n8@{ icon: "mdi:database", form: "rounded", label: "Airtable Position Lookup", pos: "b", h: 48 }
n9@{ icon: "mdi:robot", form: "rounded", label: "Structured Result Parser", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Shortlist Check", pos: "b", h: 48 }
n11["<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/airtable.svg' width='40' height='40' /></div><br/>Mark as Rejected"]
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/airtable.svg' width='40' height='40' /></div><br/>Mark as Interviewing"]
n13@{ icon: "mdi:database", form: "rounded", label: "Airtable JD Lookup", pos: "b", h: 48 }
n14@{ icon: "mdi:robot", form: "rounded", label: "Generate Interview Questions", 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/form.svg' width='40' height='40' /></div><br/>Questionnaire Form"]
n16["<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/airtable.svg' width='40' height='40' /></div><br/>Save Questionnaire Responses"]
n17@{ icon: "mdi:database", form: "rounded", label: "Job Posting Lookup", pos: "b", h: 48 }
n18@{ icon: "mdi:database", form: "rounded", label: "Applicant Detail Fetch", pos: "b", h: 48 }
n19@{ icon: "mdi:robot", form: "rounded", label: "Compose Followup Email", pos: "b", h: 48 }
n20@{ icon: "mdi:swap-vertical", form: "rounded", label: "Map Email Fields", pos: "b", h: 48 }
n21@{ icon: "mdi:message-outline", form: "rounded", label: "Dispatch Email", pos: "b", h: 48 }
n22@{ icon: "mdi:robot", form: "rounded", label: "Schedule Call Slot", pos: "b", h: 48 }
n23@{ icon: "mdi:location-exit", form: "rounded", label: "Calendar Booking Tool", pos: "b", h: 48 }
n24["<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/airtable.svg' width='40' height='40' /></div><br/>Update Call Time"]
n25@{ icon: "mdi:robot", form: "rounded", label: "Draft Screening Questions", pos: "b", h: 48 }
n26@{ icon: "mdi:database", form: "rounded", label: "Job Posting Lookup 2", pos: "b", h: 48 }
n27@{ icon: "mdi:database", form: "rounded", label: "Applicant Detail Fetch 2", pos: "b", h: 48 }
n28["<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/airtable.svg' width='40' height='40' /></div><br/>Store Screening Questions"]
n29@{ icon: "mdi:swap-vertical", form: "rounded", label: "Map Screening Output", pos: "b", h: 48 }
n6 --> n10
n1 --> n4
n8 -.-> n6
n13 -.-> n14
n21 --> n22
n20 --> n21
n4 --> n5
n17 -.-> n19
n22 --> n24
n29 --> n28
n26 -.-> n25
n10 --> n12
n10 --> n11
n12 --> n14
n15 --> n16
n23 -.-> n22
n5 --> n6
n7 -.-> n6
n19 --> n20
n3 --> n1
n0 --> n2
n18 -.-> n19
n25 --> n29
n27 -.-> n25
n16 --> n19
n14 --> n15
n9 -.-> n6
n2 --> n3
n24 --> n25
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 n6,n9,n14,n19,n22,n25 ai
class n7 aiModel
class n10 decision
class n1,n8,n11,n12,n13,n16,n17,n18,n24,n26,n27,n28 database
classDef customIcon fill:none,stroke:none
class n0,n1,n11,n12,n15,n16,n24,n28 customIcon
The Challenge: Fair, consistent resume screening at speed
When applications start coming in, the first breakage is always the same. Resumes arrive in different formats, the “latest” version gets lost, and someone is manually copying details into a tracker while trying to remember the job requirements. Then the subjective part kicks in: two reviewers read the same CV and come to totally different conclusions, not because one is wrong, but because the criteria aren’t applied consistently. After a week of this, you’re behind, candidates are waiting, and your team is making decisions under pressure. That’s when mistakes happen.
It adds up fast. Here’s where the friction compounds.
- Resumes get scattered across email threads and shared folders, so you waste time just finding the right file.
- Manual screening notes aren’t comparable, which makes shortlisting feel like opinion instead of process.
- Copy-pasting applicant details into Airtable or Sheets invites typos and missing fields.
- Slow follow-ups cost you good candidates because they accept interviews elsewhere first.
The Fix: Airtable + OpenAI scoring with automated follow-ups
This workflow turns your hiring intake into a clean pipeline. It starts with a structured application form so every candidate submits the same core details. As soon as a submission lands, n8n creates an applicant record in Airtable, uploads the CV to a dedicated Google Drive folder, and pulls the text out of the PDF so it’s readable by AI. Then an AI scoring agent (powered by an OpenAI chat model) evaluates the resume against the job description you store in Airtable, producing a consistent, structured result you can compare across applicants. Based on that score, the workflow marks the candidate as rejected or interviewing, generates interview questions for shortlisted applicants, and sends tailored emails after they complete a questionnaire. It also proposes a call slot and updates Airtable with the scheduled time.
The workflow begins at form submission. From there, it standardizes the applicant data, extracts the CV content, and applies the same scoring logic every time using Airtable job details plus OpenAI. Finally, it updates Airtable statuses and drives email + scheduling so your process keeps moving.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you get 25 applicants a week for a technical role. Manually, a recruiter might spend about 10 minutes saving the CV, creating a tracker entry, and writing basic notes, plus another 10 minutes to do a first-pass read. That’s roughly 8 hours weekly before you’ve even scheduled interviews. With this workflow, intake and filing happen automatically, and the OpenAI score gives you a consistent first-pass in a few minutes per candidate. You still review, but you’re starting with a ranked list instead of a pile.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Airtable for applicant tracking and job details.
- Google Drive to store and organize CV files.
- OpenAI API Key (get it from the OpenAI dashboard).
Skill level: Intermediate. You’ll connect accounts, map a few fields, and tweak an AI prompt safely.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
Application intake kicks everything off. A candidate submits your form, and n8n immediately captures their details so nothing is stuck in someone’s inbox.
Your records and files get organized automatically. The workflow creates an applicant in Airtable, uploads the CV to Google Drive, then downloads it again to extract the PDF text for scoring. A little redundant on purpose, because it ensures the stored file is the same one you evaluate.
OpenAI scores the candidate against the job. Airtable provides the job description and role requirements, the AI agent evaluates the resume content, and a structured parser forces consistent output (so you don’t get rambly summaries when you need a decision-ready score).
Status changes and communication happen next. If the score passes your shortlist condition, Airtable is updated to “Interviewing,” interview questions are generated, and a questionnaire is sent. If not, the workflow marks them rejected and can still send a polite response, depending on how you configure the email step.
You can easily modify the shortlist threshold to match your role’s seniority based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Trigger
Set up the applicant intake form that starts the workflow and captures the CV file and candidate details.
- Open Application Form Trigger and set Form Title to
Job Application. - Set Path to
automation-specialist-applicationand Button Label toSubmit. - Ensure the form fields include First Name, Last Name, Email, Phone, Years of experience, and Upload your CV with Accept File Types set to
.pdf. - Paste the full job description into Form Description exactly as provided in the node.
Step 2: Connect Google Drive and Map Applicant Data
Store the uploaded CV in Drive and map key fields before creating the Airtable record.
- In Drive CV Upload, set Name to
{{ $binary.Upload_your_CV.fileName }}and Input Data Field Name toUpload_your_CV. - Select the target Folder in Drive CV Upload for CV storage.
- Credential Required: Connect your googleDriveOAuth2Api credentials in Drive CV Upload and Download CV File.
- In Applicant Info Map, confirm the field mappings are set to:
- Name →
{{ $('Application Form Trigger').item.json['First Name'] + " " + $('Application Form Trigger').item.json['Last Name'] }} - Phone →
{{ $('Application Form Trigger').item.json.Phone }} - email →
{{ $('Application Form Trigger').item.json.Email }} - Experience →
{{ $('Application Form Trigger').item.json["Years of experience"] }} - Applied On →
{{ $('Application Form Trigger').item.json.submittedAt }} - CV link →
{{ $json.webViewLink }}
{{ $json.webViewLink }} is available for downstream nodes.Step 3: Create and Update Airtable Records
Store applicants in Airtable, track status, and log questionnaire responses and screening questions. Multiple Airtable nodes are used, so connect credentials across all Airtable nodes.
- Open Airtable Create Record and select your Base and Table (Applicants).
- Confirm these fields in Airtable Create Record:
- Name →
{{ $json.Name }}, Phone →{{ $json.Phone }}, CV Link →{{ $json["CV link"] }}, Applying for →["Automation Specialist"], Email address →{{ $json.email }}. - Credential Required: Connect your airtableTokenApi credentials to all Airtable nodes (6 Airtable and 6 Airtable Tool nodes handle applicants, positions, and updates).
- In Mark as Rejected, ensure Stage is
No hireand the record ID is{{ $('Airtable Create Record').item.json.id }}. - In Mark as Interviewing, ensure Stage is
Interviewingand the record ID is{{ $('Airtable Create Record').item.json.id }}. - In Save Questionnaire Responses, confirm the record ID is
{{ $('Airtable Create Record').item.json.id }}and the combined Q&A field uses the existing expression block. - In Update Call Time, set Phone interview to
{{ $json.message.content['Start time'] }}. - In Store Screening Questions, set Phne interview screening questions to
{{ $json['Screening Questions'] }}.
{{ $('Airtable Create Record').item.json.id }} or {{ $('Update Call Time').item.json.id }} expression.Step 4: Configure CV Extraction and AI Scoring
Download the CV, extract text, and score the applicant using the AI agent and structured output parser.
- In Download CV File, set File ID to
{{ $json.fields["CV Link"] }}and keep Operation asdownload. - In Extract PDF Text, set Operation to
pdf. - In AI Scoring Agent, keep the prompt text and ensure it references the extracted text with
{{ $json.text }}. - OpenAI Chat Engine is connected as the language model for AI Scoring Agent — ensure credentials are added to OpenAI Chat Engine.
- Structured Result Parser is connected as the output parser for AI Scoring Agent — configure credentials on the parent AI Scoring Agent if required by your environment.
- Airtable Position Lookup is an AI tool sub-node for AI Scoring Agent — keep it connected and ensure airtableTokenApi credentials are set on the Airtable tool.
- In Shortlist Check, set the numeric condition to
{{ $json.output.score }}greater than or equal0.7.
Step 5: Generate and Capture Interview Questions
Produce AI interview questions, present them via a form, and save responses back to Airtable.
- In Generate Interview Questions, set Model to
gpt-4o-miniand ensure JSON Output is enabled. - Credential Required: Connect your openAiApi credentials in Generate Interview Questions.
- Airtable JD Lookup is an AI tool sub-node for Generate Interview Questions — keep it connected and ensure Airtable credentials are on that tool.
- In Questionnaire Form, keep the five field labels mapped to the expressions:
{{ $json.message.content.interview_questions[0].question }}through{{ $json.message.content.interview_questions[4].question }}.- In Save Questionnaire Responses, keep the concatenated Q&A mapping block so answers are stored with their questions.
Step 6: Compose and Send Follow-up Email, Then Schedule a Call
Use AI to craft a follow-up email, send it, book a call via Google Calendar, and update Airtable with the meeting time.
- In Compose Followup Email, set Model to
gpt-4oand keep JSON Output enabled. - Credential Required: Connect your openAiApi credentials in Compose Followup Email and Schedule Call Slot.
- Job Posting Lookup and Applicant Detail Fetch are AI tool sub-nodes for Compose Followup Email — ensure Airtable credentials are set on those tools, not on the parent.
- In Map Email Fields, map To, Subject, and Email Content to:
{{ $json.message.content.To }},{{ $json.message.content.Subject }}, and{{ $json.message.content['Email Content'] }}.- In Dispatch Email, set From Email to your sender address and keep:
- To Email →
{{ $json.To }}, Subject →{{ $json.Subject }}, Text →{{ $json['Email Content'] }}. - Credential Required: Connect your smtp credentials in Dispatch Email.
- In Schedule Call Slot, keep the prompt and ensure it references
{{ $today }}for date context. - Calendar Booking Tool is an AI tool sub-node for Schedule Call Slot — connect googleCalendarOAuth2Api credentials on the tool and keep:
- Start →
{{ $fromAI("start_time", "The start time for the meeting", "string", "2025-01-01T09:00:00Z") }}, End →{{ $fromAI("end_time", "The end time for the meeting", "string", "2025-01-01T09:00:00Z") }}. - In Update Call Time, confirm the record ID is
{{ $('Save Questionnaire Responses').item.json.id }}.
Step 7: Generate and Store Screening Questions
Create a tailored set of screening questions after the call is scheduled and store them in Airtable.
- In Draft Screening Questions, keep Model set to
gpt-4oand ensure the prompt references{{ $('Extract PDF Text').item.json.text }}. - Job Posting Lookup 2 and Applicant Detail Fetch 2 are AI tool sub-nodes for Draft Screening Questions — ensure Airtable credentials are set on those tools.
- In Map Screening Output, set Screening Questions to
{{ $json.message.content['Screening Questions'] }}. - In Store Screening Questions, confirm the record ID is
{{ $('Update Call Time').item.json.id }}and the questions field uses{{ $json['Screening Questions'] }}.
Step 8: Test and Activate Your Workflow
Verify each step with a sample applicant submission and then enable the workflow for production.
- Click Execute Workflow and submit a test entry in Application Form Trigger with a PDF CV.
- Confirm the CV uploads in Drive CV Upload and the Airtable record is created by Airtable Create Record.
- Validate that AI Scoring Agent outputs a score and Shortlist Check routes to Mark as Interviewing or Mark as Rejected as expected.
- Complete the Questionnaire Form and confirm Save Questionnaire Responses updates the Airtable record.
- Check that Dispatch Email sends the follow-up email and Calendar Booking Tool creates a calendar event via Schedule Call Slot.
- Verify Store Screening Questions contains a populated screening question list.
- When the test is successful, toggle the workflow to Active to run it in production.
Watch Out For
- Airtable credentials can expire or need specific permissions. If things break, check your Airtable personal access token scopes and the base/table access 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.
Common Questions
About an hour if your Airtable base and Drive folder are ready.
Yes. No coding required, but someone should be comfortable mapping fields and testing with a few sample resumes.
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 usage costs, which are typically a few cents per candidate depending on resume length and your prompt.
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.
You can adjust the Airtable Position Lookup and Airtable JD Lookup logic to pull different job requirements, then update the AI Scoring Agent prompt to reflect what “good” means for that role. Common customizations include changing the shortlist threshold in the Shortlist Check, adding knock-out questions to the Questionnaire Form, and rewriting the Compose Followup Email prompt to match your brand tone.
Usually it’s an expired token or missing permissions on the base. Regenerate your Airtable personal access token, confirm it has read/write access to the tables you’re using, then reselect the base and table in the Airtable nodes. Also double-check that field names match exactly, because renamed columns can look like “auth problems” when they’re really mapping errors. If failures happen only at busy times, you may be hitting rate limits and should add a short wait or reduce batch size.
On n8n Cloud Starter, you can typically run a few thousand workflow executions per month, which is plenty for most small hiring pipelines. If you self-host, there’s no execution cap; your server resources become the limit. In practice, the slowest part is usually PDF text extraction and the OpenAI request, so plan on a few minutes per candidate end-to-end when resumes are long.
Often, yes. This workflow has branching decisions (shortlist vs reject), file handling (Drive upload, download, PDF text extraction), and structured AI output parsing, which is where Zapier/Make setups can get fragile or expensive. n8n also gives you the self-hosting option, so you’re not paying more just because you had a busy month. If you only need “form submission → create Airtable record,” Zapier is fine. If you want consistent scoring and automated interview steps, n8n is the calmer choice. Talk to an automation expert if you want help choosing.
Once this is running, your hiring process stops relying on memory and heroics. The workflow does the repetitive sorting and follow-up so you can focus on the actual decision.
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.