← back to work
AI Systems · Automated Pipeline

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.

n8nGPT-4o-miniApifyGoogle SheetsGoogle DocsGmailSchedule Trigger

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.

// pipeline-overview

Phase 1 — Scrape & Filter

Schedule Trigger
8AM daily
Google Jobs
Apify Actor
Career Site API
Apify Actor
Normalise & Merge
Unified schema
4 Filter Gates
Dedup · URL · Desc · Seniority

Phase 2 — AI Pipeline

Fetch Resume
Google Docs
Score Job
GPT-4o-mini · 1–10
Score ≥ 7
Cover Letter
Score ≥ 8
Tailored Resume
Google Doc
Auto-created + public

Phase 3 — Log & Notify

Sheets Upsert
Keyed by apply_url
Error Trigger
Global catch
Gmail Alert
Node · message · timestamp

// Phase 1 — Scrape & Filter

From trigger to qualified lead list.

1

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.

2

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.

3

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.

4

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.

5

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.

6

Gate 2 — Apply URL

Drops any job with no apply link. No link means no application path — no point scoring or generating documents.

7

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.

8

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.

1

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.

2

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.

3

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.

4

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.

5

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.

6

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.

7

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').

8

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.

1

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').

2

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.

3

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.

4

Format Error Context

Extracts the failed node name, error message, timestamp, and execution ID into a clean structured payload for the notification email.

5

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 Platform

Manages 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 Layer

Runs 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 / CRM

Dual 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 Storage

AI-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 Notifications

Global 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.

Decision 01

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.

Decision 02

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.

Decision 03

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.

Decision 04

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.

Decision 05

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.