Overview
Location and preferences act as filters that focus the AI matching engine on jobs the candidate would actually consider. A brilliant technical match is worthless if the job is 200km away and the candidate only wants to work within cycling distance. Similarly, a perfect skills match for a full-time on-site role is irrelevant if the candidate only wants remote contract work. By configuring these preferences, you tell Recruitier exactly what to look for — and what to exclude — so every match that surfaces is a genuine opportunity worth your time and the candidate’s attention.Setting the Candidate Location
Google Maps Autocomplete
When you set or update a candidate’s location, Recruitier provides a Google Maps autocomplete field. As you type, it suggests matching locations:- Cities: “Amsterdam”, “Rotterdam”, “Utrecht”
- Neighborhoods: “Amsterdam Zuidoost”, “Rotterdam Centrum”
- Specific addresses: “Keizersgracht 520, Amsterdam”
- Regions: “Randstad”, “Noord-Holland”
| Data | Purpose | Example |
|---|---|---|
| Display name | Human-readable location shown in the UI | ”Amsterdam, Netherlands” |
| Latitude and longitude | Precise coordinates for distance calculations | 52.3676, 4.9041 |
| Normalized name | Standardized location format for consistent display | ”Amsterdam, North Holland, Netherlands” |
Automatic Geocoding
If you enter a location as text without using the autocomplete picker (for example, when editing a profile directly or when location is extracted from a CV), Recruitier attempts to geocode it automatically through a multi-step process:Dutch City Database
The location string is first checked against a comprehensive database of Dutch cities. This provides fast, accurate resolution for the most common case (Dutch candidates looking for Dutch jobs).
Nominatim API
If the location is not found in the Dutch city database, it is sent to the Nominatim geocoding API (the open-source geocoding service behind OpenStreetMap). This handles international locations and less common Dutch addresses.
Distance-based matching requires coordinates. If a candidate’s location has not been successfully geocoded (no latitude/longitude), the matching engine skips the location filter entirely and shows jobs regardless of distance. The location penalty factor defaults to 1.0 (no penalty), which means distant jobs will not be penalized. Setting a proper geocoded location ensures relevant geographic results and prevents your candidate from being matched to jobs across the country when they only want local opportunities.
Search Radius Configuration
The search radius defines how far from the candidate’s location the AI should look for jobs. This is specified in kilometers and defaults to 40 km when adding a new candidate through the upload wizard. The slider ranges from 5 km to 200 km.Recommended Radius Settings
| Radius | Typical Use Case | Dutch Context |
|---|---|---|
| 10-15 km | Urban candidates who want to stay in their city | Within Amsterdam, within Rotterdam |
| 25-30 km | Candidates open to nearby cities | Amsterdam to Amstelveen/Haarlem, Rotterdam to Delft |
| 40 km | Default. Good for metro areas | Covers the core Randstad from a central location |
| 75-100 km | Candidates open to a wider region | Amsterdam to Utrecht, Rotterdam to Eindhoven |
| 150+ km | Candidates willing to relocate or travel extensively | Cross-country coverage |
How Radius Affects Matching (The Location Penalty)
The search radius does not create a hard cutoff at the boundary. Instead, it defines a three-zone scoring system with graduated penalties:Zone 1: Within the Radius (factor = 1.0)
Zone 1: Within the Radius (factor = 1.0)
Jobs located within the candidate’s preferred radius receive the full match score with no location penalty. If a candidate sets a 50km radius and a job is 30km away, it receives a location factor of 1.0 — no reduction.This is the “sweet spot” where the candidate is comfortable commuting.
Zone 2: Between 1x and 2x Radius (factor = 0.7 to 1.0, linear decay)
Zone 2: Between 1x and 2x Radius (factor = 0.7 to 1.0, linear decay)
Jobs between the preferred radius and twice the preferred radius receive a gradually decreasing score. The penalty is applied using linear interpolation:
- At exactly 1x the radius: factor = 1.0 (no penalty)
- At 1.5x the radius: factor = 0.85 (15% penalty)
- At 1.9x the radius: factor = 0.73 (27% penalty)
- At exactly 2x the radius: factor = 0.7 (30% penalty)
Zone 3: Beyond 2x Radius (excluded)
Zone 3: Beyond 2x Radius (excluded)
Jobs beyond twice the preferred radius are excluded entirely from search results. They are not retrieved, not scored, and never shown to you. For a 50km radius, this means jobs beyond 100km are invisible.This hard cutoff prevents the system from wasting scoring resources on jobs that are clearly too far away.
The default search radius is 40 km when adding a new candidate through the wizard. For most candidates in the Netherlands, this covers their local metro area and surrounding cities. For a candidate based in Amsterdam with a 40km radius, this covers Amsterdam, Haarlem, Hilversum, Almere, and surrounding areas. Jobs up to 80km are visible (with penalty), and beyond 80km they are excluded. You can adjust the radius at any time from the candidate’s profile.
Remote Jobs and Location
Jobs marked as remote bypass the location filter entirely. They always receive a location factor of 1.0 (no penalty), regardless of the candidate’s location or search radius:- A candidate in Maastricht with a 25km radius will still see remote jobs from companies in Amsterdam
- A candidate in Groningen with a 10km radius will see remote jobs from Rotterdam
- The location penalty calculation is simply skipped for remote positions
Jobs Without Location Data
Some job listings do not include a specific location or the location could not be geocoded. When either the candidate or the job is missing coordinate data, the location penalty defaults to 1.0 (no penalty). This means:- Jobs without coordinates are treated as if they are within the candidate’s radius
- Candidates without coordinates see jobs from all locations without penalty
Salary Expectations
Configure the candidate’s salary expectations to help evaluate matches:- Minimum salary — The lowest acceptable compensation
- Maximum salary — The target or ideal compensation
salary_expectation_min and salary_expectation_max.
Many job listings in the database do not include salary data. When a job listing does not have compensation information, salary filtering is not applied and the match is evaluated based on other factors (skills, title, experience, location). Salary preferences are most useful when your job database has compensation information, which varies by source and market.
Job Type Preferences
Set which types of employment the candidate is open to:| Job Type | Description | Common Use Case |
|---|---|---|
| Full-time | Standard full-time employment (36-40 hours) | Most common preference |
| Part-time | Part-time or reduced hours positions | Parents, students, semi-retired professionals |
| Contract | Fixed-term contract or freelance engagements | Contractors, interim professionals, ZZP-ers |
Flexibility Preferences
Define the candidate’s work arrangement preferences:| Flexibility | Description | Implications for Matching |
|---|---|---|
| On-site | In-office work at the employer’s location | Location and radius are critical; only nearby jobs make sense |
| Hybrid | Mix of office and remote work | Location matters but radius can be slightly larger |
| Remote | Fully remote positions | Bypasses location filter entirely (factor = 1.0) |
How Preferences Affect the Matching Pipeline
All preferences work together to narrow the job search in a layered filtering approach:Automatic Re-Matching on Location Changes
When you update a candidate’s location or search radius, Recruitier detects that these changes affect matching results and automatically triggers a re-match. The system monitors the following fields as re-match triggers:| Field | Trigger Condition |
|---|---|
| Location | Text value changed |
| Latitude | Coordinate value changed |
| Longitude | Coordinate value changed |
| Preferred radius | Radius value changed (in km) |
- Identifies all existing protected matches (favorited, applied, contacted, interviewing, offer stage, placed)
- Collects protected match job IDs into an exclude list
- Runs the full 5-stage matching pipeline with updated location parameters
- Adds new matches alongside existing protected ones
- Old pending matches that are no longer geographically relevant may be replaced
Changes to salary expectations, job type preferences, or flexibility preferences do not automatically trigger re-matching. If you update these preferences and want new matches, you can manually trigger a re-match from the candidate profile. This is by design to prevent excessive re-matching from minor preference tweaks.
Configuring Preferences: Best Practices
Ask the Candidate
Do not guess on preferences. A 5-minute conversation about location tolerance, salary expectations, and work arrangement preferences saves hours of reviewing irrelevant matches. Ask specifically: “What is the furthest you would commute daily?” and “Would you consider fully remote?”
Consider the Dutch Market
In the Netherlands, the Randstad area (Amsterdam, Rotterdam, The Hague, Utrecht) is densely connected by public transport. A 50km radius from Amsterdam covers most of this region. For candidates outside the Randstad (e.g., Eindhoven, Groningen, Maastricht), a larger radius (75-100km) may be needed to reach enough job opportunities.
Update When Priorities Change
Candidates’ preferences evolve. If someone initially wanted on-site work but is now open to hybrid, update the profile. Similarly, if a candidate initially set a 25km radius but realizes they need to widen their search, increasing to 50km triggers re-matching and surfaces new opportunities.
Use Remote for Max Coverage
If a candidate is truly flexible about remote work, enabling the “Remote” preference dramatically expands their job pool. Remote jobs bypass the location filter entirely, meaning a candidate in Maastricht can match with remote opportunities from companies anywhere in the Netherlands (or beyond).
Advanced
The Location Penalty Formula
The location penalty is a deterministic calculation applied after AI scoring. It is multiplicative, meaning it reduces the AI score by a percentage based on distance. Here is the exact formula:final_score = ai_score * location_factor
Example calculations:
| Candidate Radius | Job Distance | Location Factor | AI Score | Final Score |
|---|---|---|---|---|
| 50 km | 30 km | 1.0 | 85% | 85% |
| 50 km | 60 km | 0.94 | 85% | 80% |
| 50 km | 75 km | 0.85 | 85% | 72% |
| 50 km | 95 km | 0.73 | 85% | 62% |
| 50 km | 100 km | 0.70 | 85% | 60% |
| 50 km | 101 km | Excluded | 85% | N/A |
| 50 km | Remote | 1.0 | 85% | 85% |
How Geocoding Works Internally
The GeocodingService follows a cascading resolution strategy designed for the Dutch market:- Dutch City Database: A pre-loaded list of Dutch cities with their coordinates. This provides sub-millisecond resolution for the most common case. Cities are matched case-insensitively with common variations handled (e.g., “Den Haag” and “‘s-Gravenhage” both resolve to The Hague).
- Nominatim API: For locations not in the Dutch database (international locations, specific addresses, neighborhoods), the Nominatim API provides geocoding. This is the same service that powers OpenStreetMap search. Results include coordinates, display name, and a normalized address string.
- AI Normalization: For location strings that neither the database nor Nominatim can resolve (ambiguous descriptions, regional names, informal location references), AI-based normalization attempts to interpret the intent and map it to specific coordinates. For example, “Randstad area” might resolve to a central point like Utrecht.
Interaction Between Location and Other Filters
The location filter interacts with other matching parameters in specific ways:- Staffing/recruiting agency exclusion: Applied before location filtering. Jobs from staffing agencies are excluded regardless of location.
- Recency filter (6 months): Applied before location filtering. Old jobs are excluded regardless of proximity.
- Job type and flexibility filters: Applied at the same stage as location. These are AND conditions — a job must pass all filters to be included.
- Vector search: Runs after all filters are applied. The fetch limit of 400 provides a buffer for post-filtering, with a display limit of 200 final matches.
Preferences Stored as JSONB
Job type preferences and flexibility preferences are stored as JSONB arrays on the candidate entity:preferred_job_types:["full-time", "contract"]preferred_flexibility:["hybrid", "remote"]preferred_locations: JSONB array of preferred location objects (for candidates who want to search in multiple areas)
Power-User Tips
Changing preferences like job type and flexibility does not trigger automatic re-matching (unlike location changes, which do trigger it). If you update these preferences and want fresh results, manually trigger a re-match from the candidate profile. This design prevents unnecessary re-matching from minor preference adjustments.
Related
- How Matching Works — See how location preferences feed into the matching pipeline
- Understanding Scores — Learn how location affects match scores
- Candidate Pipeline — Track matched jobs through your workflow
- Skills & Expertise — The other critical factor in match quality

