After spending weeks manually browsing LinkedIn, copying job descriptions, tailoring resumes, and tracking applications in spreadsheets, I decided to automate the entire process with N8N.
This workflow scrapes daily cybersecurity job postings, uses AI to analyze how well each matches my skills, and automatically generates tailored resumes for qualified opportunities. Every morning, I click "Run Workflow" and get 30-50 analyzed jobs with custom resumes ready to go all organized in a tracking spreadsheet.
Get the Code
The complete implementation is available on GitHub:
- N8N Automation Workflow - Import-ready workflow file, prompts, and setup guide
- LinkedIn Job Scraper - Custom Puppeteer-based scraper
Star the repos if you find them useful, and feel free to open issues or submit improvements!
The Problem
Job hunting in cybersecurity is a grind:
- Hundreds of similar-looking postings across multiple platforms
- Each job requires a tailored resume to pass ATS systems
- Manual tracking becomes overwhelming fast
- Generic applications get filtered out before human eyes see them
- Constant context-switching between browsing, writing, and organizing
I needed a system that could handle the repetitive work while keeping my applications personal and relevant.
The Solution
I built an N8N workflow that handles everything from job discovery to resume generation. The system runs on-demand and processes jobs in four main stages.

Stage 1: Job Discovery & Deduplication
The workflow starts by calling a custom LinkedIn scraper (which I built separately—that's a whole other project) that fetches up to 100 recent cybersecurity positions in Ontario, Canada. It searches for roles like security analyst, information security, and security engineer positions posted within the last 7 days.
Before any AI analysis happens, the system checks each job ID against two Google Sheets: one tracking jobs I've already applied to, and another for positions I've rejected. This prevents wasting API calls on duplicates.
Stage 2: AI-Powered Job Analysis
Each new job posting gets evaluated by a Job Analysis Agent powered by Google Gemini. This isn't simple keyword matching—the agent has access to my complete MasterSkills inventory, a structured spreadsheet containing:
- Every tool and technology I know
- Proficiency level (basic, intermediate, advanced)
- Evidence source (homelab project, co-op work, certification, college coursework)

The AI compares the job requirements against my actual capabilities and returns:
- A match score from 0-100
- Detailed justification explaining which skills align
- Assessment of missing requirements and skill gaps
Token Optimization: To reduce costs, I configured the ChatGPT agent to use structured JSON output instead of free-form text. This eliminates unnecessary verbosity and ensures consistent, parseable responses. The JSON schema enforces exact fields like company_name, job_title, and rating, cutting token usage by approximately 30-40% compared to my initial implementation.
Only jobs scoring 65% or higher move forward. Lower-rated positions get logged to an "Unwanted Jobs" sheet so I never see them again.
Stage 3: Intelligent Resume Customization
For qualified jobs, the automation creates a tailored resume in real-time:
Resume Template Management - The system retrieves my original resume and a draft template from Google Docs, then creates a new copy specifically for this application.
AI Resume Optimization - A Summary & Skills Agent (using OpenAI GPT-4o-mini) rewrites two critical sections:
- Professional Summary: A 3-4 sentence overview incorporating 7-10 job-specific keywords, highlighting relevant achievements, and using accurate language about my experience level (homelab projects, co-op work, self-directed learning)
- Skills Section: 3-5 dynamically categorized skill groups that mirror the job posting's language and prioritize tools/technologies mentioned in the description
The AI follows strict guidelines to maintain authenticity—it only includes skills from my MasterSkills inventory and accurately represents my entry-level background.
Document Generation - The workflow updates the Google Doc with the customized content, then:
- Converts it to PDF format
- Saves both Word and PDF versions to organized daily folders in Google Drive
- Names files with the company name for easy identification

Stage 4: Tracking & Organization
Every processed job gets logged to a master Google Sheets tracker with:
- Company name and job title
- Match rating and AI justification
- Direct links to the job posting and application page
- Links to the tailored resume (both Word and PDF)
- Submission date
- Status field (ready to apply, applied, interviewing, etc.)
The system automatically creates dated folders like "10 Dec 2025 Applications" with subfolders for Word and PDF files, keeping everything organized without manual filing.

Technical Architecture
Core Platform: N8N workflow automation (self-hosted in Docker)
AI Model:
- OpenAI ChatGPT (GPT-5-mini) for both job analysis and resume optimization
- Structured JSON output format for token efficiency
- Custom system prompts with detailed skill inventory context
Integrations:
- Custom Node.js LinkedIn scraper (HTTP API call)
- Google Docs API for resume template management
- Google Drive API for file operations and organization
- Google Sheets API for tracking and deduplication
Key N8N Nodes:
- HTTP Request for scraper communication
- OpenAI Chat Model nodes with JSON Schema configuration
- Conditional logic for qualification filtering
- Loop/batch processing for handling multiple jobs
- Error handling with retry logic
Challenges Overcome
Building a Reliable Scraper - LinkedIn's job pages are JavaScript-heavy and frequently change structure. I had to build a custom Puppeteer-based scraper that runs in Docker and handles dynamic content loading. This deserves its own technical deep-dive post.
Prompt Engineering for Accuracy - Getting AI to write authentic, entry-level resumes without exaggerating experience took multiple iterations. The solution was providing detailed MasterSkills context with proficiency levels and evidence sources, plus strict system prompts that emphasize homelab/co-op attribution.
ATS Optimization Balance - Tailored resumes need to pass automated screening while staying truthful. The AI now prioritizes exact keyword matches from job descriptions but only includes skills I actually possess, creating honest applications that still rank well in ATS systems.
Preventing Duplicate Processing - With daily runs pulling 100+ jobs, avoiding reprocessing became critical. The multi-sheet cross-reference system solved this while keeping separate logs for applied vs. rejected positions.
Token Cost Optimization
My initial implementation was costing ~$1-$2 per 100 jobs due to verbose AI responses. I solved this by:
- Implementing JSON Schema output - Forces ChatGPT to return only required fields in a strict format
- Compressing the MasterSkills format - Changed from full sentences to
skill|level|sourceencoding - Optimizing prompts - Removed unnecessary examples and redundant instructions
- Using GPT-5-mini - Switched from other models for non-critical analysis tasks
These changes brought costs down to $0.15 per 100 jobs—a 70% reduction while maintaining output quality.
Results & Impact
Daily Output: 40-50 analyzed job postings with match scores (varies based on new postings)
Time Savings: What used to take 2-3 hours of manual work per day now happens in 5-10 minutes—I just click "Execute Workflow" and review the results
Application Quality: Every application includes a resume specifically optimized for that role's requirements and ATS system
Organization: Complete tracking history with links to every tailored resume, making follow-ups and interviews easy to prepare for
Mental Load: No more decision fatigue from manually evaluating dozens of similar job postings
Cost Efficiency: ~$0.15 per 100 jobs processed, making daily automation affordable at ~$4.50/month