Active job-seekers who apply to 10–30 roles a week and lose track of which application is at what stage. Built for anyone tired of manually updating a spreadsheet every time a recruiter replies — or worse, realizing their tracker has been lying to them for two weeks.
This workflow runs every morning at 9 AM, scans your Gmail for job-application emails, and uses GPT-4o-mini to extract three things from each one:
It then writes structured rows into a Google Sheet — one row per application, identified by a Match Key of Company | Position. New applications get appended automatically. Status changes for existing rows (Applied → Interview, Interview → Offer / Rejected) are gated behind a one-tap email approval, so an LLM misclassification can never silently demote a row.
Daily 9 AM Trigger
↓
Fetch Gmail (filtered by ATS senders & job-keyword subjects, last 2 days)
↓
Process Email Data (clean & truncate body to 4000 chars)
↓
Extract Key Information (GPT-4o-mini, structured JSON output)
↓
Format Data (build Match Key)
↓
Filter Valid Job Updates ──→ Other ──→ "Other app" sheet tab
↓
Branch by Status
├─ Applied ──→ Track New Application (append row)
└─ Interview / Offer / Rejected
↓
Aggregate into single digest
↓
Email & Wait for Approval (sendAndWait)
↓
Merge → Split → Update Application (match by Match Key)
Key design choices:
Company | Position should stay one row.Prerequisites:
gpt-4o-mini accessSteps:
Create your tracker sheet. Make a Google Sheet with two tabs:
Sheet1 — columns: Thread ID | Match Key | Date | Company | Position | Status | Modified DateOther app — same columns (used for unclassifiable emails)Import this template. Open n8n → Workflows → Import from File. n8n will flag missing credentials.
Configure three credentials:
Open AI nodeFetch Job Application Emails and Email Updates & Wait for ApprovalReplace placeholders (search the workflow for these strings):
YOUR_GOOGLE_SHEET_ID → your real sheet ID (from the sheet's URL)[email protected] → the address that should receive approval digestsTest it manually. Click "Execute workflow" and verify the Gmail node returns recent emails, the LLM extracts clean JSON, and a sample appears in your sheet.
Activate. Toggle the workflow to active and it will run daily at 9 AM.
Daily 9 AM Trigger to any cron expression.newer_than:2d. Bump to 7d if your daily run sometimes fails — the workflow handles re-processed emails idempotently because Match Key updates are no-ops on identical data.Extract Key Information includes English and French status phrases. Add your language's equivalents to each section (Rejected, Applied, etc.).options.limitWaitTime.values.resumeAmount (in hours) to the approval node if you want stale digests to auto-cancel.Manual spreadsheet tracking lasted me two weeks before it became the chore I'd skip on busy days. By week three the sheet was lying to me — half the "Applied" rows were rejections I hadn't logged yet. So I built this. It's not a system of record; it's a guided draft I skim once a week. The bones might be useful to someone else.