Reading Time

ATS status mapping for assessment results in Recruitee and SmartRecruiters

Status mapping overview

When Selection Lab processes an assessment, the outcome (pass, fail, incomplete, abandoned, or proctoring-failed) must translate into a visible ATS state before any downstream action can occur. Without a deterministic mapping layer, two problems emerge: recruiters either manually intervene on every result, or automated rules fire incorrectly and disqualify candidates who simply ran into a technical issue.

Four terms define the system:

  • Status mapping is the configured rule that translates an assessment outcome category into a specific ATS stage or status value.
  • Rejection flow is the execution path triggered when an outcome maps to a disqualified/rejected stage, including any candidate notification and pipeline closure.
  • Automated invitation is the downstream action (send interview invite, suppress invite, or notify recruiter) that fires once the ATS stage has been updated.
  • Sync direction distinguishes the two legs: ATS-to-partner for order creation and invite delivery; partner-to-ATS for results and status pushes.

One distinction matters above all others: incomplete is not fail. A candidate who abandoned the session, lost connectivity, or triggered a proctoring hold has not failed the assessment. Mapping incomplete directly to a rejected stage causes false negatives and erodes recruiter trust. Always route incomplete outcomes to a separate "needs action" or "in review" stage pending human review or re-invite.

The end-to-end flow is:

Intake / Order created
  → Candidate receives assessment access
    → Outcome computed (pass / fail / incomplete)
      → Outcome mapped to ATS stage/status
        → ATS stage updated via API or webhook
          → ATS automation fires (invite / suppress / notify)

Default mappings used by Selection Lab

Selection Lab automates recruitment decisions up to the interview stage, surfacing assessment results directly in the ATS while keeping the candidate experience conversational (via SmartChat, which responds within 10 seconds across WhatsApp and webchat). The default status mapping table below reflects that operational model.

Assessment outcomeSelection Lab result statusATS stage categoryInvitation actionAudit fields written
passRESULT_PASSinterviewInvite sentjobId, orderId, correlationId
failRESULT_FAILdisqualifiedInvite suppressedjobId, orderId, correlationId
incompleteRESULT_INCOMPLETEneeds_actionInvite suppressed; recruiter notifiedjobId, orderId, correlationId
abandonedRESULT_ABANDONEDneeds_actionInvite suppressed; re-invite eligiblejobId, orderId, correlationId
proctoring_failedRESULT_PROCTORING_FAILneeds_actionInvite suppressed; manual review requiredjobId, offerId, orderId

For a standard pipeline (apply → phone_screen → interview → evaluation → hire), fail maps to disqualified and blocks all further invitation triggers. incomplete maps to needs_action rather than disqualified, ensuring a recruiter can decide whether to re-invite or close the application. This conservative default is what keeps Selection Lab's drop-off rate 27% lower than unmanaged flows (Selection Lab Main Deck 2026, March 2025).

How to customize mappings per job

Default mappings apply at the account level but can be overridden per job, per offer, and per assessment package. This matters because rejection policy differs across roles: high-volume warehouse hiring may accept automated rejection on fail, while a legal role may require every completed result to reach a recruiter before any stage change fires.

Configuration granularity covers two axes:

  1. Outcome-to-stage mapping: which ATS stage or status value each outcome category resolves to.
  2. Invitation policy: whether passing the mapped stage triggers an automated invite, suppresses it, or routes it to a recruiter inbox.

A policy matrix covering the three common patterns:

Policy namepass behaviorfail behaviorincomplete behavior
reject-on-failAdvance to interview; send inviteMove to disqualified; no inviteRoute to needs_action; notify recruiter
notify-on-completeStore report in ATS; send inviteStore report in ATS; no stage changeRoute to needs_action; no invite
manual-review-on-incompleteAdvance to interview; send inviteMove to disqualified; no inviteHold in current stage; flag for review

Changing a mapping after candidates have already been processed does not retroactively re-run their status. The system writes a no-op audit entry for any candidate whose (candidateId, jobId, orderId) tuple already has a recorded mapping outcome. To re-run a specific candidate through the updated mapping, an explicit re-process request is required, which generates a new audit record rather than overwriting the original.

