Job Application
Automation System

A Google Apps Script pipeline that monitors Gmail job alert digests, filters and scores every listing, routes them into a two-tab Google Sheet by priority, and generates tailored resumes and cover letters through the Claude API — entirely hands-off until you decide to apply.

3
Job board sources
6
Priority levels
4
JD fetch strategies
15min
Scan interval

What it does

📧

Email ingestion

Parses LinkedIn, Indeed, and Glassdoor job alert digests directly from Gmail using a label-based trigger.

🔍

Multi-layer filtering

Company blocklist, repost detection, automation title flagging, and location / remote eligibility checks.

📊

Priority routing

Scores each listing P1–P15 by recency and remote eligibility, then routes to the correct sheet tab automatically.

🤖

AI document generation

Generates a tailored resume and cover letter for each role via Claude Sonnet, using your base resume as source material.

📱

Mobile-friendly sheet

Alternating daily row text color so you can see posting age at a glance in portrait mode without horizontal scrolling.

✏️

Manual entry

Paste any Greenhouse, LinkedIn, or job board URL directly into the sheet to process a listing on demand.

How a listing moves through the system

1
Gmail label trigger
A time-based Apps Script trigger fires every 15 minutes and scans for unread emails carrying a job-alert label.
2
Digest parsing
Source-specific parsers extract job title, company, location, post date, and URL from LinkedIn, Indeed, and Glassdoor digest HTML.
3
JD fetch waterfall
Four strategies attempt to retrieve the full job description: direct URL fetch, redirect follow, DuckDuckGo career page search, and Gemini 2.5 Flash as a parsing fallback.
4
Filtering & scoring
Layer 0 blocks listed companies. Remaining listings are checked for reposts, automation-only titles, and location eligibility, then scored P1–P15.
5
Sheet routing
P1 and P2 listings go to the Job Tracker tab. Everything else routes to the Other tab. Both tabs share the same columns and conditional formatting.
6
Document generation (manual)
Use the Job Automation menu in the sheet to trigger a tailored resume and cover letter for any row. Claude Sonnet reads your base resume and the full JD, then writes documents saved to Drive.

Priority routing

Priority Criteria Tab
P1 Remote USA · posted under 2 hours ago Job Tracker
P2 Remote USA · posted under 24 hours ago Job Tracker
P3 Remote USA · any age Other
P5 Remote USA · state restriction flag Other
P10 On-site within 50 miles Other
P15 On-site · distance unresolved Other
— India-origin remote · on-site over 50 miles Ignored

Under the hood

Config.gs — all settings in one place
// Priority routing
const config = {
  SHEET_NAME:       'Job Tracker',    // P1 + P2
  SHEET_NAME_OTHER: 'Other',          // P3 and below
  AUTO_GENERATE:    false,            // manual-only mode

  // Layer-0 blocklist (case-insensitive, partial match)
  BLOCKED_COMPANIES: ['ExampleCorp'],

  // API keys — store in Script Properties, not here
  CLAUDE_API_KEY:  getScriptProperty('CLAUDE_API_KEY'),
  GEMINI_API_KEY:  getScriptProperty('GEMINI_API_KEY'),

  // Your Google Drive folder and source doc IDs
  DRIVE_FOLDER_ID: 'your-folder-id',
  BASE_RESUME_ID:  'your-doc-id',
};

File structure

⚙️
Code.gs
Main orchestration: email parsing, JD fetch waterfall, filter layers, priority scoring, and manual entry handler.
🔧
Config.gs
All user settings in one file — API keys, Drive IDs, tab names, blocklist, and the AUTO_GENERATE toggle.
📋
SheetManager.gs
Two-tab read/write, priority routing, conditional formatting (including alternating daily row color), deduplication across both tabs.
📁
DriveManager.gs
Creates dated subfolders in Drive and writes tailored Google Docs for resume and cover letter output.
🤖
ClaudeAPI.gs
Resume and cover letter generation via Claude Sonnet, plus JD pre-processing to clean extracted text before prompting.
✨
GeminiAPI.gs
Gemini 2.5 Flash fallback parser with retry logic — handles job pages that UrlFetchApp can't reach cleanly.

Tech stack

Runtime
Google Apps Script (V8)
Storage
Google Sheets · Google Drive
AI — generation
Claude Sonnet (Anthropic)
AI — fallback
Gemini 2.5 Flash (Google)
JD fetch
UrlFetchApp · DuckDuckGo
Scheduling
Apps Script time triggers