
πΌ 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_relatedboolean 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, titledInterview β Company (Role)with next action in the description - Schedule trigger β Cron
0 9 * * 1fires 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_relatedfiltering β 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
statusto 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()ifinterview_dateis 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