Webhook and API payload examples

Recruitee

Recruitee webhooks are configured under Settings > Apps and Plugins > Webhooks. Your endpoint must use HTTPS, and the configuration is only "Verified and created" after your service responds with HTTP 200 to the initial test request. The "Manage webhooks" hiring role ability must be enabled for the configuring user.

Each webhook event object carries the following fields:

{
  "id": "evt_01abc23def",
  "attempt_count": 1,
  "created_at": "2026-08-29T10:00:00Z",
  "event_type": "candidate_moved",
  "event_subtype": "disqualified",
  "payload": {
    "candidate_id": "cand_99887766",
    "job_id": "job_11223344",
    "details": {
      "to_stage": "disqualified",
      "disqualify_reason": "Assessment score below threshold"
    }
  }
}

For a stage advance (pass mapped to interview), the event_subtype is stage_changed and payload.details contains both from_stage and to_stage. For a rejection, event_subtype is disqualified and payload.details carries to_stage plus disqualify_reason. The requalified subtype reverses a prior disqualification, which is relevant if a manual review overrides an automated rejection.

Verify every incoming event by computing an HMAC-SHA256 digest of the raw request body using your configured webhook secret and comparing it to the X-Recruitee-Signature header value (base16/hex encoded). Reject events with a mismatched signature by returning a non-200 status so the failure is recorded in Recruitee's delivery logs.

SmartRecruiters

SmartRecruiters assessment partner integration follows an OAuth-based lifecycle: after credential exchange, the partner receives order creation callbacks when a candidate reaches the assessment stage. Selection Lab sends assessment results back via a PATCH to the order's status endpoint, updating the result object with fields including status (e.g., COMPLETED, FAILED), score, and completedAt. The ATS then processes the callback and advances or holds the candidate's pipeline stage based on its own automation rules, which should align with the stage mappings configured for that job.

Always propagate orderId, packageId, and Selection Lab's internal assessmentSessionId as correlation identifiers in both directions. This ensures that if a callback fails and retries, the receiving end can check the (candidateId, orderId) tuple and skip reprocessing if the stage update already applied.

Error handling and retry logic

Three failure classes require distinct handling:

  1. Delivery failure: the webhook endpoint did not return HTTP 200 within the timeout window.
  2. API failure: the ATS partner API returned a 4xx or 5xx response to a status update request.
  3. Semantic failure: the payload arrived but contains missing scores, an abandoned session, or a proctoring hold that prevents a definitive pass/fail determination.

For Recruitee, any response status other than 200 counts as a delivery failure. Recruitee retries up to nine times on the following schedule (from the Recruitee Webhooks documentation):

AttemptDelay after previous
1st1 minute
2nd3 minutes
3rd10 minutes
4th45 minutes
5th2 hours
6th5 hours
7th10 hours
8th24 hours
9th48 hours

Each retry carries the same id and increments attempt_count. Your handler must be idempotent: check (candidateId, jobId, orderId) before applying any stage change or invitation action. Every request is logged for 30 days; logs include the request body, response, next scheduled attempt, and options to cancel automatic retry or trigger an immediate retry manually.

Rate limits: trial Recruitee accounts are capped at 5 webhook requests per minute; all other accounts at 100 per minute. When the limit is reached, further webhook requests are delayed by approximately 10 ± 5 minutes.

For SmartRecruiters, callback delivery success is determined by HTTP 2xx responses within the platform's timeout window. Treat all non-2xx responses as retriable, and implement the same idempotency check on orderId before re-applying any status update.

For semantic failures, do not map an abandoned or proctoring_failed outcome to disqualified without explicit recruiter confirmation. Route to needs_action and surface the assessmentSessionId in the ATS notes field so the recruiter has full context.

Examples: reject-on-fail and notify-on-complete

Example A: reject-on-fail

