AI-Powered Job Application Agent
Autonomous pipeline that scrapes job listings daily from two sources, scores each role against a candidate profile using GPT-4o-mini, and generates tailored cover letters and resumes for every high-scoring match — without human input.
Daily
Automated Runs
2
Job Sources
4
Filter Gates
3
Max AI Calls
1–10
Relevance Score
0
Manual Steps
// The Problem
Job searching is a full-time job.
Manual job searching means spending hours scrolling boards, copying listings, writing cover letters from scratch, and customising resumes for each application. Most candidates apply inconsistently — high volume one week, nothing the next — with no system tracking what they've applied to or why.
This pipeline eliminates that entirely. A scheduled trigger runs every morning, surfaces relevant listings from multiple sources, filters out noise, scores each role by fit, and produces ready-to-send documents for every quality match — automatically.
Hours spent manually searching job boards
→ Opportunity cost — time researching, not applying
Generic cover letters sent to every role
→ Low response rates, no personalisation at scale
No system tracking what's been applied to
→ Duplicate applications, missed follow-ups
Resume not tailored per role
→ Filtered by ATS before human review
// Workflow Diagram
Three phases at a glance.
The pipeline runs on a schedule trigger each morning. Two job sources scrape in parallel, four free gates filter the results before any AI credits are spent, then each qualified job moves through a score-gated AI pipeline before logging to Google Sheets.
Phase 1 — Scrape & Filter
Phase 2 — AI Pipeline
Phase 3 — Log & Notify
// Phase 1 — Scrape & Filter
From trigger to qualified lead list.
Schedule Trigger
Runs daily at 8AM on a schedule. A manual trigger is available for testing. Both feeds hit the same downstream pipeline without duplication.
Parallel Scraping
Two Apify actors run simultaneously — one queries Google Jobs, the other the Career Site API. Both return raw platform-specific payloads that need normalisation before merging.
Normalise (per source)
Each source has a dedicated Code node that maps platform fields into a unified schema: job_title, company_name, location, apply_url, description, seniority, is_remote, salary, key_skills, platform, raw_source.
Merge & Batch Loop
Results from both sources merge into a single stream, then enter a SplitInBatches loop. Each job is processed individually through the filter gates and AI pipeline.
Gate 1 — Dedup
Queries Google Sheets for the apply_url. If the job is already logged, the loop skips to the next item. Prevents re-processing jobs from previous runs.
Gate 2 — Apply URL
Drops any job with no apply link. No link means no application path — no point scoring or generating documents.
Gate 3 — Description Length
Requires at least 200 characters in the job description. Short descriptions lack enough signal for accurate AI scoring and cover letter generation.
Gate 4 — Seniority Filter
Passes mid-level, senior, lead, principal, and unclassified roles. Explicitly junior or entry-level postings are skipped before any AI credits are spent.
// Phase 2 — AI Pipeline
Score, write, document.
Fetch Base Resume
Google Docs node retrieves the candidate's base resume once per batch run (executeOnce: true). The content is used as context for all three AI calls — fetching once prevents redundant API calls per job.
Score Job Relevance
GPT-4o-mini scores the job 1–10 against the resume. Scoring criteria: skill alignment (4pts), seniority match (2pts), salary fit (2pts), remote match (1pt), full-time (1pt). Returns structured JSON with score and one-sentence reasoning.
Parse & Validate Score
A Code node extracts and validates the score JSON. Handles API response format variations and flags parse errors so invalid responses don't reach the filter gates.
Filter Valid Scores
Drops jobs where the AI returned an unparseable or out-of-range score. Ensures only clean, validated scores proceed through the pipeline.
IF Score ≥ 7 → Cover Letter
GPT-4o-mini writes a 3–4 paragraph personalised cover letter. Starting with 'Dear Hiring Manager', no placeholders, no headers. Tailored to the specific job title, company, and description.
IF Score ≥ 8 → Tailored Resume
GPT-4o-mini rewrites the base resume to align with the specific job description. Rewords experience and skills to mirror job requirements without fabricating information. Output is clean plain text.
Create Google Doc
A new Google Doc is created in the designated Drive folder, auto-titled with company name, job title, and date (e.g. 'Resume - Acme Corp - AI Engineer - 2026-06-10').
Make Doc Public & Log URL
Drive Permissions API sets the document to anyone-with-link reader access. The public URL is stored and passed to the Sheets upsert for easy retrieval during applications.
// Phase 3 — Log & Notify
Every job tracked. Every failure caught.
Google Sheets Upsert
Appends or updates a row keyed by apply_url. Logged fields: job title, company, location, salary, remote status, relevance score, score reasoning, cover letter, resume URL, date scraped, status ('To Apply').
Loop Continue
After each job is logged, the batch loop continues to the next item. When all jobs are processed, the loop exits and the run is complete.
Global Error Trigger
A dedicated error trigger node catches any node failure across the entire workflow — scraping errors, API timeouts, AI failures, or Sheets write failures.
Format Error Context
Extracts the failed node name, error message, timestamp, and execution ID into a clean structured payload for the notification email.
Gmail Error Notification
Sends a formatted HTML email with full failure context. Allows immediate diagnosis without needing to open n8n — node name and error message surface directly in the inbox.
// Technical Stack
Tools & technologies.
n8n
Orchestration PlatformManages all three phases — scheduling, parallel scraping, conditional branching, batch loops, and error handling — without custom server infrastructure.
GPT-4o-mini
AI Engine (×3 tasks)Powers relevance scoring, cover letter writing, and resume tailoring. Chosen for cost efficiency and consistent structured JSON output — making daily scheduled runs economically viable.
Apify
Job Scraping LayerRuns two actors in parallel — Google Jobs scraper and Career Site API — returning structured job listing datasets without building or maintaining custom scrapers.
Google Sheets
Job Tracker / CRMDual role: deduplication source (check if job already exists) and running CRM that tracks every processed job with score, documents, and application status.
Google Docs
Resume StorageAI-generated tailored resumes are stored as shareable Google Docs, auto-titled per role and company. Publicly accessible via link for direct submission during applications.
Gmail
Error NotificationsGlobal error handler dispatches structured HTML failure emails with node name, error message, timestamp, and execution ID — no need to check n8n to diagnose failures.
// Engineering Decisions
Why it was built this way.
Four free gates before any AI call
AI scoring costs credits. Running dedup, URL presence, description length, and seniority checks first eliminates low-quality jobs without spending a single token. Only jobs that pass all four gates enter the AI pipeline — keeping costs predictable and low at scale.
GPT-4o-mini for all three AI tasks
Scoring, cover letter writing, and resume tailoring don't require frontier-model reasoning. GPT-4o-mini produces consistent structured JSON and high-quality long-form text at a fraction of the cost of GPT-4o or GPT-4.1 — making daily scheduled runs economically viable without sacrificing output quality.
Score-gated document generation
Cover letters only generate at a score of 7 or above; tailored resumes only at 8 or above. This prevents wasted API calls and Drive storage on mediocre matches. The score thresholds are configurable per deployment to match different role standards or candidate profiles.
Parallel scraping with a unified normalisation layer
Running both Apify actors simultaneously cuts total run time roughly in half versus sequential execution. The normalisation Code node after each source ensures every downstream node works with a consistent schema — never needing to know which platform a job came from.
executeOnce on the Google Docs resume fetch
The base resume is fetched once per batch run, not once per job. Without executeOnce, the Google Docs API would be called for every job that passes the seniority gate — unnecessary latency and API quota usage that compounds across large result sets.
// Business Value
What this delivers.
Never miss a relevant opening
The workflow runs every morning before the working day starts. Every qualifying role posted in the last 24 hours is surfaced, scored, and documented automatically — regardless of whether the candidate is actively searching.
Application-ready in minutes
High-scoring roles arrive with a tailored cover letter and role-specific resume already generated and linked. The only remaining step is submitting the application.
Cost-controlled AI usage
Four filter gates ensure AI credits are only spent on jobs worth applying to. The score-gating system means the most expensive call — resume tailoring — only triggers for genuinely strong matches.
Full application CRM
Every processed job logs to Google Sheets with score, reasoning, cover letter, and resume URL. Track what's been applied to, what's pending, and what was filtered out — all in one place.
Runs without supervision
Once configured, the system operates daily without any manual intervention. The global error notification system ensures failures are flagged immediately with full diagnostic context.
Configurable per use case
Search queries, seniority filters, score thresholds, and document destinations are all parameterised. The same pipeline adapts to any role type, industry, seniority level, or candidate profile.
// need an automated sourcing pipeline?
Let's build your system.
Whether it's job sourcing, lead generation, or opportunity discovery — the same pipeline architecture applies to any domain.