These Glassdoor alerts are not spam. They are real job mail — and there are too many of them. Each unread message dumps a bundle of roles: one I might apply to, plus GTM, COBOL, DevOps, music, or a Node.js stack I do not want. I do not need a fuller inbox. I need that mail processed: filtered, then summarized into something I can act on.

Problem. A pile of legitimate unread emails I still have to read by hand.

Unread Glassdoor job alerts filling the inbox

Solution. One concise email. Only Backend / AI / ML titles stay; backend + Node.js is dropped. Each match is a short card — title, company, location, why it was kept, and Open listing.

Apply-list digest with five filtered jobs

This n8n workflow watches unread Glassdoor mail, does that filter on the email body, and sends the HTML digest. It never opens Glassdoor listing pages (those come back as a “humans only” block anyway).

Download the workflow (no credentials, placeholder recipient):

n8n-gmail-glassdoor-shortlist.json

Import it in n8n, attach your Gmail and Gemini credentials, set the recipient, then publish.

Gmail apply-list nodes in n8n

The same graph in the n8n editor:

Glassdoor Gmail apply-list workflow in n8n

Purpose

I want a short list I can actually apply to, not another dump of every link in the alert. The flow:

  • Runs only on unread mail from noreply@glassdoor.com
  • Extracts jobs from the email body (title, company, location, link, snippet)
  • Keeps titles that contain backend, AI, or ML
  • Drops titles that contain backend and Node.js / nodejs
  • Dedupes by jobListingId so the same vacancy is not emailed twice
  • Sends a Google-style HTML summary, including a “0 jobs” mail when nothing matched
  • Marks only the processed Glassdoor messages as read

Outcome

Each run ends with one email in my inbox: cards for Backend or AI/ML matches (title, company, location, reason, Open listing), or a short “no matching jobs” letter plus the titles that were reviewed. Processed alerts leave the unread pile, so the trigger does not loop on the same message.

Step by step

1. Gmail Trigger

Gmail Trigger

Poll unread messages from Glassdoor. This is the only entry point for the apply-list. No HTTP request to the job URL.

2. Set content

Set content

Copy body, thread id, and Gmail message id. Later nodes reuse this payload when pairing items after Gemini.

3. Extract jobs

Extract jobs

Gemini (gemini-2.5-flash-lite) returns a JSON array of listings from the email. Footer links such as “create job alert for Node.js” are ignored.

4. Parse vacancy JSON

Parse vacancy JSON

Normalize the model output to one item per job and parse jobListingId from the Glassdoor URL.

5. Title gate

Title gate

Cheap keyword filter on the title only: keep backend / AI / ML; reject backend + Node.js. GTM, music producer, and generic “software engineer” without those words never reach the classifier.

6. Classify stack

Classify stack

If anything survived the gate, Gemini labels backend, ai_engineer, or reject. apply is true only for the first two. If the gate is empty, the workflow skips this call and builds a zero-match digest.

7. Digest and send

Digest and send

Dedupe against ids already sent, build HTML (Material-style Google palette), send with the Gmail node (emailType: html). Empty lists still send a review summary.

8. Mark as read

Mark as read

Mark the Gmail message ids from this run as read. Other unread Glassdoor mail stays unread until a later poll.

Import notes

  1. Import the JSON into n8n.
  2. Recreate Gmail OAuth and Google Gemini (PaLM) credentials on the Gmail and Gemini nodes.
  3. Change you@example.com on Send apply list.
  4. Publish the workflow so the Gmail trigger polls.

This is the public, credential-free cut of the Gmail apply-list I run locally in Docker.