Job-level mapping: faildisqualified; passinterview; incompleteneeds_action.

  1. Candidate completes the Selection Lab assessment.
  2. Selection Lab computes RESULT_FAIL and pushes a stage-change request to Recruitee (or a PATCH to SmartRecruiters order endpoint) with to_stage: disqualified and disqualify_reason: "Assessment score below threshold".
  3. The ATS fires its configured automation for the disqualified stage (rejection email, pipeline close). No interview invite is issued.
  4. If the PATCH returns a non-200, Selection Lab queues a retry. On each retry, the handler checks whether (candidateId, jobId, orderId) already maps to disqualified; if yes, it returns 200 immediately without rewriting the stage (preventing duplicate notification emails).
  5. The attempt_count in the Recruitee event object increments with each delivery attempt, which your logs can use to detect systemic endpoint issues.

Example B: notify-on-complete

Job-level mapping: passinterview (invite sent); failevaluation (report stored, no invite, no auto-disqualify); incompleteneeds_action.

  1. Candidate completes the assessment. Selection Lab pushes the full report to the ATS regardless of outcome.
  2. For pass: the ATS advances the candidate to the interview stage and fires the interview invite automation.
  3. For fail: the candidate stays in the evaluation stage. The recruiter reviews the report and decides whether to close or consider the candidate for a different role. No rejection stage is written automatically.
  4. For incomplete: the candidate moves to needs_action. After a configurable hold period (e.g., 48 hours), if the recruiter has not acted, Selection Lab can send a single re-invite. A re-invite counter per (candidateId, orderId) prevents loops; the default maximum is one re-invite, after which the record escalates to manual review only.

This pattern aligns with policies that prohibit automated rejection without human sign-off, and it keeps the pipeline clean without requiring recruiters to process every failed result immediately.

Frequently asked questions about ATS status mapping

What is ATS status mapping for assessment results?

It is the configured rule that translates an assessment outcome (pass, fail, incomplete, abandoned or proctoring failed) into a specific stage or status in the ATS. Only after that stage update can ATS automation such as interview invites or rejection emails fire.

Should an incomplete assessment be mapped to a rejected stage?

No. A candidate who abandoned the session, lost connectivity or hit a proctoring hold has not failed. Map incomplete, abandoned and proctoring failed outcomes to a separate needs_action stage so a recruiter can decide whether to re-invite or close the application.

Can status mappings differ per job?

Yes. Default mappings apply at account level and can be overridden per job, per offer and per assessment package, both for the outcome-to-stage mapping and for the invitation policy. Changing a mapping does not re-run candidates who were already processed; that requires an explicit re-process request.

How does Selection Lab push results to Recruitee and SmartRecruiters?

For Recruitee, stage changes arrive as webhook events with an event_subtype such as stage_changed, disqualified or requalified, signed with HMAC-SHA256 in the X-Recruitee-Signature header. For SmartRecruiters, Selection Lab sends a PATCH to the order's status endpoint with status, score and completedAt, and the ATS applies its own stage automation.

What happens when a webhook or API call fails?

Recruitee retries up to nine times with growing delays from 1 minute to 48 hours and logs every request for 30 days. SmartRecruiters treats any non-2xx response as retriable. Your handler must be idempotent and check the candidateId, jobId and orderId combination before applying a stage change, so retries never send duplicate notifications.

FAQ

Can game-based assessments promote diversity in the hiring process?

Yes, game-based assessments can support diversity by focusing on skills and behaviors rather than traditional criteria like résumés, which may contain unconscious biases. This gives candidates from diverse backgrounds a fairer chance to demonstrate their potential.

What is a game-based assessment?

A game-based assessment is a method that uses game mechanics to evaluate a candidate’s skills, competencies, and personality traits. While playing these games, candidates are assessed on aspects like problem-solving, cognitive ability, and behavior under pressure in an interactive way.

What are the advantages of game-based assessments?

Game-based assessments offer a more engaging and interactive experience for candidates, which can lead to a more positive perception of the hiring process—especially among certain groups. For employers, they provide deeper insights into both cognitive and behavioral traits, which traditional tests may miss. They also reduce the chance of socially desirable answers, as candidates tend to respond more authentically in a game environment.

