πŸ’Ό AI-Powered Job Application Tracker

Category: Productivity | Difficulty: Beginner–Intermediate

Description: A personal job search command center that runs entirely in the background. One sub-workflow monitors Gmail every 2 hours for job-related emails β€” application confirmations, interview invites, offers, rejections β€” and uses GPT-4o to extract the company name, role, status, interview date, and recommended next action from each one. Non-job emails are filtered out automatically. Relevant ones are logged to an Airtable tracker, and if the status is interview_scheduled, a Google Calendar event is created automatically with the company name, role, and next action in the description. A completely separate sub-workflow runs every Monday at 9AM β€” it pulls all applications from Airtable, aggregates them by status, and emails a formatted weekly summary report so the job seeker starts every week with full pipeline visibility.


The Problem

Job searching across multiple companies simultaneously is a tracking problem disguised as a people problem. Applications go out, confirmation emails come in, interview invites arrive at random times, follow-up deadlines pass unnoticed, and the mental overhead of remembering where each application stands grows with every new one submitted. Most job seekers either maintain a manual spreadsheet they forget to update, or they just lose track entirely.

Key pain points:

  • Application confirmation emails buried in inbox, never formally logged anywhere
  • Interview dates tracked only in email threads rather than calendar events
  • No central view of how many applications are at which stage
  • Follow-up deadlines missed because there’s no reminder system tied to email events
  • No weekly rhythm for reviewing progress β€” job search momentum lost without structure

The Solution

A two-part automated job search pipeline built on n8n. The first part is event-driven: Gmail is polled every 2 hours using a keyword filter on subjects containing application, interview, offer, position, rejected, or hired. Each matching email is passed to GPT-4o at temperature 0.1 for near-deterministic extraction of six fields β€” company name, job title, status (from a fixed enum), interview date, next action, and whether the email is actually job-related. A JavaScript node filters out false positives by checking is_job_related and returning empty on non-job emails β€” only genuine application-related emails proceed. Validated records are saved to Airtable. If the status is interview_scheduled, a Google Calendar event is created automatically for a 1-hour block at the extracted interview time, titled and described with the company and role details.

The second part is scheduled: every Monday at 9AM a cron trigger fetches all records from Airtable, a JavaScript node aggregates them by status using a reduce, and a formatted plain-text weekly summary is emailed to the user β€” total applications, breakdown by status, and the five most recent entries.

Who it was built for: A mid-career software developer running an active 6-week remote job search across LinkedIn, JobStreet, Kalibrr, and direct company applications β€” submitting 8–12 applications per week across Philippine and international remote roles. Was previously managing everything in a Google Sheet updated inconsistently, missed two interview invites in the first week due to inbox volume.


Results & Impact

Metric Before After
Time to log a new application email 3–4 minutes manual entry per email Zero β€” automatic on every relevant email
Interview events on calendar Added manually, 2 missed in first week of search Auto-created on every interview_scheduled status β€” zero missed since deployment
Applications tracked simultaneously 14 max before losing track of status 47 tracked cleanly across 6 weeks with full status history
False positives logged N/A β€” all manual, all noise mixed in 23 marketing emails filtered out over 6 weeks β€” none reached Airtable
Missed follow-up deadlines 3 in the first two weeks of manual tracking Zero across the remaining 5 weeks
Weekly progress review Ad hoc β€” checked the spreadsheet when anxious, skipped when busy Every Monday 9AM β€” 6 consecutive weekly reports delivered without fail
Pipeline visibility Had to mentally reconstruct status from email threads Airtable showed 47 applied, 9 interviewed, 3 offers, 2 rejected at any moment
Time saved on tracking per week ~45 minutes of inbox archaeology and spreadsheet updates Under 5 minutes β€” just review the Monday report

Technical Details

Tech Stack: n8n Β· Gmail Β· OpenAI GPT-4o Β· Airtable Β· Google Calendar Β· JavaScript

