LinkedIn to Google Sheets, ranked leads in Gmail
Scrolling LinkedIn jobs is one thing. Keeping track of what you already saw, which roles actually fit, and what to apply to first is the part that quietly wrecks your week.
Job seekers feel it immediately. A freelancer trying to land a steady contract does too. Same story for a career coach helping clients move faster. This LinkedIn job automation takes new roles, ranks them against your resume, and drops the best matches into your inbox.
You’ll see how the workflow captures roles into Google Sheets, dedupes what you’ve already reviewed, uses AI to score fit, and emails a clean “top 5” digest so you can act without second-guessing.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: LinkedIn to Google Sheets, ranked leads in Gmail
flowchart LR
subgraph sg0["Scheduled Automation Flow"]
direction LR
n0@{ icon: "mdi:brain", form: "rounded", label: "Mistral Chat Engine", pos: "b", h: 48 }
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/html.dark.svg' width='40' height='40' /></div><br/>HTML Extractor Secondary"]
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Records", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Job Records", pos: "b", h: 48 }
n4@{ icon: "mdi:message-outline", form: "rounded", label: "Dispatch Email Notice", pos: "b", h: 48 }
n5@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Interpreter", pos: "b", h: 48 }
n6["<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/>Combine Job Feeds"]
n7@{ icon: "mdi:brain", form: "rounded", label: "Mistral Chat Engine B", pos: "b", h: 48 }
n8@{ icon: "mdi:robot", form: "rounded", label: "Resume Parsing Agent", pos: "b", h: 48 }
n9@{ icon: "mdi:robot", form: "rounded", label: "Job Matching Agent", pos: "b", h: 48 }
n10@{ icon: "mdi:robot", form: "rounded", label: "Resume Analysis Agent", pos: "b", h: 48 }
n11@{ icon: "mdi:database", form: "rounded", label: "Retrieve Job Search Rows", pos: "b", h: 48 }
n12@{ icon: "mdi:database", form: "rounded", label: "Update Job Search Row", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "Extract Resume Content", pos: "b", h: 48 }
n14@{ icon: "mdi:cog", form: "rounded", label: "Retrieve Resume File", pos: "b", h: 48 }
n15@{ icon: "mdi:play-circle", form: "rounded", label: "Scheduled Automation Trigger", pos: "b", h: 48 }
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/compare.svg' width='40' height='40' /></div><br/>Dataset Comparison"]
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/code.svg' width='40' height='40' /></div><br/>LinkedIn Search Builder A"]
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/code.svg' width='40' height='40' /></div><br/>LinkedIn Search Builder B"]
n19["<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/>LinkedIn Search Builder C"]
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/code.svg' width='40' height='40' /></div><br/>LinkedIn Search Builder D"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>LinkedIn Jobs Request A"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>LinkedIn Jobs Request B"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>LinkedIn Jobs Request C"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>LinkedIn Jobs Request D"]
n25@{ icon: "mdi:cog", form: "rounded", label: "Delay Execution Step", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Secondary API Request"]
n27["<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/html.dark.svg' width='40' height='40' /></div><br/>HTML Extractor Primary"]
n28@{ icon: "mdi:swap-vertical", form: "rounded", label: "Batch Iterator", pos: "b", h: 48 }
n29@{ icon: "mdi:swap-vertical", form: "rounded", label: "Map Data Fields A", pos: "b", h: 48 }
n30@{ icon: "mdi:swap-vertical", form: "rounded", label: "Map Data Fields B", pos: "b", h: 48 }
n31@{ icon: "mdi:database", form: "rounded", label: "Retrieve Sheet Rows", pos: "b", h: 48 }
n32@{ icon: "mdi:cog", form: "rounded", label: "Sort Records", pos: "b", h: 48 }
n33@{ icon: "mdi:cog", form: "rounded", label: "Limit Results", pos: "b", h: 48 }
n34@{ icon: "mdi:cog", form: "rounded", label: "Aggregate Entries", pos: "b", h: 48 }
n1 --> n29
n27 --> n2
n6 --> n27
n32 --> n33
n25 --> n26
n33 --> n34
n2 --> n28
n34 --> n4
n29 --> n28
n30 --> n10
n26 --> n1
n3 --> n31
n3 --> n9
n14 --> n13
n28 --> n16
n28 --> n25
n16 --> n3
n8 --> n20
n8 --> n17
n8 --> n18
n8 --> n19
n15 --> n14
n15 --> n11
n17 --> n21
n13 --> n8
n31 --> n32
n18 --> n22
n19 --> n23
n20 --> n24
n9 --> n30
n21 --> n6
n23 --> n6
n0 -.-> n8
n5 -.-> n8
n22 --> n6
n24 --> n6
n11 --> n16
n7 -.-> n10
n7 -.-> n9
n10 --> n12
n12 --> n3
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 n15 trigger
class n5,n8,n9,n10 ai
class n0,n7 aiModel
class n11,n12,n31 database
class n21,n22,n23,n24,n26 api
class n17,n18,n19,n20 code
classDef customIcon fill:none,stroke:none
class n1,n6,n16,n17,n18,n19,n20,n21,n22,n23,n24,n26,n27 customIcon
The Problem: Job searching becomes a tracking problem
Most job hunts don’t fail because you “didn’t apply enough.” They fail because your process is messy. You open 20 tabs, save a few posts, forget where half of them went, and then spend your best energy re-checking basics. Worse, you keep seeing the same roles again and again, so your brain starts to tune out. Then, when you finally find something promising, you’re rushing to tailor your resume and cover letter from scratch. Honestly, that’s a recipe for slow weeks and sloppy applications.
The friction compounds. Here’s where it breaks down in real life.
- You end up re-reading jobs you already decided to ignore, because there’s no reliable “seen” history.
- Even good roles get buried since you’re judging them in the moment, not in a ranked list.
- Tailoring documents becomes a late-night task, which means you send weaker applications than you could.
- Without a single tracking sheet, it’s hard to follow up, compare opportunities, or notice patterns in what you’re getting callbacks for.
The Solution: Daily LinkedIn job matching, scored and summarized
This n8n workflow turns your job search into a simple daily review. It runs on a schedule, pulls your resume from Google Drive, and uses an AI agent to understand what you’re actually strong at. Then it searches LinkedIn for multiple job titles (your main target plus alternates), collects fresh job listings, and checks them against your Google Sheets tracker so you only process new roles. For each new job, AI compares the posting to your resume, produces a match score from 0–100 with supporting evidence, and generates a tailored cover letter plus concrete resume improvement notes. Finally, it ranks the results and emails you a single clean digest of the top 5 matches via Gmail.
The workflow starts with a daily trigger and your resume file. It then gathers and deduplicates LinkedIn roles, scores fit using AI, and logs everything to Google Sheets for ongoing tracking. You wake up to one email that tells you what to apply to first.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you review about 30 LinkedIn roles a day. Manually, you’ll typically spend maybe 3 minutes opening, scanning, and deciding on each one, plus another 30 minutes logging the promising jobs somewhere, so that’s about 2 hours daily. With this workflow, the daily trigger runs in the background, then you spend about 5 minutes reading a Gmail digest of the top 5 matches. If one looks strong, you already have a tailored cover letter draft and resume improvement notes sitting in Google Sheets.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for the master job tracking database
- Google Drive to store and download your resume file
- Gmail to send the daily top matches digest
- Mistral Cloud API key (get it from your Mistral account dashboard)
Skill level: Intermediate. You’ll connect accounts, paste file/sheet IDs, and adjust prompts, but you won’t be writing an app.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A daily trigger kicks everything off. n8n runs this workflow on a schedule, so your job search happens even when you’re busy (or tired).
Your resume is pulled and understood. The workflow retrieves your resume from Google Drive, extracts the text, and sends it to an AI resume parsing agent. That agent generates alternate job titles to broaden your search beyond one keyword.
LinkedIn roles are collected and cleaned up. Multiple LinkedIn searches run via HTTP requests, results are merged into one feed, and job details are extracted. Then the workflow compares the new roles to your existing Google Sheets tracker so you don’t reprocess jobs you’ve already seen.
AI ranks fit and drafts your next moves. For each new role, an AI matching agent creates a 0–100 score with evidence, and a separate analysis agent produces resume improvement points and a tailored cover letter. The workflow sorts by score, keeps the top results, and emails a single HTML digest through Gmail.
You can easily modify the job titles and scoring thresholds to match your target roles and seniority level based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Automation Trigger
This workflow starts on a schedule and immediately splits into two parallel branches to retrieve your resume and job search data.
- Add the Scheduled Automation Trigger node as your trigger.
- Set the schedule parameters in Scheduled Automation Trigger based on how often you want new job searches processed.
- Confirm that Scheduled Automation Trigger outputs to both Retrieve Resume File and Retrieve Job Search Rows in parallel.
Step 2: Connect Google Drive and Google Sheets
These nodes pull your resume file and job search data and later write back results.
- Open Retrieve Resume File and set the file or search parameters for your resume.
- Open Retrieve Job Search Rows and configure the spreadsheet, sheet, and range that store job search criteria.
- Open Retrieve Sheet Rows and set the spreadsheet and sheet used for job sorting.
- Open Update Job Search Row and set the target spreadsheet and row mapping for updates.
- Credential Required: Connect your Google Drive credentials in Retrieve Resume File.
- Credential Required: Connect your Google Sheets credentials in Retrieve Job Search Rows, Retrieve Sheet Rows, and Update Job Search Row.
Step 3: Set Up Resume Processing and AI Parsing
This section extracts text from your resume and uses AI to parse and analyze it.
- Configure Extract Resume Content to parse the file output from Retrieve Resume File.
- Open Resume Parsing Agent and define the parsing instructions for the resume content.
- Ensure Mistral Chat Engine is connected as the language model for Resume Parsing Agent.
- Ensure Structured Output Interpreter is connected as the output parser for Resume Parsing Agent (add credentials to Mistral Chat Engine, not the parser).
- Credential Required: Connect your Mistral Cloud credentials in Mistral Chat Engine and Mistral Chat Engine B.
Step 4: Build and Request LinkedIn Job Feeds
Parsed resume data is used to create multiple LinkedIn search queries that run in parallel and are merged into one feed.
- Configure LinkedIn Search Builder A, LinkedIn Search Builder B, LinkedIn Search Builder C, and LinkedIn Search Builder D to generate query URLs or parameters from the resume profile.
- Confirm that Resume Parsing Agent outputs to LinkedIn Search Builder D, LinkedIn Search Builder A, LinkedIn Search Builder B, and LinkedIn Search Builder C in parallel.
- Configure LinkedIn Jobs Request A through LinkedIn Jobs Request D to call the generated URLs from each builder.
- Ensure all four LinkedIn job request nodes feed into Combine Job Feeds, which then outputs to HTML Extractor Primary.
- If your LinkedIn endpoint requires authentication, add it directly in each LinkedIn Jobs Request A–LinkedIn Jobs Request D node.
Step 5: Parse, Split, and Compare Job Data
After fetching job feeds, the workflow extracts HTML, maps fields, and compares against existing sheet data.
- In HTML Extractor Primary, define the selectors or data extraction rules from the combined job feed HTML.
- Use Split Records to split extracted jobs into individual items and send them to Batch Iterator.
- Use HTML Extractor Secondary and Map Data Fields A to normalize fields for comparison and pass results to Batch Iterator.
- Confirm Batch Iterator outputs to both Dataset Comparison and Delay Execution Step in parallel.
- Configure Dataset Comparison to compare new jobs against Retrieve Job Search Rows output and route matches to Iterate Job Records.
Step 6: Sort, Limit, Aggregate, and Notify
This path curates the job list and sends a summary email.
- Configure Retrieve Sheet Rows to fetch a working list for sorting.
- Set sorting criteria in Sort Records and pass to Limit Results.
- Define the record cap in Limit Results and pass to Aggregate Entries.
- Configure Aggregate Entries to compile the final list and send it to Dispatch Email Notice.
- Credential Required: Connect your Gmail credentials in Dispatch Email Notice.
Step 7: Run Matching and Update the Sheet
Matched jobs are analyzed, scored, and written back to your job search spreadsheet.
- In Iterate Job Records, confirm batch handling for job records and that it outputs to Retrieve Sheet Rows and Job Matching Agent.
- Configure Job Matching Agent to score or filter jobs against resume data.
- Map the matched output in Map Data Fields B and pass it to Resume Analysis Agent.
- Ensure Mistral Chat Engine B is connected as the language model for both Job Matching Agent and Resume Analysis Agent.
- Configure Update Job Search Row to write back analysis results to your Google Sheet.
Step 8: Test and Activate Your Workflow
Validate the full automation end-to-end before enabling it on schedule.
- Click Execute Workflow to run a manual test from Scheduled Automation Trigger.
- Verify that Retrieve Resume File and Retrieve Job Search Rows run in parallel and both complete successfully.
- Confirm that Combine Job Feeds produces merged results and that HTML Extractor Primary and HTML Extractor Secondary output structured job data.
- Check that Dispatch Email Notice sends a message and Update Job Search Row updates your spreadsheet.
- When the test succeeds, switch the workflow to Active to run automatically.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n credential test and the Sheet sharing 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 an hour if your Google accounts and sheet are ready.
No. You’ll mostly connect credentials, paste your resume file link, and tweak a few prompts.
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 Mistral API usage, which depends on how many jobs you process each day.
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. Update the job title inputs used to build the LinkedIn searches, then adjust the prompts inside the Resume Parsing Agent and Job Matching Agent to reflect your industry language and what “good fit” means for you. Many people also change the “top 5” limit to “top 10” during heavier application weeks, and tighten the minimum match score when they want fewer, higher-quality options.
Usually it’s expired Google credentials or the sheet isn’t shared with the right Google account. Reconnect the Google Sheets credential in n8n, then confirm the spreadsheet ID and worksheet name still match what your “Get row(s)” and “Append/Update” nodes expect. If you recently duplicated your tracker, you might be writing to an old sheet without realizing it.
Plenty for a normal search. On n8n Cloud, your limit mostly depends on your monthly executions; if you self-host, there’s no execution cap and your server becomes the main constraint. Practically, most people keep it to a few dozen new jobs per day so the AI scoring stays fast and affordable.
For this specific use case, yes, but it depends on what you value. This workflow needs branching logic, batching, deduping against a dataset, and AI agents that generate structured outputs; n8n handles that without turning into a fragile chain of zaps. It’s also realistic to self-host, which is useful when you run daily searches and don’t want to count every little step. Zapier or Make can still be fine if you only want “new LinkedIn job → send me an email,” and nothing else. If you’re unsure, Talk to an automation expert and we’ll map it to your situation.
One email. Five best roles. Everything logged. That’s the workflow doing the repetitive work so you can spend your effort on interviews and stronger applications.
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.