How reliable are game-based assessments compared to traditional tests?

When well-designed, game-based assessments can be just as reliable—or even more reliable—than traditional tests. They assess a wide range of behaviors and cognitive abilities in a dynamic setting. However, the quality of these assessments varies greatly, so careful evaluation is essential.

How does a game-based assessment work?

Candidates participate in interactive games designed to measure specific skills and behaviors. Evaluation goes beyond just the final score—it also considers how the candidate makes decisions, handles challenges, and responds to different scenarios. These insights reveal underlying thought processes and behavioral patterns.

Are game-based assessments scientifically validated?

The main drawback is that many game-based assessments are relatively new and have not yet been extensively researched by independent academics. Providers often cite their own research, which is rarely externally validated. Without independent studies, the reliability of these assessments remains uncertain—something to keep in mind when selecting one.

How can game based assessments contribute to a better candidate experience

This can vary significantly by audience. The playful, interactive nature of game-based assessments can lower stress levels for some candidates compared to traditional tests. However, research shows that certain groups, especially those over 35, may find them more stressful. Men also tend to rate the experience more positively than women.

Can you practice game-based assessment?

You can familiarize yourself with the style of games used, but it’s difficult to "practice" for them in a traditional sense. These assessments are designed to measure natural reactions and authentic behavior, so repeated practice typically has less effect on performance than with traditional tests.

Will game-based assessments replace traditional tests in the future?

It’s likely that game-based assessments will become more common in hiring processes, but they probably won’t fully replace traditional tests. Both approaches have value and can complement each other depending on the role and the company’s needs.

How are the results of a game-based assessment analyzed?

Results are analyzed based on predefined criteria such as problem-solving ability, reaction time, and behavior under pressure. Advanced algorithms collect and interpret this data to provide a reliable, objective evaluation of a candidate’s strengths.

What kind of skills do game-based assessments measure?

They assess a wide range of abilities, including problem-solving, adaptability, decision-making under pressure, teamwork, and emotional intelligence. Depending on the design, they may also evaluate cognitive skills like memory, attention, and pattern recognition.

How long does a game-based assessment take?

Typically, these assessments last between 15 and 60 minutes, depending on the game’s complexity and the number of skills being tested. They’re usually shorter and more engaging than traditional assessments, making for a smoother candidate experience.

Are game-based assessments suitable for all roles?

They are especially effective for roles that require flexibility, creativity, problem-solving, and strong interpersonal skills. For highly technical or specialized roles, additional assessments may be needed to measure specific knowledge.

What’s the difference between a game-based and a gamified assessment?

A gamified assessment adds game-like elements (such as points or rewards) to a traditional test to increase engagement. A game-based assessment, on the other hand, is a standalone game designed specifically to evaluate certain competencies. The game itself is the primary evaluation tool, not just an enhancement.

FAQ

How can I improve my company’s retention rate?

The retention rate can be improved by investing in employee development and satisfaction. This includes offering training, career opportunities, and recognition for their contributions. A culture of open communication and attention to work-life balance can also contribute to higher retention. Additionally, offering competitive compensation and involving employees in decision-making can strengthen loyalty.

What are the benefits of growth opportunities for employee retention?

Growth opportunities can promote employee retention by giving staff a sense of direction and motivation. When they have the chance to learn and develop professionally within the company, they feel valued, which increases their loyalty. This can prevent them from leaving to seek better opportunities elsewhere. kunnen het behoud van personeel bevorderen door medewerkers een gevoel van richting en motivatie te geven. Wanneer zij de kans krijgen om te leren en zich professioneel te ontwikkelen binnen het bedrijf, voelen zij zich gewaardeerd, wat hun loyaliteit vergroot. Dit kan voorkomen dat ze vertrekken om elders betere kansen te zoeken.

What are the key factors that influence employee retention?

Key factors that influence employee retention include salary and benefits, opportunities for professional development, work-life balance, company culture, and the relationship with supervisors. Employees tend to stay longer when they feel valued, challenged, and supported in their work environment.

