Job recommendations
JobStash needed to rank jobs per candidate, on the site and in a weekly email, and to prove each new ranking beat the last.
Apply to, save or view jobs as this candidate, then watch similar jobs climb and the reasons for the top job change.
Example candidate
Senior backend engineer: Go, Postgres, TypeScript
Asked for senior rolesSmall companiesRemote only, so 2 on-site jobs are left out
1Act on a job
Each action lifts jobs like it: the same kind of role, tags and seniority.
- 17.7
Data Platform Engineer
- 26.4
Senior Backend Engineer
- 36.1
Analytics Engineer
- 45.8
Machine Learning Engineer
- 55.4
Frontend Engineer
- 64.9
Full-Stack Engineer
- 74.5
Site Reliability Engineer
- 83.6
Staff Backend Engineer
Starting history: applied to a data job, saved another, looked at two frontend jobs.
4Did the ranking work?
Every list shown is logged. Acting on a job within 7 days counts for the ranking that showed it.
- Shown in top 3
- 3
- Acted on from top 3
- 0
- Top 3 rate
- 0%
2Why #1 is on top
- The job says
- Your profile says
Score
3Old activity fades
Apply 8 · Save 5 · View 2 · Glance under 5s 0.5 · Unsave −3. Applies fade over about 180 days, saves 120, views 45.
Example candidate, jobs and companies, all made up. The action weights and fade rates are the real ones; how they add up to a score is simplified.
I designed the JobStash recommendation engine. David Leonardi built it.
Behaviour
Every action on a job is evidence, weighted by kind: an application counts most, then a save, then a view. A bounce barely counts and an unsave counts against. Recent actions weigh more, and each kind decays at its own rate. The result is what a person leans toward: role types, tags, seniority.
Stated preferences
Skills and preferences come next: role, seniority, company size, salary, location, languages. Some are filters, the rest adjust the order. The feed skips companies you already belong to, and the weekly email never repeats a job.
Text matching
Averaging a whole job post into one vector blends the requirements with the benefits and the legal footer. The engine splits posts and profiles into sentences, drops boilerplate, and matches sentence to sentence.
Measurement
The engine records every job shown and its position. An action within seven days is credited to the ranking version that showed it, which gives click, save and apply rates per version, on the site and in the email, alongside unsubscribes. A new version has to beat the old one on those numbers.