Searching for and landing a job these days is brutal. You'll spend hours combing through fake job postings and stalking companies on LinkedIn, only to finally land an interview that spawns 5 other interviews along with a take home project (aka free labor). However, with the right infrastructure, you can at least save some time on research and discovery by letting n8n, Gemini, and your CRM or Google Sheets handle the process for you.

Here's the tech stack I actually use to find contracting opportunities and new clients for my SaaS, Super Easy CRM.

  • Self Hosted n8n: Costs around $5 per month to host on Hetzner. This job search workflow runs on the same box I use for the rest of my automation lab.
  • Google Workflow: scrapes the internet for jobs without using tokens (included in many Google Workspace subscriptions)
  • Google Sheets: Free and used as middleware.
  • Gemini: very token friendly, currently running the gemini-3-flash-preview model
  • Super Easy CRM: the ultimate destination for my prospects and where outreach begins.

Here's the whole flow

n8n Automated Job searching with Gemini

One digest email, two Gmail calls

The trigger is on a schedule that runs daily. Once it fires, it kicks off the process. From there it hits Gmail twice, but not as two separate branches, it's one email pulled in two steps. The Get many messages node runs a search filtered to the subject line Your Job Roundup and grabs the single most recent match, because Gmail's list endpoint only hands back a snippet, not the full body. So Get a message follows up with a direct fetch on that message ID to pull the whole thing. It's important to avoid the summary since the process that handles the scraping pulls in a giant chunk of data.

Splitting one email into ten job listings

That full email is one digest with multiple job listings packed into it, each one starting with Company:. The first JavaScript node splits the body on that marker and regexes out the fields I actually care about per listing: title, phone, email, description, salary, date posted, keywords, job link. One email in, ten structured job items out.

Gemini Is There To Handle Scoring and Normalization

Those ten items go into a Basic LLM Chain running on Gemini, and this is the only place in the whole flow spending tokens. I'm not asking Gemini to filter anything just to score. It's the same principle I use in my data enrichment pipelines: use AI to evaluate structured data, not to do work that deterministic automation can handle. The prompt lays out everything about me, my stack, what I actually want to be doing, what I'll pass on, and has Gemini break each job down into category scores: skill match, technology match, consulting potential, compensation, flexibility. It totals those into a 0 to 100 score, then lands on one recommendation: apply, pitch_consulting, apply_and_pitch, monitor, or skip. That recommendation field, not the number, is what actually drives the routing later.

Gemini's response comes back as a block of text, sometimes wrapped in markdown fences depending on the day. A second JavaScript node strips those fences, parses the JSON, and merges the scoring fields back onto the original job data by index, so every row ends up with both the raw listing and the full evaluation sitting side by side.

Ten Requests an Hour Barely Registers on the Dashboard

Monitoring token usage with Google AI Studio

If you want to actually confirm how token friendly this setup is instead of just taking my word for it, Google gives you a Gemini API Usage dashboard. Pick your project, set the time range, and it charts total requests against success rate for whatever window you're looking at. Mine's set to Last Hour here, and with ten job listings running through the LLM Chain once per run, the whole thing barely shows up on the chart. That's the tradeoff paying off: Gemini doing the scoring instead of the filtering keeps the token spend low enough that I don't think about it. It's a different bill than a stack like Airtable, Make, and Apify racks up once you start layering enrichment and email lookups on top.

Every job lands in the sheet before anything gets filtered

Every single one of those rows, regardless of score or recommendation, gets appended to Google Sheets first. The sheet isn't downstream of the filter, it's upstream of it. I want a full record of everything that got scraped and scored, good, bad, or a flat skip, living somewhere outside the CRM, because Super Easy CRM is where I work active prospects, not where I want a pile of jobs Gemini already told me to pass on.

Only the recommended action routes to the CRM

Only after that append does the If node check the recommended_action field. Anything scored apply_and_pitch or pitch_consulting gets POSTed to Super Easy CRM as a new company. Everything else already lived its full life in the spreadsheet, and that's fine.

A failed CRM push still gets tracked

The last piece is what happens when that POST fails. Instead of just losing the prospect, the error branch off HTTP Request goes back into the same sheet, matches the row by company name, and updates it to flag that it didn't make it into the CRM. So the sheet doubles as an audit trail, not just for what Gemini scored, but for what actually landed where I work it and what quietly failed on the way there.

Fight AI with AI To Succeed in Today's Job Market

The companies you are applying to are using AI post the job, filter candidates, and decide who gets an interview. If you aren't doing the same and still cold applying to jobs, you're doing yourself a disservice. This workflow allows you to cut through a ton of wasted time, and fruitless Indeed searches.

Granted, nothing beats a solid network and a referral but if you have to go it alone, why not employ a robot army to help you land your next high paying gig or client. And, if you want the full workflow, feel free to drop me a request at contact@mattflows.com