LinkedIn to Google Sheets, job matches ranked
Job hunting gets messy fast. You find a role on LinkedIn, copy the link somewhere, forget why it looked good, then re-open the tab days later and start over.
This LinkedIn job automation hits job seekers first, but recruiters and career coaches feel the same friction when they’re tracking roles for clients. And if you run a small agency and someone’s hiring, you’ve probably done the “spreadsheet + bookmarks + notes app” shuffle too.
This workflow pulls relevant LinkedIn roles, scores each one against your resume, drafts helpful notes and a cover letter, then logs everything into Google Sheets so you can apply with focus. Below, you’ll see exactly what it does and how to make it your own.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: LinkedIn to Google Sheets, job matches ranked
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:cog", form: "rounded", label: "Download file", pos: "b", h: 48 }
n1@{ icon: "mdi:cog", form: "rounded", label: "Extract from File", 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/code.svg' width='40' height='40' /></div><br/>LinkedIn Search URL"]
n3["<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/>Fetch jobs from LinkedIn"]
n4["<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"]
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n8@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model", pos: "b", h: 48 }
n9@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model1", pos: "b", h: 48 }
n10@{ icon: "mdi:message-outline", form: "rounded", label: "Send a message", pos: "b", h: 48 }
n11@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", 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/>Parse Job Links"]
n13["<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/>Extract HTML Job Details"]
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Job Details", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare Values for GSheet", pos: "b", h: 48 }
n16@{ icon: "mdi:database", form: "rounded", label: "Update Rows with Job Detials", pos: "b", h: 48 }
n17@{ icon: "mdi:robot", form: "rounded", label: "Job Matching Agent", pos: "b", h: 48 }
n18@{ icon: "mdi:robot", form: "rounded", label: "Resume Editor Agent", pos: "b", h: 48 }
n19@{ icon: "mdi:swap-vertical", form: "rounded", label: "Config", pos: "b", h: 48 }
n20@{ icon: "mdi:brain", form: "rounded", label: "Gemini Model", pos: "b", h: 48 }
n21@{ icon: "mdi:robot", form: "rounded", label: "Resume Analyzer Agent", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Build Search Rows"]
n23@{ icon: "mdi:database", form: "rounded", label: "Append row in sheet", 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/code.svg' width='40' height='40' /></div><br/>Limit Jobs"]
n4 --> n24
n7 --> n12
n19 --> n0
n5 --> n6
n24 --> n5
n20 -.-> n21
n0 --> n1
n6 --> n10
n6 --> n7
n12 --> n13
n14 --> n17
n11 --> n19
n22 --> n23
n1 --> n21
n17 --> n15
n23 --> n2
n2 --> n3
n18 --> n16
n21 --> n22
n13 --> n14
n3 --> n4
n8 -.-> n17
n9 -.-> n18
n15 --> n18
n16 --> n6
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 n11 trigger
class n17,n18,n21 ai
class n8,n9,n20 aiModel
class n16,n23 database
class n3,n12 api
class n2,n22,n24 code
classDef customIcon fill:none,stroke:none
class n2,n3,n4,n12,n13,n22,n24 customIcon
The Problem: LinkedIn job tracking turns into spreadsheet chaos
Finding jobs isn’t the hard part. It’s keeping your process clean enough that you can make good decisions. A typical week looks like this: you open LinkedIn, save a few roles, paste a couple links into a sheet, and tell yourself you’ll “come back later” to compare them. Later arrives, the descriptions changed, you can’t remember which ones were remote, and you’re back to re-reading everything. Add cover letters on top and it turns into a nightly chore. Honestly, it’s the context switching that drains you.
It adds up fast. Here’s where it breaks down in real life.
- You re-read the same job description three times because your notes are scattered across tabs and documents.
- Manual scoring is inconsistent, so “great fit” depends on your mood that day.
- Copy-paste into Google Sheets invites small errors, which means duplicate rows and missed follow-ups.
- Cover letters become a bottleneck, so you apply to fewer roles than you should.
The Solution: Resume-based LinkedIn matching logged in Google Sheets
This workflow runs on a schedule and starts by pulling your latest resume PDF from Google Drive. It reads the resume, extracts the skills and experience that matter, then builds targeted LinkedIn search queries based on your preferences (role type, location, remote, Easy Apply, and a job limit). After it fetches recent listings, it opens each job detail page, pulls out the description and attributes, and asks an AI agent to compare that job to your resume. For every role, you get a match score, practical notes, suggested resume improvements, and a tailored cover letter draft. Everything is upserted into Google Sheets, and you get a Gmail notification when the run finishes.
The workflow starts with a scheduled trigger and your saved preferences. Then it gathers LinkedIn listings and loops through each job link in batches (with a short wait to avoid hammering pages). Finally, it writes clean rows into your tracking sheet and emails you that the run is done.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you want to seriously compare 40 LinkedIn roles in a week. Manually, even a quick pass is maybe 6 minutes per role to open the job page, skim, paste a link into Google Sheets, and write a note, which is about 4 hours total (and that’s before cover letters). With this workflow, you spend about 10 minutes setting preferences once, let it run in the background, then you review a ranked sheet in one sitting. The “work” becomes choosing top matches, not gathering them.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Drive to store your resume PDF.
- Google Sheets to log, rank, and track jobs.
- Gmail for the “run finished” notification email.
- AI model credentials (get it from Google AI Studio for Gemini, or your provider’s console).
Skill level: Intermediate. You’ll connect accounts, paste Sheet IDs, and adjust a few preferences in the Config/Setup nodes.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A scheduled run kicks things off. n8n triggers on your chosen cadence (daily, weekdays, whatever fits), then loads your saved preferences like remote-only or Easy Apply.
Your resume becomes the “source of truth.” The workflow downloads your PDF from Google Drive, parses it, and uses an AI agent to summarize skills, experience, and role direction so job scoring stays consistent.
LinkedIn roles are fetched and processed in batches. n8n builds search queries, requests listings, extracts job links, and loops through them with a deliberate delay. That delay matters because LinkedIn pages can be finicky and you don’t want partial page loads.
AI generates the decision-making layer. For each job, another agent compares your resume to the job description, produces a fit score, writes notes, suggests resume tweaks, and drafts a cover letter you can personalize.
Everything lands in Google Sheets, then you get a Gmail ping. The workflow upserts rows so re-runs update existing jobs instead of creating a sea of duplicates. You can easily modify the search preferences and scoring prompts to match your industry and tone based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Run Trigger
This workflow starts on a daily schedule and immediately sets user preferences that guide the search and result limits.
- Open Scheduled Run Trigger and set the schedule rule to run at
triggerAtHour: 5. - In Setup Preferences, set maxJobsPerSearch to
2, preferredRemote toRemote, and preferredEasyApply toNo. - Confirm the execution order: Scheduled Run Trigger → Setup Preferences.
Step 2: Connect Google Drive
This section retrieves your resume PDF and extracts text for all downstream AI tasks.
- Open Retrieve Drive File and set File ID to your resume file, e.g.
[YOUR_ID]. - Credential Required: Connect your
googleDriveOAuth2Apicredentials in Retrieve Drive File. - In Parse Resume PDF, set Operation to
pdfto extract text from the downloaded file. - Verify the flow: Setup Preferences → Retrieve Drive File → Parse Resume PDF.
Step 3: Set Up AI Resume Insight and Search Filters
This stage analyzes the resume with AI, constructs job search rows, and appends search filters to Google Sheets.
- Open Resume Insight Agent and keep the prompt that references
{{ $node["Parse Resume PDF"].data.text }}. - Ensure Gemini Model Core is connected as the language model to Resume Insight Agent. Credential Required: Connect your
googlePalmApicredentials in Gemini Model Core (not in the agent node). - In Compose Search Rows, keep the JS code that applies preferences from Setup Preferences and throws an error if
items[0].json.outputis missing. - Open Append Search Filters and map fields using the expressions like
{{$json.Remote}},{{$json.Keyword}}, and{{$json["Experience Level"]}}. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials in Append Search Filters. - Verify the flow: Parse Resume PDF → Resume Insight Agent → Compose Search Rows → Append Search Filters.
Step 4: Configure LinkedIn Search and Link Processing
This part builds LinkedIn URLs, fetches listings, extracts job links, and limits results per search.
- In Build LinkedIn Query, leave the JS that constructs URLs and sets
f_EA=trueandf_WTfor remote filtering. - Set Request LinkedIn Listings URL to the expression
{{ $json.url }}. - In Extract Listing Links, confirm the CSS selector
ul.jobs-search__results-list li div a[class*="base-card"]and set Return Value toattributefor jobs. - In Restrict Job Count, keep the JS that slices items based on
$node["Setup Preferences"].json.maxJobsPerSearch. - Set Expand Link Items Field to Split Out to
jobsand route into Batch Through Links.
Step 5: Set Up Job Detail Parsing, AI Scoring, and Sheet Updates
Each job link is fetched, parsed, scored with AI, and upserted into Google Sheets before looping to the next batch.
- In Delay Between Batches, set Amount to
2to space out requests, then route to Fetch Job Detail Page. - Set Fetch Job Detail Page URL to the expression
{{ $json.jobs }}. - In Parse Job Detail HTML, confirm extraction keys like Title, Company, Location, Description, and Job ID from the listed selectors.
- In Map Job Attributes, keep expressions like
{{$json.Description.replaceAll(/\s+/g, " ")}}and{{"https://www.linkedin.com/jobs/view/"+ $json["Job ID"].split(":").last()}}. - Ensure Gemini Chat Engine A is connected to Job Fit Agent and Gemini Chat Engine B is connected to Resume Improvement Agent. Credential Required: Connect your
googlePalmApicredentials in both Gemini chat engines (not in the agent nodes). - In Assemble Sheet Payload, keep the raw JSON parsing code that reads
{{ $('Job Fit Agent').item.json.output }}and extracts the object safely. - Open Upsert Job Results and confirm Operation is
appendOrUpdate, mapping values like{{ $('Map Job Attributes').item.json['Apply Link'] }}and{{ $('Assemble Sheet Payload').item.json.match_score }}. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials in Upsert Job Results.
Step 6: Configure Results Email Delivery
The workflow sends a summary email after each batch run to confirm updated results.
- Open Send Results Email and set Send To to
[YOUR_EMAIL]. - Set Subject to
Job search resultsand Message to the provided text including your Google Sheet link. - Credential Required: Connect your
gmailOAuth2credentials in Send Results Email.
Step 7: Test and Activate Your Workflow
Run a manual test to verify each stage, then activate the schedule for daily operation.
- Click Execute Workflow to run a manual test starting at Scheduled Run Trigger.
- Verify that Append Search Filters writes rows into the
Filtersheet and Upsert Job Results populates theResultsheet inJob Search N8N. - Confirm that Send Results Email arrives with the configured message and link.
- When satisfied, toggle the workflow to Active so Scheduled Run Trigger runs daily at the configured hour.
Common Gotchas
- Google Drive credentials can expire or need specific permissions. If things break, check the n8n Credentials screen and the file’s 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.
- LinkedIn HTML selectors change sometimes, so the “extract links/details” parsing can suddenly return blanks. When that happens, inspect the job page HTML and update the parsing selectors in the HTML extraction nodes.
Frequently Asked Questions
About 30 minutes if your Google accounts are ready.
No. You will connect your accounts and paste in a few IDs and preferences.
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 model costs (often just a few dollars a month at moderate usage).
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 preferences in the “Setup Preferences/Config” Set node (location, remote-only, Easy Apply, and the job limit), then tweak the prompt used by the resume insight and job fit agents to target the titles you care about. Common customizations include adding multiple locations, changing the minimum fit score you’ll consider “worth applying,” and writing cover letters in your own tone.
Most of the time it’s an expired Google authorization or the sheet ID is wrong. Reconnect the Google Sheets credential in n8n, then re-check the spreadsheet and tab names used in the Upsert step. Also make sure the Google account you connected actually has edit access to that sheet.
It depends on the job limit you set and how long you’re willing to let it run, but 50–100 roles per run is realistic for most setups.
Often, yes, because this is not a simple two-step Zap. You’re looping through many jobs, parsing pages, waiting between batches, and running multiple AI evaluations per role, which gets expensive or awkward in tools that charge per task at high volume. n8n also gives you a self-hosting path if you want more control. That said, if you only want “send me new LinkedIn jobs to a sheet” and nothing else, Zapier or Make can feel quicker. The moment you care about scoring, drafts, and clean upserts, n8n usually wins. Talk to an automation expert if you want a second opinion before setting it up.
Once this is running, your job search stops being a pile of tabs and turns into a ranked shortlist you can actually act on. The workflow handles the repetitive stuff, so you can spend your energy on strong 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.