One normalized profile
Application answers and document references are converted into a consistent candidate payload regardless of the selected position.
One reusable pipeline processes candidates for multiple positions while applying the correct eligibility rules, scoring weights, and thresholds for each role.
A fixed prompt or one universal score can compare candidates against the wrong requirements. The engine therefore separates candidate data from role criteria and selects the correct rubric before scoring begins.
Application answers and document references are converted into a consistent candidate payload regardless of the selected position.
Each record carries a stable position_id used to resolve the matching qualifications, weights, thresholds, and required documents.
The same n8n workflow evaluates every eligible record with its resolved role rubric, avoiding duplicated automation for each vacancy.
Airtable remains the single source of truth for both candidate records and position-specific rules. n8n joins them at runtime; Google Drive remains the document-storage layer.
Role Criteria data. It does not require cloning the workflow.“All at once” means one batch run can contain candidates from different positions. Each item is evaluated independently with the rubric linked to its own position.
| Stage | Engine behavior | Control |
|---|---|---|
| 1 · Fetch | Read every candidate where Status = BARU, regardless of position. | Exclude previously processed records. |
| 2 · Resolve | Use position_id to load the matching Role Criteria record. | Stop the item if no active rubric is found. |
| 3 · Gate | Check mandatory qualifications and required application evidence. | Keep hard requirements separate from weighted scoring. |
| 4 · Score | Evaluate Skill, Experience, Education, and University dimensions with role-specific rules. | Return structured fields, not free-form output. |
| 5 · Calculate | Calculate Final Score from the resolved role weights and store the recommendation. | Keep the calculation visible and reviewable in Airtable. |
| 6 · Update | Write results to the originating candidate using Airtable record_id. | Preview field mapping and fail closed when identity is missing. |
for each candidate where Status = BARU:
rubric = RoleCriteria[candidate.position_id]
assert rubric is active
result = score(candidate, rubric)
update candidate.record_id with result
The engine is only reliable when the candidate’s position_id and Airtable record_id survive every transformation.
If a code node returns only the scoring result, downstream nodes lose the candidate identity and can no longer select the correct record or rubric.
Every item retains record_id, position_id, the normalized candidate payload, the resolved rubric version, and the structured scoring result.
return {
record_id: candidate.record_id,
position_id: candidate.position_id,
rubric_version: rubric.version,
candidate,
scoring_result
};
Status = BARU only; reject missing or inactive rubrics; update by Airtable record ID; preview mappings before write; retain the rubric version used for each score.The architecture avoids separate workflows and hard-coded prompts for every position. Recruitment rules remain configurable as data, while one engine processes the full candidate batch with traceable role and record identity.
A role-driven scoring model keeps criteria configurable without duplicating the automation for every vacancy.