Free n8n flow

AI job matcher

This workflow collects jobs, asks Claude to score them against a person's profile, and emails the ones that clear a score. It is free. There is no form on this page. You import it into your own n8n and run it there.

The flow file and setup help are in #freebies on our Discord.

What it actually does

One workflow, three parts. They run on their own. It matches job listings. It does not apply for anyone, and it does not offer a role, a placement, or an interview. It sends a list.

Every 3 hours, it collects jobs

A schedule named Every 3 hours starts this part. The search terms in the file are software engineer, product manager, marketing manager, data analyst, and sales manager. From there it fetches three feeds:

  • Company boards on Greenhouse, Lever, and Ashby. The file already lists Stripe, HubSpot, Klaviyo, Airbnb, Databricks, Meesho, Gopuff, Notion, and OpenAI. These are public JSON feeds. No key.
  • Adzuna, one search per term, 50 results, jobs posted in the last 30 days. The URL in the file is Adzuna's India search (/jobs/in/). You add your own app id and key. Change the country in that URL if India is the wrong one.
  • RemoteOK's public feed. No key. Each row is marked Remote.

It joins the three lists, keeps one row per job id, and drops anything older than 90 days. A job counts as fresh at 60 days or newer, and also when it has no date. If one feed fails, that node is set to continue, so the others can still land. The rows are written into a Supabase table named jobs.

Every day at 08:00, it scores each person

A second schedule, named Daily 08:00, runs at 08:00 on the clock of your n8n instance. It loads people marked active in a job_seekers table. For each person it takes up to 15 fresh jobs whose title contains their function, and skips jobs already stored for them.

Those jobs go to Claude (claude-haiku-4-5), 20 at a time. With a shortlist of 15, that is usually one call. The prompt asks for a score from 0 to 100, a short fit line, and concerns. It tells Claude to weigh seniority, domain, and whether the location or remote setup fits the profile.

Anything at or above that person's min_score is kept. If min_score is missing, the cutoff is 70. Matches are saved to user_job_matches: the person, the job, and the score. Then Resend emails them the score, title, company, location, a link, and the fit line. If nothing cleared the cutoff, the email says nothing new today. The concerns are not stored, and they are not in the email.

It walks one person at a time. The profile is a text field on job_seekers. Nothing personal is baked into this file.

If a run fails, it can email you

An error branch writes the workflow name, the node that failed, the message, and a link to the execution, then sends that through Resend. It only runs if you set this same workflow as its error workflow in the n8n settings.

What you connect

There are no n8n credential pickers in this file. Keys sit in the HTTP nodes as placeholders, except the Claude key, which is an env var.

  • Supabase. The project URL and the service role key, in the HTTP headers. That key skips row security, so keep it in n8n and not in a public place. The notes in the file name three tables:
jobs(id text pk, source, title, company, location, url, description, posted_at timestamptz, fresh bool, created_at default now())job_seekers(id, email, profile text, function text, min_score int, active bool)user_job_matches(user_id, job_id, score, created_at, unique(user_id, job_id))
  • Adzuna. An app id and an app key, in the Adzuna search node (YOUR_ADZUNA_APP_ID and YOUR_ADZUNA_APP_KEY).
  • Anthropic. An API key in the n8n env var ANTHROPIC_API_KEY. The Claude node reads $env.ANTHROPIC_API_KEY. If n8n blocks that read, use the env access fix.
  • Resend. An API key (YOUR_RESEND_API_KEY), a from address (the file says jobs@YOUR_DOMAIN.com), and an alert address ([email protected]).

Greenhouse, Lever, Ashby, and RemoteOK need no account. Replace every YOUR_... placeholder, and set the Supabase URL, before you turn the workflow on.

How to use it

Four steps. The file in #freebies is rup-ai-job-matcher.json.

1

Get the file

Join Discord and open #freebies. The flow file and setup help are there.

2

Import into n8n

In n8n, use Import from File and pick the JSON from #freebies.

3

Connect what it asks for

Create the three Supabase tables, paste in the Supabase, Adzuna, and Resend values, and set ANTHROPIC_API_KEY.

4

Run it

Add one active row to job_seekers, then run the daily branch from Daily 08:00. You should get a digest, or a note that nothing cleared the score. Turn the workflow on when you want the 3 hour and 08:00 schedules to keep going.

Questions

Does this get someone a job?

No. It matches public job listings to a profile and emails the ones that clear a score. It does not submit applications.

How many listings does Claude see?

Up to 15 fresh listings per person, sent 20 at a time. With a shortlist of 15, that is usually one call. The model in the file is claude-haiku-4-5.

What score gets emailed?

Listings at or above that person's min_score. If min_score is empty, the cutoff in the file is 70.

The Claude node cannot read $env. What now?

n8n 2.x blocks environment access in nodes unless you set N8N_BLOCK_ENV_ACCESS_IN_NODE=false or move the key into a credential. The env access page walks through both.

A small note

Goat O Mate is a community of builders shipping marketing and AI automations together.

Session 1 is coming soon. Join the Discord to hear first.

Join Discord