LinkedIn to Google Sheets, scored jobs plus drafts
Job hunting falls apart in the same place every time. You find promising roles, then you lose them in tabs, half-finished notes, and a “I’ll tailor this later” pile that quietly grows.
Recruiters feel it from the other side (generic applications blend together). Job seekers feel it at midnight, rewriting bullets again. And career coaches end up managing chaos instead of momentum. This LinkedIn job scoring automation turns messy browsing into a ranked shortlist and a ready-to-edit cover letter draft.
Below, you’ll see how the workflow pulls fresh roles, scores them against your resume, logs everything into Google Sheets, and sends you the best fits so you can apply faster with more confidence.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: LinkedIn to Google Sheets, scored jobs plus drafts
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@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>LinkedIn Search URL"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch jobs from LinkedIn"]
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/html.dark.svg' width='40' height='40' /></div><br/>HTML"]
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n9["<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/>HTTP Request"]
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/html.dark.svg' width='40' height='40' /></div><br/>HTML1"]
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n12@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n13@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields1", pos: "b", h: 48 }
n15@{ icon: "mdi:robot", form: "rounded", label: "AI Agent1", pos: "b", h: 48 }
n16@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model1", pos: "b", h: 48 }
n17@{ icon: "mdi:database", form: "rounded", label: "Append or update row in sheet1", pos: "b", h: 48 }
n18@{ icon: "mdi:message-outline", form: "rounded", label: "Send a message", pos: "b", h: 48 }
n19@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n5 --> n6
n8 --> n9
n10 --> n11
n12 --> n14
n15 --> n17
n6 --> n7
n11 --> n12
n14 --> n15
n9 --> n10
n0 --> n1
n7 --> n18
n7 --> n8
n19 --> n0
n1 --> n2
n2 --> n3
n3 --> n4
n4 --> n5
n13 -.-> n12
n16 -.-> n15
n17 --> n7
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 n19 trigger
class n12,n15 ai
class n13,n16 aiModel
class n2,n17 database
class n4,n9 api
class n3 code
classDef customIcon fill:none,stroke:none
class n3,n4,n5,n9,n10 customIcon
The Problem: Job listings are easy to find, hard to finish
Finding roles is not the hard part. Finishing the loop is. You open LinkedIn, save a few postings, maybe copy a link into a doc, then “come back later” to tailor your resume and write a cover letter. Later turns into days. By the time you return, the job is gone, your energy is gone, or you can’t remember why the role looked good in the first place. Meanwhile, you still haven’t built a repeatable way to focus on the best-fit roles worth real effort.
That friction compounds. Here’s where it breaks down in real life.
- You spend about 2 hours a day switching between LinkedIn, docs, and spreadsheets just to stay organized.
- “Quick apply” becomes the default because tailoring every role feels like a second job.
- Your best-fit roles get the same attention as mediocre ones, so you dilute your time and motivation.
- Manual copy-paste introduces errors, which means broken links, missing titles, and duplicate entries you have to clean up later.
The Solution: Daily LinkedIn pulls, resume-based scoring, and cover drafts
This n8n workflow runs on a schedule (once a day is perfect) and does the “upstream” work that normally drains you. First, it pulls your current resume from Google Drive and parses the content so the automation knows what you actually do and what you’ve shipped. Next, it reads your existing Google Sheet filters (things like role keywords, locations, or seniority) and builds a LinkedIn search query automatically. Then it requests fresh LinkedIn listings, expands each job link, and fetches the detail pages with a short delay between requests to keep things stable. Finally, AI scores each role against your resume, generates structured output, drafts a tailored cover letter, and logs everything into Google Sheets. You get an email with the best roles, not a random pile of links.
The workflow starts with a scheduled run that refreshes your resume and your search filters. From there, it pulls listings and extracts job details in batches. AI does the matching and drafting, then Google Sheets becomes your single source of truth and Gmail delivers the shortlist to your inbox.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you review 20 LinkedIn roles a day. Manually, it’s easy to spend about 5 minutes per role to open the page, copy the link, capture the title/company, and jot down notes, which is roughly 1.5 to 2 hours. Then cover letters add another hour if you draft from scratch. With this workflow, you spend a couple minutes maintaining your Sheet filters, let the daily run collect and score roles, and then skim the top matches plus cover drafts in about 10 minutes. That’s real time back, and you’ll usually apply to better roles because you’re not guessing.
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 file.
- Google Sheets to store filters and results.
- Gmail to send your daily shortlist email.
- Google Gemini API access (enable it in Google AI Studio / Google Cloud).
Skill level: Intermediate. You’ll connect Google accounts, paste a few credentials, and tweak prompts/fields to match your resume and role preferences.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A daily schedule kicks it off. The workflow runs automatically (typically once per day) so you don’t rely on willpower or a calendar reminder you’ll ignore.
Your resume becomes the scoring baseline. n8n pulls your resume from Google Drive and extracts the text so the matching isn’t vague. It’s comparing roles to your actual experience, not a generic profile summary.
LinkedIn listings get collected and cleaned. Based on the filters stored in Google Sheets, the workflow builds a query, requests listings, extracts the job links, then fetches each job detail page with a small wait between requests. It also normalizes fields into a consistent structure so your Sheet doesn’t turn into an unreadable blob.
AI scores and drafts, then everything is logged. The AI Agent produces structured matching output (fit score, highlights, gaps) and generates a tailored cover letter draft. Results are upserted into Google Sheets, and Gmail sends you a digest so you can act quickly.
You can easily modify the Sheet filters to target different titles, locations, or companies based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Trigger
Set the workflow’s run schedule so the job search analysis executes automatically.
- Open Scheduled Run Trigger.
- In Rule, confirm the schedule interval includes Trigger At Hour set to
5. - Keep Flowpast Branding as a visual reference note (no configuration required).
Step 2: Connect Google Drive and Google Sheets
Pull your resume from Google Drive and load search filters from Google Sheets.
- Open Retrieve Drive File and set Operation to
download. - Credential Required: Connect your googleDriveOAuth2Api credentials in Retrieve Drive File.
- In Retrieve Drive File, set File ID to your resume file URL or ID.
- Open Parse Resume Document and set Operation to
pdf. - Open Fetch Sheet Filters and set Document ID to
[YOUR_ID]and Sheet Name togid=0(cached name:Filter). - Credential Required: Connect your googleSheetsOAuth2Api credentials in Fetch Sheet Filters.
Step 3: Build and Request the LinkedIn Listings
Generate a LinkedIn search URL from sheet filters and extract job listing links.
- Open Build LinkedIn Query and keep the JavaScript Code as provided (it builds the URL using Keyword, Location, Experience Level, Remote, and Easy Apply).
- Open Request LinkedIn Listings and set URL to
{{ $json.url }}. - Open Extract Listings Links and verify Operation is
extractHtmlContent. - In Extract Listings Links, ensure the extraction includes Key
jobswith CSS Selectorul.jobs-search__results-list li div a[class*="base-card"]and Return Valueattribute.
Step 4: Process Job Links and Fetch Job Details
Split job URLs, batch them, rate-limit requests, and parse the job detail pages.
- Open Expand Job Links and set Field to Split Out to
jobs. - Open Iterate Job Batches (batch size defaults are OK unless you want to throttle more).
- Open Delay Between Requests and set Amount to
2to slow requests. - Open Fetch Job Detail Page and set URL to
{{ $json.jobs }}. - Open Parse Job Details and verify the extraction keys:
Title,Company,Location,Description, andJob ID.
2 seconds or higher for stability.Step 5: Normalize Job Fields and Run AI Analysis
Clean job fields, then score the match and generate improvement suggestions with Gemini.
- Open Normalize Job Fields and confirm the assignments use expressions like
{{ $json.Description.replaceAll(/\s+/g, " ")}}and{{ "https://www.linkedin.com/jobs/view/"+ $json['Job ID'].split(":").last() }}. - Open Resume Match Assistant and keep the prompt as defined; it uses
{{ $json.Description }}and{{ $('Parse Resume Document').item.json.text }}. - Credential Required: Connect your googlePalmApi credentials in Gemini Chat Engine (this is the language model for Resume Match Assistant).
- Open Parse AI JSON Output and keep JSON Output as the provided parsing script.
- Open Resume Improvement Advisor and keep the prompt as defined; it uses
{{ $json.Description }}and{{ $('Parse Resume Document').item.json.text }}. - Credential Required: Connect your googlePalmApi credentials in Gemini Chat Engine 2 (this is the language model for Resume Improvement Advisor).
Step 6: Store Results and Notify via Email
Append or update the results in Google Sheets and send a summary email.
- Open Upsert Results to Sheet and set Operation to
appendOrUpdate. - Set Document ID to
[YOUR_ID]and Sheet Name to[YOUR_ID](cached name:Result). - Confirm column mappings like Link →
{{ $('Normalize Job Fields').item.json['Apply Link'] }}and Score →{{ $('Parse AI JSON Output').item.json.match_score }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Upsert Results to Sheet.
- Open Send Results Email and set Send To to
[YOUR_EMAIL], Subject toJob search results, and Message toHey, your job search results with resume changes are ready in your sheet for today. - Credential Required: Connect your gmailOAuth2 credentials in Send Results Email.
Iterate Job Batches outputs to both Send Results Email and Delay Between Requests in parallel, so emails are sent while additional job pages continue processing.
Step 7: Test and Activate Your Workflow
Run a manual test to confirm parsing, AI output, and sheet updates, then activate the schedule.
- Click Execute Workflow and verify Request LinkedIn Listings returns HTML and Extract Listings Links produces a
jobsarray. - Check Parse Job Details and Normalize Job Fields for clean values like Title, Company, and Apply Link.
- Confirm Parse AI JSON Output produces an object with match_score and cover_letter.
- Verify Upsert Results to Sheet adds or updates rows and Send Results Email delivers the notification.
- Toggle the workflow to Active so Scheduled Run Trigger runs daily at the configured hour.
Common Gotchas
- Google Drive and Google Sheets credentials can expire or need specific permissions. If things break, check your n8n credential settings and Google account access scopes first.
- If you’re using Wait nodes or external page fetching, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in the AI Agent are generic. Add your target role, preferred tone, and a few “signature” accomplishments early or you will be editing outputs forever.
Frequently Asked Questions
About an hour if your Google accounts and resume file are ready.
No coding required. You’ll mostly connect accounts, then adjust a few filters and AI 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 Google Gemini API usage costs, which are usually small for a daily run.
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 it’s the point of the design. Update the Google Sheets “filters” the workflow reads (the Fetch Sheet Filters step), and the Build LinkedIn Query logic will target new keywords, locations, or seniority. You can also tweak the “Normalize Job Fields” mapping if you want extra columns like remote/hybrid, tech stack mentions, or compensation when it’s available. If you want a different draft style, adjust the prompts inside the AI Agent nodes so the cover letters match your voice.
Usually it’s an expired Google credential or the wrong Google account connected in n8n. Reconnect Google Sheets, then confirm the Sheet ID and the target tab name still match what the Upsert Results to Sheet node expects. It can also fail if your account lost access to the spreadsheet (common when you duplicate a sheet into a new Drive location). Finally, check quota limits if you suddenly scaled up to hundreds of rows per run.
Dozens per daily run is realistic for most people.
It depends on how much control you want. Zapier and Make are great when you’re connecting two polished apps and calling it a day, but this workflow involves batching, delays, page fetching, and structured AI output, which is where n8n feels more flexible. n8n also gives you a self-hosted option, so you’re not paying more just because you ran the workflow more often. Frankly, the moment you want “score each item, enrich it, then write back to a sheet cleanly,” n8n tends to be less frustrating. Talk to an automation expert if you want a quick recommendation for your exact situation.
You do the part that actually matters: picking a few great roles and applying well. The workflow handles the repetitive sorting, scoring, drafting, and logging.
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.