Automatic workflow to categorise your job status
Go to WorkflowDescription
Job Application Status Analyser
An automated n8n workflow that monitors your Gmail inbox, classifies job application emails using a local AI (Ollama), and logs every application — with company, role, and status — to a Google Sheet in real-time.
No cloud AI APIs. No rate limits. Fully local, fully private.
How It Works
Gmail ➜ Preprocess ➜ Filter Spam ➜ AI Classify (Ollama) ➜ Parse ➜ Merge ➜ Judge ➜ Google Sheets
Email Ingestion — Gmail Trigger polls for new emails every minute from Primary/Updates categories. A manual backfill trigger lets you process the last 150 emails on demand.
Preprocessing — Extracts subject, sender, body text, date, and application links (ATS portals like Greenhouse, Lever, Workday, etc.) from raw email data.
Spam Filter — Drops newsletters, promotional digests, and sale emails via regex before they hit the AI.
AI Classification — Sends each email to a local Ollama instance (Llama 3.1 8B) with a structured prompt. The AI extracts:
Company name
Role / job title
Status — applied | rejected | interview | offer
Smart Fallbacks — If the AI returns unknown:
Status → 100+ keyword normalization map + regex body scan (e.g., "unfortunately" → rejected, "interview scheduled" → interview)
Role → Regex extraction from email body (e.g., "apply for the Software Engineer 3, AMP role")
Company → Sender display name → domain extraction (with generic domain blocklist) → body scan patterns ("team at X", "your application to X")
Override Rules — The word "unfortunately" in any email body forces status to rejected, regardless of AI output.
AI Judging Gate — A second Ollama pass validates each result, filtering out any remaining spam or false positives.
Google Sheets Upsert — Clean data is written to your Google Sheet with columns: company, role, status, Application Link, Last Update Date, Applied Date.
Daily Summary — An hourly scheduled trigger reads the sheet and generates application stats (applied/interview/rejected/offer counts).
Setup Steps
Prerequisites
Docker Desktop installed
Gmail account
Google Sheets API enabled (Google Cloud Console)
1. Clone & Start Services
git clone <repo-url> && cd job-status-analyser
docker compose up -d
This spins up two containers:
| Service | Port | Purpose |
|---------|------|---------|
| n8n | localhost:5679 | Workflow automation engine |
| Ollama | localhost:11434 | Local LLM inference server |
2. Pull the AI Model
docker exec -it job-status-analyser-ollama-1 ollama pull llama3.1:8b
3. Import the Workflow
Open n8n at http://localhost:5679
Go to Workflows → Import from File
Select text.json
4. Connect Credentials
| Node | Credential Needed |
|------|-------------------|
| Gmail Trigger / Backfill | Gmail OAuth2 |
| Upsert Row in Sheets | Google Sheets OAuth2 |
> Follow the n8n prompts to authorize both accounts.
5. Configure Google Sheet
Create a new Google Sheet with these column headers:
company | role | status | Application Link | Last Update Date | Applied Date
Copy the Sheet URL and update it in the Upsert Row in Sheets and Read All Applications nodes.
6. Activate & Run
Click Active toggle to enable the Gmail trigger (polls every minute)
Or click Backfill Trigger manually to process your last 150 emails immediately
Tech Stack
| Component | Technology |
|-----------|-----------|
| Workflow Engine | n8n (self-hosted) |
| AI/LLM | Ollama + Llama 3.1 8B |
| Email Source | Gmail API (OAuth2) |
| Data Store | Google Sheets |
| Infrastructure | Docker Compose |
> Tip: If specific company emails are still misclassified, add keywords to the STATUS_NORM map or BODY_PATTERNS array in the Final Merge Logic node.