How Jobrix Ranks Fresh Jobs
The match score is not a keyword count or a recency sort. It's a three-pass pipeline โ SQL skill filter, vector similarity, and Claude AI โ with freshness applied as a multiplier. Here's exactly how it works.
Quick answer
Jobrix ranks jobs by combining an AI fit score (how well the role matches your skills and resume) with a freshness multiplier (how recently it was posted). A 70% match posted 30 minutes ago outranks an 85% match posted yesterday โ applying early matters more than finding the perfect-looking role after the crowd.
Why standard job board ranking fails job seekers
Most job boards rank by one of three signals:
- Recency โ newest first, regardless of fit
- Paid placement โ companies that pay appear first
- Keyword count โ how many times your search terms appear in the description
None of these answer the two questions that actually matter: Is this role genuinely a match for my background? and Can I still be in the first wave of applicants?
Jobrix tries to answer both with a three-pass ranking system.
Pass 1 โ SQL skill pre-filter
Before any AI runs, the job pool is filtered by skill taxonomy. When you set your skills in your Jobrix profile (React, TypeScript, Node.js, etc.), the system only pulls jobs tagged with at least one of your primary or secondary skills.
This isn't fuzzy matching. It's a hard tag match against a master skill taxonomy built from the job descriptions we parse. A role tagged "Vue.js" won't surface for a "React" search unless you've added Vue as a secondary skill, or unless our AI parsed the JD and inferred it requires React-compatible knowledge.
Why this step matters: Running the full AI pipeline on 10,000 jobs per user per cycle would cost hundreds of dollars daily. The SQL pre-filter narrows candidates to 50โ200 relevant jobs per cycle, making deep AI matching economically viable.
Pass 2 โ Vector similarity scoring
Your resume text is embedded into a 1,536-dimension vector using a text embedding model. Each job description is embedded the same way. We compute cosine similarity between your resume vector and each candidate job's description vector.
Similarity thresholds:
- Below 0.65 โ filtered out (not semantically relevant)
- 0.65โ0.74 โ borderline โ passes to AI if the skill pre-filter score is high
- 0.75โ0.84 โ good match
- 0.85+ โ strong semantic match
This step catches nuance that keyword matching misses. A job description that never explicitly says "React" but is clearly a React role โ JSX patterns, hooks, component lifecycle, virtual DOM โ will still score well against a resume that demonstrates deep React experience. Conversely, a JD that mentions React in passing (e.g., "familiarity with React is a plus") in an otherwise Django-backend role won't falsely rank as a strong match.
Pass 3 โ Claude AI deep match
The top 20โ30 results from vector scoring go to Claude Haiku for structured evaluation. Claude reads your full resume and the complete job description and produces a structured score across four dimensions:
- Tech stack overlap โ exact skills the JD requires vs. what your resume demonstrates, weighted by how prominently each is mentioned
- Experience range fit โ "3โ6 years required" matched against your declared experience level
- Seniority alignment โ individual contributor vs. lead vs. manager signals in the JD vs. your most recent roles
- Role context fit โ startup vs. enterprise culture signals, on-site vs. hybrid vs. remote requirements, domain (fintech, edtech, B2B SaaS) if it matters for the role
The output is a 0โ100 score plus three specific reasons the role is or isn't a match. The reasons are what you see in the "Why this role" section of each job card.
Why Claude Haiku specifically:It's fast (sub-second for most JDs), cost-effective for high-volume matching, and accurate enough for structured scoring tasks. For Elite tier users, Claude Sonnet handles more nuanced evaluation on the highest-priority matches.
Freshness as a multiplier
After the AI score is computed, freshness is applied as a multiplier to produce the final ranking score:
| When the role was scraped | Freshness multiplier |
|---|---|
| Less than 1 hour ago | 1.5ร |
| 1โ4 hours ago | 1.2ร |
| 4โ12 hours ago | 1.0ร |
| 12โ24 hours ago | 0.85ร |
| 24โ72 hours ago | 0.7ร |
| More than 72 hours ago | 0.5ร |
A 70% AI match posted 30 minutes ago (70 ร 1.2 = 84 final score) ranks above an 85% match posted yesterday (85 ร 0.85 = 72 final score). This is intentional: the empirical benefit of applying early outweighs the marginal benefit of finding a slightly better-looking role two days later.
The ATS freshness rule
For roles from Greenhouse, Lever, Workday, and SmartRecruiters, the posted_at field returned by the platform API is unreliable. Companies often set it to when the JD was internally written or approved โ which can be weeks before the role goes live on the public careers page.
Jobrix uses scraped_at(when we first saw the role appear in our scrape) as the freshness signal for all ATS sources. A Greenhouse role that appeared in our 2:00 PM scrape is treated as "posted" at 2:00 PM for freshness purposes โ even if the company's API says it was "posted" three weeks ago.
This is why your dashboard shows "Found X ago" for ATS roles rather than "Posted X ago." The distinction matters: the scrape time is a reliable signal; the API's posted_at is not.
Signal tags
Each job card shows one of four signal tags, computed from freshness and AI score together:
- Hot โ Posted within 2 hours and AI score above 80. High-priority: apply now.
- Active โ Posted within 24 hours. Worth applying โ you're within the first-day window.
- Slow โ Posted 1โ3 days ago. Still worth a quality application, but you're no longer in the first wave.
- Ghost โ Older than 3 days, or the role shows no applicant activity signals. May be already filled or paused.
When your alert fires
The notify_aftertimestamp controls when a matched role triggers your Telegram alert. It's set at match-creation time based on your plan:
| Plan | Alert delay after scrape |
|---|---|
| Free | 8 hours |
| Pro | 30 minutes |
| Elite | 5 minutes |
The freshness multiplier is computed at ranking time โ when you open your dashboard or when the alert fires โ not when the job was scraped. A Pro user who sees their alert 30 minutes after scraping will see a freshness score reflecting that 30-minute window. For a role scraped at 2:00 PM, a Pro-tier alert at 2:30 PM shows the role with a 1.2ร freshness multiplier. An Elite user receiving the same alert at 2:05 PM sees 1.5ร.
What this means practically
Three things you can do to improve your ranking outcomes:
- Keep your resume current. The vector embedding and AI match are only as good as the resume text stored in your profile. Update it whenever you complete a significant project or change roles.
- Set specific primary skills. The SQL pre-filter runs before AI. If your primary skill is set to "JavaScript" instead of "React", you'll get a much noisier pre-filtered set, and the AI will rank more irrelevant roles above relevant ones.
- Upgrade to Pro or Elite if timing matters. The AI match score tells you what to apply for. Alert speed determines when you see it. For competitive frontend roles in Bangalore or Hyderabad, the 30-minute vs. 8-hour gap can be the difference between being in the first 20 applicants and the first 200.
See your ranked matches
Upload your resume and declare your skills. Jobrix builds your ranked match list from 10+ sources and starts sending alerts within the hour.
Start free โ