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.
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:
applied | rejected | interview | offerSmart Fallbacks — If the AI returns unknown:
rejected, "interview scheduled" → interview)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).
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 |
docker exec -it job-status-analyser-ollama-1 ollama pull llama3.1:8b
http://localhost:5679text.json| Node | Credential Needed |
|---|---|
| Gmail Trigger / Backfill | Gmail OAuth2 |
| Upsert Row in Sheets | Google Sheets OAuth2 |
Follow the n8n prompts to authorize both accounts.
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.
| 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_NORMmap orBODY_PATTERNSarray in the Final Merge Logic node.