Why is employee retention so important for organizations?

Employee retention is important because it helps reduce recruitment and training costs for new employees, and it contributes to retaining knowledge and experience within the organization. High retention also ensures continuity within teams, leading to a more stable company culture, higher customer satisfaction, and improved business outcomes.

Which recruitment strategies help improve retention?

Recruitment strategies that can improve retention include identifying candidates who align with the company culture, using assessments to evaluate soft skills, and providing transparency about role expectations during the hiring process. Employees who feel connected to the organization and have clarity about their role are more likely to stay longer.

How can a good onboarding process contribute to higher retention?

An effective onboarding process can contribute to higher retention by helping new employees quickly adapt to their role, the company culture, and expectations. By providing support and clear information from the start, their engagement is increased, and the likelihood of them leaving early due to feelings of being overwhelmed or lacking guidance is reduced.

What is the role of company culture in retaining employees?

Company culture plays a crucial role in employee retention. When employees feel heard, valued, and connected to the values and norms of the company, they are more likely to stay. A positive culture that fosters collaboration, respect, and personal growth can significantly enhance employee motivation and satisfaction.

How can leadership and management style influence retention?

Leadership and management style have a significant impact on retention. Leaders who inspire, support, and coach their team can increase employee engagement and satisfaction. Offering autonomy and trust can lead to higher loyalty, while inefficient or negative management styles can contribute to dissatisfaction and increased employee turnover.

What is the importance of recognition and rewards for employee retention?

Recognition and rewards play an important role in employee retention by showing staff that their work is valued. This can increase their motivation and loyalty. In addition to financial rewards, compliments, promotions, and other forms of recognition can also contribute to satisfaction and retaining employees.

What role does work-life balance play in improving retention?

A balanced work-life balance plays an important role in increasing retention. By reducing stress and improving job satisfaction, employees are more likely to stay with the company. Initiatives such as flexible working hours, remote work options, and respect for personal time can contribute to this balance.

What does increasing retention mean within a company?

Increasing retention within a company means implementing strategies to keep employees with the organization for longer. This can be achieved by improving job satisfaction, offering growth opportunities, and fostering a positive and supportive company culture.

How do I measure the success of my retention strategy?

The success of a retention strategy can be measured by tracking retention rates and turnover rates, and by gaining insights from exit interviews. Additionally, employee satisfaction surveys and feedback from performance evaluations can provide valuable information about the effectiveness of the strategies applied.

What are the costs of a low retention rate?

A low retention rate can bring significant costs, such as increased expenses for recruiting and training new employees. Furthermore, the loss of experienced staff can lead to lower productivity, reduced knowledge transfer, and a negative impact on company culture.

How can I increase employee engagement?

To increase employee engagement, involve them in decision-making processes, regularly ask for their feedback, and recognize their contributions. Offering development opportunities and maintaining transparent communication can also contribute to greater engagement.

How can technology help improve employee retention?

Technology can be a tool for improving employee retention by facilitating communication, feedback, and development. By using online platforms for training, recognition, and evaluation, companies can create a more engaged and satisfied workforce.

FAQ

How long does it take to complete the tool?

Less than 10 minutes. You’ll answer 30 guided questions and get a summary of what to look for in your next assessment platform.

Can this checklist help me compare assessment providers?

Yes. By clarifying what matters most to your team, it makes comparing providers' features, pricing, and strengths much easier and more strategic.

How can I use this checklist if I’m not doing a formal RFI?

It’s equally valuable for internal evaluations, exploring new tools, or improving your current hiring process even if you’re not issuing an RFI or RFQ.

What should I look for in a modern assessment tool?

Prioritize platforms with user-friendly design, mobile compatibility, strong analytics, ATS integrations, and inclusive features like neurodiversity support.

What types of assessments should I consider in 2025?

Leading tools combine cognitive testing, situational judgment tests (SJTs), behavior assessments, and predictive AI to evaluate candidates more holistically.

