Gmail to Google Sheets, resumes logged and confirmed
Hiring shouldn’t feel like digging through an inbox landfill. But when resumes arrive as PDFs, you end up opening attachments, copying details into a sheet, and still wondering who you missed.
This is where resume intake automation pays off. Recruiters feel it first, but busy founders and ops leads get dragged into it too, especially when applications spike. The outcome is simple: every application gets captured, structured, and confirmed without you babysitting Gmail.
This workflow turns incoming CVs into clean Google Sheets rows, checks duplicates by email, and sends the right confirmation and notification emails. You’ll see exactly how it works and what you need to run it.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Gmail to Google Sheets, resumes logged and confirmed
flowchart LR
subgraph sg0["1. Applicant Submits 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/code.svg' width='40' height='40' /></div><br/>Code"]
n1@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing", pos: "b", h: 48 }
n2["<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/>1. Applicant Submits Form"]
n3@{ icon: "mdi:cog", form: "rounded", label: "2. Extract Text from PDF CV", pos: "b", h: 48 }
n4@{ icon: "mdi:robot", form: "rounded", label: "3. Analyze & Structure CV wi..", 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/code.svg' width='40' height='40' /></div><br/>4. Parse AI Output"]
n6@{ icon: "mdi:database", form: "rounded", label: "5. Check for Duplicate Appli..", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "6. If Applicant is New...", pos: "b", h: 48 }
n8@{ icon: "mdi:database", form: "rounded", label: "7. Save Applicant Data to Go..", pos: "b", h: 48 }
n9@{ icon: "mdi:message-outline", form: "rounded", label: "8a. Send Confirmation Email ..", pos: "b", h: 48 }
n10@{ icon: "mdi:message-outline", form: "rounded", label: "8b. Send Notification Email ..", pos: "b", h: 48 }
n0 --> n3
n5 --> n6
n2 --> n0
n7 --> n1
n7 --> n8
n3 --> n4
n6 --> n7
n4 --> n5
n8 --> n9
n8 --> n10
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 n2 trigger
class n4 ai
class n7 decision
class n6,n8 database
class n0,n5 code
classDef customIcon fill:none,stroke:none
class n0,n2,n5 customIcon
The Problem: Resume Intake Turns Into Manual Data Entry
PDF resumes are great for candidates and awful for your process. Someone has to open the attachment, skim for contact info, interpret experience, then paste a “good enough” summary into a spreadsheet or ATS. Now multiply that by 30 applicants in a week. You start rushing, and the mistakes creep in: a misspelled email, a role title dropped, a candidate logged twice, or the “I’ll reply later” confirmation that never gets sent. The real cost is attention. It steals focus from the work that actually improves hiring.
It adds up fast. Here’s where it breaks down most teams.
- Copying candidate details into Google Sheets takes about 10 minutes per resume if you want it done neatly.
- PDFs vary wildly, so your “summary” changes depending on who reviewed it that day.
- Duplicate applications slip through when people apply twice or forward the same candidate, which creates messy reporting later.
- Candidates don’t get a fast confirmation, so they follow up, and your inbox gets even worse.
The Solution: AI-Parsed CVs Logged to Sheets (With Confirmations)
This workflow acts like an intake desk that never gets tired. A candidate submits a public application form and uploads a PDF CV. n8n pulls the file from the submission, extracts the raw text, and sends it to an OpenAI-powered AI Agent that reads it like a human would. Instead of dumping messy text into a cell, it returns structured fields (name, email, experience, education, skills) and a concise screening summary you can scan quickly. Before anything is saved, the workflow checks your Google Sheet for an existing row with the same email. If it’s a repeat, it stops. If it’s new, it writes a clean row to Google Sheets and sends two Gmail messages: a confirmation to the applicant and a notification to you with the summary.
The flow starts with the form submission, then moves into PDF text extraction and AI structuring. After that, it runs a duplicate check in Google Sheets and either stops or saves the applicant. Finally, Gmail sends the confirmation and the recruiter alert automatically.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you get 25 resumes in a week. Manually, if you spend about 10 minutes opening the PDF, extracting key details, writing a quick summary, and pasting it into Google Sheets, that’s roughly 4 hours weekly. With this workflow, your “time” is basically reviewing the sheet and the recruiter email. Submitting is instant for candidates, the AI processing runs in the background, and you typically only spend a minute per applicant scanning the summary. That’s closer to 30 minutes of review time instead of half a workday.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store structured applicant rows
- Gmail to send applicant and recruiter emails
- OpenAI API key (get it from your OpenAI dashboard)
Skill level: Intermediate. You’ll connect accounts (OAuth) and map fields into your sheet columns.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Application arrives through a public form. The workflow starts when a candidate submits their name, email, experience, and a PDF resume through the n8n form trigger.
The PDF is read and converted into text. n8n inspects the uploaded file, then extracts the raw text so the automation can work with it reliably.
AI turns messy resume text into structured data. The OpenAI-powered AI Agent parses the resume, then the workflow normalizes the JSON so it fits your Google Sheets columns cleanly (and doesn’t break when formats vary).
Duplicates are filtered, then emails go out. Google Sheets is checked for an existing email address; new candidates get upserted to the sheet, then Gmail sends a confirmation to the applicant and an alert to the recruiter with the summary.
You can easily modify the form fields to match your role requirements, then map those fields into different 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 Form Trigger
Set up the form that applicants will submit, including the required PDF CV upload and experience field.
- Add and open Applicant Form Intake.
- Set Form Title to
test. - Confirm the form fields include Name surname, email, a file field labeled CV that accepts
.pdf, and Experience Years as a number. - Keep Required enabled for all fields to ensure complete applicant data.
{{$node["Applicant Form Intake"].json["Name surname"]}} resolve correctly.Step 2: Connect Google Sheets
Wire the workflow to your applicant database for lookups and upserts.
- Open Lookup Existing Applicant and select your Google Sheet.
- Set Document to
https://docs.google.com/spreadsheets/d/[YOUR_ID]/edit?gid=0#gid=0and Sheet togid=0. - Configure the filter to use Lookup Column
emailand Lookup Value{{$node["Normalize AI JSON"].json.email}}. - Open Upsert Applicant Sheet and set Operation to
appendOrUpdatewith Matching Columns set toemail. - Map columns to values such as email →
{{$node["Normalize AI JSON"].json.email}}and cv_summary →{{$node["Normalize AI JSON"].json.cv_summary}}.
Credential Required: Connect your googleSheetsOAuth2Api credentials in Lookup Existing Applicant and Upsert Applicant Sheet.
Step 3: Set Up Processing and AI Extraction
Extract the PDF text, structure it with AI, and normalize the JSON for downstream use.
- Open Inspect Binary Payload to review the default JavaScript used for logging input payloads and keep it as-is for debugging.
- Configure Read PDF Text Content with Operation set to
pdfand Binary Property Name set toCV. - Open AI CV Structuring and confirm Model is
gpt-4.1-miniwith JSON Output enabled. - Verify the prompt includes expressions such as
{{$node["Applicant Form Intake"].json["Name surname"]}},{{$node["Applicant Form Intake"].json["email"]}}, and{{$json.text}}. - Keep Normalize AI JSON as-is to return the structured JSON object.
Credential Required: Connect your openAiApi credentials in AI CV Structuring.
Step 4: Configure Routing and Branch Logic
Decide whether to stop or continue based on applicant existence.
- Open Branch New Applicant and verify the condition checks email with notEmpty using
{{$json.email}}. - Confirm the true path goes to Do Nothing Step (existing applicant) and the false path goes to Upsert Applicant Sheet.
Step 5: Configure Output Email Notifications
Send confirmation to the applicant and alert the recruiter after data is saved.
- Open Send Applicant Confirmation and set Send To to
{{$node["Normalize AI JSON"].json.email}}. - Set Subject to
Your Application Has Been Receivedand ensure the Message includes fields like{{$node["Normalize AI JSON"].json.experience_years}}and{{$node["Normalize AI JSON"].json.application_date}}. - Open Notify Recruiter Email and replace Send To with your address (current value
[YOUR_EMAIL]). - Set Subject to
New Application - {{$node["Normalize AI JSON"].json.name}}and verify the message includes{{$node["Normalize AI JSON"].json.cv_summary}}. - Confirm execution order: Upsert Applicant Sheet outputs to both Send Applicant Confirmation and Notify Recruiter Email in parallel.
Step 6: Test and Activate Your Workflow
Validate the full flow from form submission to sheet updates and emails.
- Click Execute Workflow and submit a sample form through Applicant Form Intake with a PDF CV.
- Verify Read PDF Text Content produces extracted text and AI CV Structuring returns valid JSON.
- Check Upsert Applicant Sheet to confirm the applicant record is appended or updated by email.
- Confirm both emails are sent: Send Applicant Confirmation to the applicant and Notify Recruiter Email to your inbox.
- When successful, toggle the workflow to Active for production use.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check your n8n credential status and the sheet’s sharing/access settings 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.
Frequently Asked Questions
About 30 minutes if your Google and OpenAI accounts are ready.
No. You will mostly connect credentials and map fields into your Google Sheet. A tiny bit of comfort with testing runs helps, but you’re not “building an app.”
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, which are usually a few cents per resume depending on resume length and your model settings.
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, but you’ll want to do it intentionally. You can add role selection to the “Applicant Form Intake” form, then adjust the AI CV Structuring prompt so it summarizes experience against that chosen role. Many teams also add extra columns in Google Sheets (role_applied, seniority_guess, location, salary_range) and map them in the Normalize AI JSON step. If you later decide to score candidates, you can extend the same AI node to output a numeric score plus short reasoning.
Usually it’s expired OAuth credentials or the connected Google account no longer has access to the target spreadsheet. Reconnect Google Sheets in n8n, then re-select the spreadsheet and sheet inside the lookup and upsert nodes so the IDs refresh. Also check that the sheet headers match what the workflow expects; mismatched column names can look like a permissions problem when it’s really a mapping issue.
A lot.
Often, yes. This workflow benefits from n8n’s flexibility because parsing PDFs, normalizing JSON, and branching on duplicates is where simpler “two-step” tools start to feel cramped. n8n also gives you the option to self-host for high volume without paying per task in the same way. Zapier or Make can still work if your version is simpler, like “email arrives → create a row,” but you’ll likely end up bolting on extra steps for AI parsing and dedupe. If you’re unsure, Talk to an automation expert and describe your weekly applicant volume and how you shortlist.
Once this is live, resumes stop being “inbox work” and become a clean list you can act on. Set it up, test it with a few submissions, and then get back to actually choosing candidates.
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.