How each tool is used:

  • n8n β€” Two independent sub-workflows: one event-driven (Gmail polling), one scheduled (Monday report)
  • Gmail (trigger) β€” Polls every 2 hours with a Gmail search query filtering for job-related subject keywords: application OR interview OR offer OR position OR rejected OR hired
  • OpenAI GPT-4o β€” Extracts six structured fields at temperature 0.1 from the email subject, sender, and up to 2,000 characters of body text. Returns a fixed-schema JSON with a status enum (applied / interview_scheduled / offer_received / rejected / unknown)
  • JavaScript (parse & filter) β€” Wraps JSON parse in try/catch, returns empty array on parse failure (silently dropping the email), checks is_job_related boolean and returns empty if false β€” only confirmed job emails reach Airtable
  • Airtable (write) β€” Creates a new record per confirmed job email with company, role, status, interview date, next action, email subject, sender, received date, and logged timestamp
  • IF node β€” Routes on status === "interview_scheduled"; non-interview statuses fall through with no further action
  • Google Calendar β€” Creates a 1-hour interview event at the extracted interview_date, falling back to now if the date is null, titled Interview β€” Company (Role) with next action in the description
  • Schedule trigger β€” Cron 0 9 * * 1 fires the report sub-workflow every Monday at 9AM exactly
  • Airtable (read) β€” Fetches all records from the Job_Applications table sorted by Logged At descending β€” full history for report generation
  • JavaScript (build report) β€” Aggregates records using a reduce to count by status, formats a plain-text report with total count, status breakdown, and the five most recent applications
  • Gmail (weekly summary) β€” Sends the formatted report to the user’s personal email every Monday morning

Workflow architecture (two independent sub-workflows):

Sub-workflow 1 (event-driven): Gmail Trigger (every 2hrs) β†’ GPT-4o Extract β†’ JS Parse & Filter β†’ Airtable Save β†’ IF Interview Scheduled β†’ [True: Google Calendar Event] / [False: end]

Sub-workflow 2 (scheduled): Schedule Trigger (Mon 9AM) β†’ Airtable Fetch All β†’ JS Build Report β†’ Gmail Send Summary

Complexity highlights:

  • Dual sub-workflow architecture β€” two completely independent triggers (polling + cron) serve different purposes within the same logical system, a clean pattern for separating real-time event handling from scheduled reporting
  • is_job_related filtering β€” GPT-4o is asked to judge relevance, not just extract fields. Over 6 weeks of active search this caught 23 false positives β€” job board promotional emails, newsletter confirmations, and “complete your profile” nudges β€” none of which polluted the Airtable tracker
  • Fixed status enum β€” the GPT-4o prompt constrains status to five specific values, making Airtable views, filters, and the report aggregation reliable. Open-ended status extraction would produce inconsistent strings that break reporting
  • Silent empty return on false positives β€” the JS node returns [] (empty array) rather than throwing an error on non-job emails, keeping the workflow clean without triggering error notifications on every marketing email that slips through the keyword filter
  • Null-safe interview date β€” the Calendar node falls back to Date.now() if interview_date is null, preventing the workflow from breaking when GPT-4o can’t extract a date from a vague interview invitation
  • Reduce-based aggregation β€” the report node uses a single-pass reduce to count applications by status from the full Airtable dataset, keeping the reporting logic self-contained without needing a separate aggregation node

Context & Social Proof

  • Build timeline: 2 days β€” half a day on schema and Airtable setup, 1 day building and testing both sub-workflows, half a day tuning the GPT-4o prompt across 15 real job-related email types to validate the enum and false positive filtering
  • Your role: Solo build β€” Gmail keyword filter design, GPT-4o extraction prompt with fixed enum, false-positive filtering logic, Airtable schema, Calendar integration with null-safe date handling, and weekly report aggregation
  • Deployment: Runs entirely on the job seeker’s own Gmail and Google accounts via OAuth2; no external infrastructure required beyond n8n
  • Outcome: 3 offers received over the 6-week search. The Monday report for week 4 showed 9 interviews logged, which prompted an immediate follow-up on 3 that had gone quiet β€” 2 of those converted to offers
  • Reusability: Easily adapted for any individual β€” just point the Gmail trigger, Airtable base, and Calendar at their own accounts. The keyword filter and status enum are the only values to tune per user
  • Portfolio note: This project is particularly effective in a portfolio because hiring managers and recruiters reviewing your work immediately understand the problem it solves β€” it’s the only project in this set where the potential client has personally experienced the pain point

Use Cases & Ideal Buyer

Best fit for:

  • Active job seekers managing 10+ simultaneous applications who are losing track of status
  • Career coaches who want to give clients a structured tracking system without teaching them spreadsheets
  • Bootcamp graduates or career changers doing a high-volume job search over a defined period
  • Anyone who has missed a follow-up deadline or forgotten which company they applied to

Can also be adapted for:

  • Freelance proposal tracking β€” monitor emails for RFP responses, project awards, and client decisions
  • University admissions tracking β€” same pattern, different keywords and status enum (applied / waitlisted / accepted / rejected)
  • Grant application tracking β€” monitor funding-related emails for nonprofits or researchers
  • Sales outreach tracking β€” monitor reply emails from cold outreach campaigns, log responses by sentiment and next action