Who should use an assessment checklist?

HR professionals, hiring managers, and procurement teams evaluating pre-selection solutions, especially those comparing AI-powered or compliance-driven assessment platforms.

How does this checklist help with RFIs and RFQs for assessments?

The checklist helps you define your exact requirements so you can confidently draft or respond to Requests for Information (RFI) or Requests for Quotation (RFQ) for assessment tools.

What is an assessment tool in hiring?

An assessment tool evaluates candidates’ skills, behaviors, and fit during the recruitment process. It helps improve hiring decisions and streamline pre-selection.

Game-based assessment packs

← Our Blog

ATS status mapping for assessment results in Recruitee and SmartRecruiters

See how Selection Lab maps assessment outcomes to ATS stages in Recruitee and SmartRecruiters, with custom rejection policies, webhooks, and retry logic explained.
Joeri Everaers
COO
Read time: Approx

Status mapping overview

When Selection Lab processes an assessment, the outcome (pass, fail, incomplete, abandoned, or proctoring-failed) must translate into a visible ATS state before any downstream action can occur. Without a deterministic mapping layer, two problems emerge: recruiters either manually intervene on every result, or automated rules fire incorrectly and disqualify candidates who simply ran into a technical issue.

Four terms define the system:

  • Status mapping is the configured rule that translates an assessment outcome category into a specific ATS stage or status value.
  • Rejection flow is the execution path triggered when an outcome maps to a disqualified/rejected stage, including any candidate notification and pipeline closure.
  • Automated invitation is the downstream action (send interview invite, suppress invite, or notify recruiter) that fires once the ATS stage has been updated.
  • Sync direction distinguishes the two legs: ATS-to-partner for order creation and invite delivery; partner-to-ATS for results and status pushes.

One distinction matters above all others: incomplete is not fail. A candidate who abandoned the session, lost connectivity, or triggered a proctoring hold has not failed the assessment. Mapping incomplete directly to a rejected stage causes false negatives and erodes recruiter trust. Always route incomplete outcomes to a separate "needs action" or "in review" stage pending human review or re-invite.

The end-to-end flow is:

Intake / Order created
  → Candidate receives assessment access
    → Outcome computed (pass / fail / incomplete)
      → Outcome mapped to ATS stage/status
        → ATS stage updated via API or webhook
          → ATS automation fires (invite / suppress / notify)

Default mappings used by Selection Lab

Selection Lab automates recruitment decisions up to the interview stage, surfacing assessment results directly in the ATS while keeping the candidate experience conversational (via SmartChat, which responds within 10 seconds across WhatsApp and webchat). The default status mapping table below reflects that operational model.

Assessment outcomeSelection Lab result statusATS stage categoryInvitation actionAudit fields written
passRESULT_PASSinterviewInvite sentjobId, orderId, correlationId
failRESULT_FAILdisqualifiedInvite suppressedjobId, orderId, correlationId
incompleteRESULT_INCOMPLETEneeds_actionInvite suppressed; recruiter notifiedjobId, orderId, correlationId
abandonedRESULT_ABANDONEDneeds_actionInvite suppressed; re-invite eligiblejobId, orderId, correlationId
proctoring_failedRESULT_PROCTORING_FAILneeds_actionInvite suppressed; manual review requiredjobId, offerId, orderId

For a standard pipeline (apply → phone_screen → interview → evaluation → hire), fail maps to disqualified and blocks all further invitation triggers. incomplete maps to needs_action rather than disqualified, ensuring a recruiter can decide whether to re-invite or close the application. This conservative default is what keeps Selection Lab's drop-off rate 27% lower than unmanaged flows (Selection Lab Main Deck 2026, March 2025).

How to customize mappings per job

Default mappings apply at the account level but can be overridden per job, per offer, and per assessment package. This matters because rejection policy differs across roles: high-volume warehouse hiring may accept automated rejection on fail, while a legal role may require every completed result to reach a recruiter before any stage change fires.

Configuration granularity covers two axes:

  1. Outcome-to-stage mapping: which ATS stage or status value each outcome category resolves to.
  2. Invitation policy: whether passing the mapped stage triggers an automated invite, suppresses it, or routes it to a recruiter inbox.

A policy matrix covering the three common patterns:

Policy namepass behaviorfail behaviorincomplete behavior
reject-on-failAdvance to interview; send inviteMove to disqualified; no inviteRoute to needs_action; notify recruiter
notify-on-completeStore report in ATS; send inviteStore report in ATS; no stage changeRoute to needs_action; no invite
manual-review-on-incompleteAdvance to interview; send inviteMove to disqualified; no inviteHold in current stage; flag for review

Changing a mapping after candidates have already been processed does not retroactively re-run their status. The system writes a no-op audit entry for any candidate whose (candidateId, jobId, orderId) tuple already has a recorded mapping outcome. To re-run a specific candidate through the updated mapping, an explicit re-process request is required, which generates a new audit record rather than overwriting the original.

Webhook and API payload examples

Recruitee

Recruitee webhooks are configured under Settings > Apps and Plugins > Webhooks. Your endpoint must use HTTPS, and the configuration is only "Verified and created" after your service responds with HTTP 200 to the initial test request. The "Manage webhooks" hiring role ability must be enabled for the configuring user.

Each webhook event object carries the following fields:

{
  "id": "evt_01abc23def",
  "attempt_count": 1,
  "created_at": "2026-08-29T10:00:00Z",
  "event_type": "candidate_moved",
  "event_subtype": "disqualified",
  "payload": {
    "candidate_id": "cand_99887766",
    "job_id": "job_11223344",
    "details": {
      "to_stage": "disqualified",
      "disqualify_reason": "Assessment score below threshold"
    }
  }
}

For a stage advance (pass mapped to interview), the event_subtype is stage_changed and payload.details contains both from_stage and to_stage. For a rejection, event_subtype is disqualified and payload.details carries to_stage plus disqualify_reason. The requalified subtype reverses a prior disqualification, which is relevant if a manual review overrides an automated rejection.

Verify every incoming event by computing an HMAC-SHA256 digest of the raw request body using your configured webhook secret and comparing it to the X-Recruitee-Signature header value (base16/hex encoded). Reject events with a mismatched signature by returning a non-200 status so the failure is recorded in Recruitee's delivery logs.

SmartRecruiters

SmartRecruiters assessment partner integration follows an OAuth-based lifecycle: after credential exchange, the partner receives order creation callbacks when a candidate reaches the assessment stage. Selection Lab sends assessment results back via a PATCH to the order's status endpoint, updating the result object with fields including status (e.g., COMPLETED, FAILED), score, and completedAt. The ATS then processes the callback and advances or holds the candidate's pipeline stage based on its own automation rules, which should align with the stage mappings configured for that job.

Always propagate orderId, packageId, and Selection Lab's internal assessmentSessionId as correlation identifiers in both directions. This ensures that if a callback fails and retries, the receiving end can check the (candidateId, orderId) tuple and skip reprocessing if the stage update already applied.

Error handling and retry logic

Three failure classes require distinct handling:

  1. Delivery failure: the webhook endpoint did not return HTTP 200 within the timeout window.
  2. API failure: the ATS partner API returned a 4xx or 5xx response to a status update request.
  3. Semantic failure: the payload arrived but contains missing scores, an abandoned session, or a proctoring hold that prevents a definitive pass/fail determination.

For Recruitee, any response status other than 200 counts as a delivery failure. Recruitee retries up to nine times on the following schedule (from the Recruitee Webhooks documentation):

AttemptDelay after previous
1st1 minute
2nd3 minutes
3rd10 minutes
4th45 minutes
5th2 hours
6th5 hours
7th10 hours
8th24 hours
9th48 hours

Each retry carries the same id and increments attempt_count. Your handler must be idempotent: check (candidateId, jobId, orderId) before applying any stage change or invitation action. Every request is logged for 30 days; logs include the request body, response, next scheduled attempt, and options to cancel automatic retry or trigger an immediate retry manually.

Rate limits: trial Recruitee accounts are capped at 5 webhook requests per minute; all other accounts at 100 per minute. When the limit is reached, further webhook requests are delayed by approximately 10 ± 5 minutes.

For SmartRecruiters, callback delivery success is determined by HTTP 2xx responses within the platform's timeout window. Treat all non-2xx responses as retriable, and implement the same idempotency check on orderId before re-applying any status update.

For semantic failures, do not map an abandoned or proctoring_failed outcome to disqualified without explicit recruiter confirmation. Route to needs_action and surface the assessmentSessionId in the ATS notes field so the recruiter has full context.

Examples: reject-on-fail and notify-on-complete

Example A: reject-on-fail

Job-level mapping: faildisqualified; passinterview; incompleteneeds_action.

  1. Candidate completes the Selection Lab assessment.
  2. Selection Lab computes RESULT_FAIL and pushes a stage-change request to Recruitee (or a PATCH to SmartRecruiters order endpoint) with to_stage: disqualified and disqualify_reason: "Assessment score below threshold".
  3. The ATS fires its configured automation for the disqualified stage (rejection email, pipeline close). No interview invite is issued.
  4. If the PATCH returns a non-200, Selection Lab queues a retry. On each retry, the handler checks whether (candidateId, jobId, orderId) already maps to disqualified; if yes, it returns 200 immediately without rewriting the stage (preventing duplicate notification emails).
  5. The attempt_count in the Recruitee event object increments with each delivery attempt, which your logs can use to detect systemic endpoint issues.

Example B: notify-on-complete

Job-level mapping: passinterview (invite sent); failevaluation (report stored, no invite, no auto-disqualify); incompleteneeds_action.

  1. Candidate completes the assessment. Selection Lab pushes the full report to the ATS regardless of outcome.
  2. For pass: the ATS advances the candidate to the interview stage and fires the interview invite automation.
  3. For fail: the candidate stays in the evaluation stage. The recruiter reviews the report and decides whether to close or consider the candidate for a different role. No rejection stage is written automatically.
  4. For incomplete: the candidate moves to needs_action. After a configurable hold period (e.g., 48 hours), if the recruiter has not acted, Selection Lab can send a single re-invite. A re-invite counter per (candidateId, orderId) prevents loops; the default maximum is one re-invite, after which the record escalates to manual review only.

This pattern aligns with policies that prohibit automated rejection without human sign-off, and it keeps the pipeline clean without requiring recruiters to process every failed result immediately.

Frequently asked questions about ATS status mapping

What is ATS status mapping for assessment results?

It is the configured rule that translates an assessment outcome (pass, fail, incomplete, abandoned or proctoring failed) into a specific stage or status in the ATS. Only after that stage update can ATS automation such as interview invites or rejection emails fire.

Should an incomplete assessment be mapped to a rejected stage?

No. A candidate who abandoned the session, lost connectivity or hit a proctoring hold has not failed. Map incomplete, abandoned and proctoring failed outcomes to a separate needs_action stage so a recruiter can decide whether to re-invite or close the application.

Can status mappings differ per job?

Yes. Default mappings apply at account level and can be overridden per job, per offer and per assessment package, both for the outcome-to-stage mapping and for the invitation policy. Changing a mapping does not re-run candidates who were already processed; that requires an explicit re-process request.

How does Selection Lab push results to Recruitee and SmartRecruiters?

For Recruitee, stage changes arrive as webhook events with an event_subtype such as stage_changed, disqualified or requalified, signed with HMAC-SHA256 in the X-Recruitee-Signature header. For SmartRecruiters, Selection Lab sends a PATCH to the order's status endpoint with status, score and completedAt, and the ATS applies its own stage automation.

What happens when a webhook or API call fails?

Recruitee retries up to nine times with growing delays from 1 minute to 48 hours and logs every request for 30 days. SmartRecruiters treats any non-2xx response as retriable. Your handler must be idempotent and check the candidateId, jobId and orderId combination before applying a stage change, so retries never send duplicate notifications.