Assessment platforms that don't integrate tightly with your ATS create manual overhead at exactly the wrong moment, when a recruiter is managing 50+ active applications and needs status updates, scores, and rejection decisions to flow automatically. This reference document covers how Selection Lab integrations with Emply, Jobylon, and Salesforce work at a systems level. What triggers an invitation, what gets returned after a candidate completes an assessment, and how rejection outcomes map back to ATS statuses.
Three distinct events drive every integration.
Understanding which layer a problem belongs to is the fastest way to isolate configuration errors. For the same pattern in Recruitee and SmartRecruiters, see ATS status mapping for assessment results.
| Term | Definition |
|---|---|
| Invitation status | Whether the assessment invite was successfully delivered and opened. Possible values pending, sent, opened, failed. |
| Completion status | The terminal state of the candidate's assessment attempt. completed, declined, expired, error. |
| Report availability | Whether a full result report (URL or embedded view) is ready to render in the ATS. |
| Candidate outcome | The downstream ATS action triggered by the completion status plus score thresholds. advance, reject, withdraw, or manual review. |
When an Emply candidate moves to a pipeline stage configured to trigger a Selection Lab assessment, Emply sends a structured payload to the Selection Lab webhook endpoint. The fields that should be present in a correctly configured Emply integration are listed below. Fields marked [TBD] require verification against your specific Emply setup, since Emply's public help documentation does not publish the full payload schema.
| Field | Type | Required | Purpose in Selection Lab |
|---|---|---|---|
first_name | string | Yes | Personalizes invite messaging and report header |
last_name | string | Yes | Report identity, duplicate detection |
email | string (RFC 5322) | Yes | Primary invite delivery channel |
application_id | string | Yes | Correlation key, echoed back on completion callback so Emply updates the correct record |
candidate_id | string | Yes | External candidate identity, used for deduplication across applications |
requisition_id | string | Recommended | Links assessment to the correct job, drives assessment profile selection if profiles are mapped per vacancy |
locale / language | ISO 639-1 (e.g., nl, en) | Recommended | Sets the UI language of the assessment and invite copy |
phone | string (E.164) | Optional | Required only if WhatsApp delivery is configured; without it, email delivery is used |
consent_flag | boolean | Optional [TBD] | If Emply passes a pre-collected consent flag, Selection Lab can record it; otherwise, Selection Lab's own consent flow fires before results are shared |
What happens when optional fields are missing. If locale is absent, Selection Lab defaults to the language configured in the assessment profile. If phone is absent and the invite channel is set to WhatsApp, the invite fails silently unless a fallback channel (email) is configured. Verify fallback behavior with your Selection Lab account configuration.
The trigger mechanism for Emply integrations operates via a webhook or connector sync (exact mechanism [TBD], confirm whether your Emply instance uses webhook push or a polling-based connector). The configuration path is as follows.
requisition_id so Selection Lab can resolve the correct profile automatically.Auth failure mode. If the API credential is expired or misconfigured, Emply will receive an HTTP 4xx response. Depending on your connector configuration, this may silently drop the invite or queue it for retry. Check your integration logs in both Emply and the Selection Lab admin panel to confirm delivery.
Retry behavior for failed deliveries is [TBD], confirm retry count, backoff interval, and dead-letter behavior with your Selection Lab integration engineer.
Once a candidate completes (or exits) the Selection Lab assessment, Selection Lab sends a completion callback to Emply. The callback payload contains the following artifact types.
| Status | Meaning |
|---|---|
completed | Candidate finished all assessment components |
declined | Candidate actively rejected the invite |
expired | Invite window elapsed without candidate action |
partial | Candidate started but did not finish (if partial submissions are enabled) |
error | Technical failure during assessment session |
| Field | Type | Notes |
|---|---|---|
match_score | integer (0-100) | Composite match score against the role profile |
component_scores | object | Per-component breakdown (e.g., cognitive, personality, hard skills). [TBD] exact component key names depend on your assessment profile configuration |
report_url | string (URL) | Deep link to the candidate's full report in the Selection Lab portal, renderable in Emply if iframe embedding is configured |
report_available | boolean | Set to true once the report PDF is generated and accessible |
completed_at | ISO 8601 timestamp | Completion time in UTC |
application_id | string | Echoed from the invite payload for ATS record correlation |
candidate_id | string | Echoed for deduplication |
Selection Lab's privacy model requires that results are shown to the candidate first. Consent is then requested a second time before results are shared back to the ATS. This means that if a candidate completes the assessment but has not yet given post-assessment consent to share results, the report_url and component_scores fields in the callback payload may be withheld or returned as null until consent is recorded. Personal data is stored in Frankfurt in compliance with EU data residency requirements.
The exact Emply implementation of this consent gate (whether it blocks the callback entirely or sends a partial payload with a consent_pending flag) is [TBD], confirm with your Selection Lab account manager.
| Selection Lab completion status | Score condition | Recommended Emply target status |
|---|---|---|
completed | Score >= configured threshold | Move to next stage (e.g., "Interview") |
completed | Score < configured threshold | "Rejected - Assessment" or equivalent |
declined | n/a | "Withdrawn" or "No Response" |
expired | n/a | "Rejected - No Show" or configured stage |
error | n/a | "Manual Review" |
The exact Emply stage/status string values are picklist-defined in your Emply configuration. The mapping must be set up in the Selection Lab integration settings to match those exact string values. A mismatch (e.g., "Rejected" vs. "rejected" vs. "REJECTED") will cause the callback to fail silently or return a 422 error.
On a rejection outcome, Selection Lab can trigger a rejection message to the candidate via two channels.
The timing (immediate vs. delayed) and exact template variables are [TBD], confirm rejection message templates and channel priority logic with your Selection Lab account configuration.
Invite trigger payload (Emply to Selection Lab)
{
"event": "assessment.invite",
"application_id": "APP-00123",
"candidate_id": "CAND-78901",
"requisition_id": "REQ-456",
"first_name": "Jane",
"last_name": "Smith",
"email": "[email protected]",
"phone": "+31612345678",
"locale": "nl",
"consent_flag": true
}
Completion callback payload (Selection Lab to Emply)
{
"event": "assessment.completed",
"application_id": "APP-00123",
"candidate_id": "CAND-78901",
"completion_status": "completed",
"match_score": 74,
"component_scores": {
"cognitive": 68,
"personality": 81,
"hard_skills": 72
},
"report_url": "https://app.selectionlab.com/reports/APP-00123",
"report_available": true,
"completed_at": "2026-08-30T09:14:22Z"
}
Note that field names and the presence of component_scores keys depend on your active assessment profile. The above is illustrative; confirm the exact schema with your Selection Lab integration spec sheet.
application_id. Without the correlation key, Selection Lab cannot identify which Emply record to update. Check the connector config to confirm Emply is passing this field on every invite event.Jobylon's integration model for assessment partners is documented via its Pipeline Actions framework. According to Jobylon's support documentation (January 27, 2026), partner integrations are configured at the pipeline status level. Navigate to Pipeline Actions, create an action next to the status you want to automate, choose "Partner Integrations" as the action type, select your assessment vendor, and save. With that setup, an assessment test is automatically sent when a candidate moves to the selected status.
This means the Jobylon assessment integration is event-driven by status change, not by manual recruiter action. No separate webhook configuration is required on the recruiter side beyond the Pipeline Actions setup. The invite is dispatched as soon as the ATS records the status transition.
Selection Lab fits directly into this model. When a candidate enters the configured pipeline status, Selection Lab receives the invite event and delivers the assessment invitation. Recruiters can view the complete report and individual scores within the Jobylon candidate record once results are returned.
The Jobylon support article on partner integrations does not publish the following.
These details are [TBD], request the Selection Lab + Jobylon integration spec from your Selection Lab account manager, or review the Jobylon admin under Settings > Integrations for field-level detail.
For the return path (results back into Jobylon), the same general completion callback pattern applies as described in the Emply section. Completion status, match score, component scores, and report URL are pushed back to the candidate record. Jobylon's pipeline can then be configured to move candidates automatically based on score thresholds using its native score-based automation feature.
Salesforce's data model for recruiting (whether native Salesforce Recruiting or a managed package like Salesforce for Recruiting) uses strongly typed picklist fields on objects such as Application, Assessment, or custom staging objects. This imposes stricter constraints on result mapping than Emply or Jobylon.
Selection Lab's Salesforce integration pushes completion artifacts to a designated object (typically a custom Assessment__c or equivalent object, or an existing Application/Candidate Stage object, depending on your Salesforce org configuration). The fields populated are conceptually the same as in the Emply return payload. Completion status, scores, report URL, and timestamp. However, the exact API field names and object targets depend on your Salesforce org schema.
Key constraint. Any status field mapped from a Selection Lab completion status must correspond to an active picklist value in your Salesforce org. If completed_with_low_score is not a valid picklist entry in your Application_Status__c field, the update will fail with a Salesforce validation error.
For Salesforce, rejection mapping is a two-step translation.
completed, declined, expired) plus a pass/fail determination based on score thresholds."Rejected - Assessment", "No Longer in Consideration").If your org uses Salesforce Experience Cloud and candidates access assessments through a portal, external user permissions for the relevant objects must be configured to allow status reads and report URL access. This is a common source of "results not visible" tickets in Salesforce-integrated deployments.
For candidate rejection status mapping with automatically triggered invitations in Salesforce, the pattern mirrors the Emply approach. A configured threshold fires the rejection status update, and the messaging channel (email, WhatsApp) is driven by candidate contact data and Selection Lab template configuration.
Regardless of which ATS you're using, the mapping logic should normalize Selection Lab's canonical statuses before writing to ATS-specific enums. The following matrix applies across Emply, Jobylon, and Salesforce.
| Selection Lab canonical outcome | Score condition | Recommended ATS action | Notes |
|---|---|---|---|
knockout_reject | Knockout criteria met during SmartChat intake | Immediate rejection status plus reject message | No assessment sent; candidate rejected at screening layer |
completed_pass | match_score >= role threshold | Advance to next stage | Recruiter review optional or bypassed |
completed_fail | match_score < role threshold | Rejection status (assessment-stage) | Rejection message sent via configured channel |
declined | Candidate refused invite | Withdrawal or "no response" status | No score available |
expired | Invite TTL elapsed | Rejection or "no show" status | Configurable; some orgs prefer manual review |
error | Technical failure | Manual review queue | Do not auto-reject; retry or re-invite |
The principle behind this matrix is normalize first, then map. Your ATS-specific picklist values should never be hardcoded directly in the integration callback logic. Maintain a mapping table in your integration configuration layer that translates Selection Lab's canonical statuses to your ATS strings. That way, if Emply renames a pipeline status, you update the mapping table once rather than changing the integration logic.
application_id and candidate_id are present in every invite payload| Symptom | Likely cause | Fix |
|---|---|---|
| Candidate moved to assessment stage but received no invite | Webhook not firing or auth failure | Check connector logs; verify credentials; confirm Pipeline Actions config (Jobylon) or connector mapping (Emply/Salesforce) |
| Invite delivered but wrong language | locale field missing or not passed | Confirm ATS passes locale; set default locale in Selection Lab assessment profile as fallback |
| Duplicate invites sent | candidate_id not deduplicating correctly | Confirm dedup logic in Selection Lab tenant; check whether ATS is firing the trigger multiple times on re-entry to a stage |
| Rate limit error on invite endpoint | High-volume hiring burst | Review Selection Lab's API rate limits with your account manager; implement queue-based dispatch if needed |
| Symptom | Likely cause | Fix |
|---|---|---|
| Results not appearing in ATS | Consent gate pending or application_id mismatch | Check consent status in Selection Lab admin; verify application_id is echoed correctly in callback |
report_url returns 403 | Insufficient permissions (common in Salesforce Experience Cloud setups) | Configure external user/profile permissions for the report object |
| ATS status not updated after completion | Picklist value mismatch | Export ATS picklist; update mapping table in integration config |
| Score fields missing in ATS | Assessment profile doesn't include all components | Review active components in assessment profile; confirm return schema with Selection Lab integration spec |
Configure logging at three points. (1) The ATS connector/webhook dispatch log to confirm invite events fired, (2) the Selection Lab admin event log to confirm invites were received and delivered, and (3) the ATS update log to confirm completion callbacks were applied. For Salesforce, Apex debug logs or Platform Event logs give the most granular visibility.
Reconciliation. Run a weekly report comparing candidates in the "Assessment Stage" status with candidates who have a completed Selection Lab result. Any gap indicates an invite delivery failure or a consent-blocked result. Most ATS platforms support this as a simple pipeline filter; Selection Lab's reporting panel provides a matching export.
For persistent delivery failures, request an audit trail export from Selection Lab that includes event timestamps, HTTP response codes, and any retry attempts. This is the fastest path to diagnosing whether a failure is on the ATS connector side or within Selection Lab's delivery pipeline. Want to see the integration with your ATS? Book a demo.
A pipeline stage change. Emply, Jobylon and Salesforce each send an invite event to Selection Lab when a candidate enters the configured assessment stage. In Jobylon this is set up through Pipeline Actions, in Emply through the connector settings, in Salesforce through a Flow, an Apex trigger or the Selection Lab connector.
A completion status (completed, declined, expired, partial or error), a match score from 0 to 100, per-component scores, a report URL, a report-available flag, a UTC timestamp, and the application_id and candidate_id echoed back so the ATS updates the right record.
Most often because post-assessment consent is still pending, the application_id doesn't match, or the status value doesn't match an ATS picklist entry exactly. Check the consent status in the Selection Lab admin first, then the correlation key, then the picklist mapping.
Normalize first, then map. Translate Selection Lab's canonical outcomes (completed_pass, completed_fail, declined, expired, error, knockout_reject) into your ATS statuses through a mapping table, never by hardcoding picklist strings in the callback logic. Send error outcomes to manual review, never to automatic rejection.
Only if a fallback channel is configured. WhatsApp delivery needs an E.164 phone number. Without it, the invite falls back to email where fallback is enabled and fails silently where it isn't, so check your fallback setting before going live.

Assessment platforms that don't integrate tightly with your ATS create manual overhead at exactly the wrong moment, when a recruiter is managing 50+ active applications and needs status updates, scores, and rejection decisions to flow automatically. This reference document covers how Selection Lab integrations with Emply, Jobylon, and Salesforce work at a systems level. What triggers an invitation, what gets returned after a candidate completes an assessment, and how rejection outcomes map back to ATS statuses.
Three distinct events drive every integration.
Understanding which layer a problem belongs to is the fastest way to isolate configuration errors. For the same pattern in Recruitee and SmartRecruiters, see ATS status mapping for assessment results.
| Term | Definition |
|---|---|
| Invitation status | Whether the assessment invite was successfully delivered and opened. Possible values pending, sent, opened, failed. |
| Completion status | The terminal state of the candidate's assessment attempt. completed, declined, expired, error. |
| Report availability | Whether a full result report (URL or embedded view) is ready to render in the ATS. |
| Candidate outcome | The downstream ATS action triggered by the completion status plus score thresholds. advance, reject, withdraw, or manual review. |
When an Emply candidate moves to a pipeline stage configured to trigger a Selection Lab assessment, Emply sends a structured payload to the Selection Lab webhook endpoint. The fields that should be present in a correctly configured Emply integration are listed below. Fields marked [TBD] require verification against your specific Emply setup, since Emply's public help documentation does not publish the full payload schema.
| Field | Type | Required | Purpose in Selection Lab |
|---|---|---|---|
first_name | string | Yes | Personalizes invite messaging and report header |
last_name | string | Yes | Report identity, duplicate detection |
email | string (RFC 5322) | Yes | Primary invite delivery channel |
application_id | string | Yes | Correlation key, echoed back on completion callback so Emply updates the correct record |
candidate_id | string | Yes | External candidate identity, used for deduplication across applications |
requisition_id | string | Recommended | Links assessment to the correct job, drives assessment profile selection if profiles are mapped per vacancy |
locale / language | ISO 639-1 (e.g., nl, en) | Recommended | Sets the UI language of the assessment and invite copy |
phone | string (E.164) | Optional | Required only if WhatsApp delivery is configured; without it, email delivery is used |
consent_flag | boolean | Optional [TBD] | If Emply passes a pre-collected consent flag, Selection Lab can record it; otherwise, Selection Lab's own consent flow fires before results are shared |
What happens when optional fields are missing. If locale is absent, Selection Lab defaults to the language configured in the assessment profile. If phone is absent and the invite channel is set to WhatsApp, the invite fails silently unless a fallback channel (email) is configured. Verify fallback behavior with your Selection Lab account configuration.
The trigger mechanism for Emply integrations operates via a webhook or connector sync (exact mechanism [TBD], confirm whether your Emply instance uses webhook push or a polling-based connector). The configuration path is as follows.
requisition_id so Selection Lab can resolve the correct profile automatically.Auth failure mode. If the API credential is expired or misconfigured, Emply will receive an HTTP 4xx response. Depending on your connector configuration, this may silently drop the invite or queue it for retry. Check your integration logs in both Emply and the Selection Lab admin panel to confirm delivery.
Retry behavior for failed deliveries is [TBD], confirm retry count, backoff interval, and dead-letter behavior with your Selection Lab integration engineer.
Once a candidate completes (or exits) the Selection Lab assessment, Selection Lab sends a completion callback to Emply. The callback payload contains the following artifact types.
| Status | Meaning |
|---|---|
completed | Candidate finished all assessment components |
declined | Candidate actively rejected the invite |
expired | Invite window elapsed without candidate action |
partial | Candidate started but did not finish (if partial submissions are enabled) |
error | Technical failure during assessment session |
| Field | Type | Notes |
|---|---|---|
match_score | integer (0-100) | Composite match score against the role profile |
component_scores | object | Per-component breakdown (e.g., cognitive, personality, hard skills). [TBD] exact component key names depend on your assessment profile configuration |
report_url | string (URL) | Deep link to the candidate's full report in the Selection Lab portal, renderable in Emply if iframe embedding is configured |
report_available | boolean | Set to true once the report PDF is generated and accessible |
completed_at | ISO 8601 timestamp | Completion time in UTC |
application_id | string | Echoed from the invite payload for ATS record correlation |
candidate_id | string | Echoed for deduplication |
Selection Lab's privacy model requires that results are shown to the candidate first. Consent is then requested a second time before results are shared back to the ATS. This means that if a candidate completes the assessment but has not yet given post-assessment consent to share results, the report_url and component_scores fields in the callback payload may be withheld or returned as null until consent is recorded. Personal data is stored in Frankfurt in compliance with EU data residency requirements.
The exact Emply implementation of this consent gate (whether it blocks the callback entirely or sends a partial payload with a consent_pending flag) is [TBD], confirm with your Selection Lab account manager.
| Selection Lab completion status | Score condition | Recommended Emply target status |
|---|---|---|
completed | Score >= configured threshold | Move to next stage (e.g., "Interview") |
completed | Score < configured threshold | "Rejected - Assessment" or equivalent |
declined | n/a | "Withdrawn" or "No Response" |
expired | n/a | "Rejected - No Show" or configured stage |
error | n/a | "Manual Review" |
The exact Emply stage/status string values are picklist-defined in your Emply configuration. The mapping must be set up in the Selection Lab integration settings to match those exact string values. A mismatch (e.g., "Rejected" vs. "rejected" vs. "REJECTED") will cause the callback to fail silently or return a 422 error.
On a rejection outcome, Selection Lab can trigger a rejection message to the candidate via two channels.
The timing (immediate vs. delayed) and exact template variables are [TBD], confirm rejection message templates and channel priority logic with your Selection Lab account configuration.
Invite trigger payload (Emply to Selection Lab)
{
"event": "assessment.invite",
"application_id": "APP-00123",
"candidate_id": "CAND-78901",
"requisition_id": "REQ-456",
"first_name": "Jane",
"last_name": "Smith",
"email": "[email protected]",
"phone": "+31612345678",
"locale": "nl",
"consent_flag": true
}
Completion callback payload (Selection Lab to Emply)
{
"event": "assessment.completed",
"application_id": "APP-00123",
"candidate_id": "CAND-78901",
"completion_status": "completed",
"match_score": 74,
"component_scores": {
"cognitive": 68,
"personality": 81,
"hard_skills": 72
},
"report_url": "https://app.selectionlab.com/reports/APP-00123",
"report_available": true,
"completed_at": "2026-08-30T09:14:22Z"
}
Note that field names and the presence of component_scores keys depend on your active assessment profile. The above is illustrative; confirm the exact schema with your Selection Lab integration spec sheet.
application_id. Without the correlation key, Selection Lab cannot identify which Emply record to update. Check the connector config to confirm Emply is passing this field on every invite event.Jobylon's integration model for assessment partners is documented via its Pipeline Actions framework. According to Jobylon's support documentation (January 27, 2026), partner integrations are configured at the pipeline status level. Navigate to Pipeline Actions, create an action next to the status you want to automate, choose "Partner Integrations" as the action type, select your assessment vendor, and save. With that setup, an assessment test is automatically sent when a candidate moves to the selected status.
This means the Jobylon assessment integration is event-driven by status change, not by manual recruiter action. No separate webhook configuration is required on the recruiter side beyond the Pipeline Actions setup. The invite is dispatched as soon as the ATS records the status transition.
Selection Lab fits directly into this model. When a candidate enters the configured pipeline status, Selection Lab receives the invite event and delivers the assessment invitation. Recruiters can view the complete report and individual scores within the Jobylon candidate record once results are returned.
The Jobylon support article on partner integrations does not publish the following.
These details are [TBD], request the Selection Lab + Jobylon integration spec from your Selection Lab account manager, or review the Jobylon admin under Settings > Integrations for field-level detail.
For the return path (results back into Jobylon), the same general completion callback pattern applies as described in the Emply section. Completion status, match score, component scores, and report URL are pushed back to the candidate record. Jobylon's pipeline can then be configured to move candidates automatically based on score thresholds using its native score-based automation feature.
Salesforce's data model for recruiting (whether native Salesforce Recruiting or a managed package like Salesforce for Recruiting) uses strongly typed picklist fields on objects such as Application, Assessment, or custom staging objects. This imposes stricter constraints on result mapping than Emply or Jobylon.
Selection Lab's Salesforce integration pushes completion artifacts to a designated object (typically a custom Assessment__c or equivalent object, or an existing Application/Candidate Stage object, depending on your Salesforce org configuration). The fields populated are conceptually the same as in the Emply return payload. Completion status, scores, report URL, and timestamp. However, the exact API field names and object targets depend on your Salesforce org schema.
Key constraint. Any status field mapped from a Selection Lab completion status must correspond to an active picklist value in your Salesforce org. If completed_with_low_score is not a valid picklist entry in your Application_Status__c field, the update will fail with a Salesforce validation error.
For Salesforce, rejection mapping is a two-step translation.
completed, declined, expired) plus a pass/fail determination based on score thresholds."Rejected - Assessment", "No Longer in Consideration").If your org uses Salesforce Experience Cloud and candidates access assessments through a portal, external user permissions for the relevant objects must be configured to allow status reads and report URL access. This is a common source of "results not visible" tickets in Salesforce-integrated deployments.
For candidate rejection status mapping with automatically triggered invitations in Salesforce, the pattern mirrors the Emply approach. A configured threshold fires the rejection status update, and the messaging channel (email, WhatsApp) is driven by candidate contact data and Selection Lab template configuration.
Regardless of which ATS you're using, the mapping logic should normalize Selection Lab's canonical statuses before writing to ATS-specific enums. The following matrix applies across Emply, Jobylon, and Salesforce.
| Selection Lab canonical outcome | Score condition | Recommended ATS action | Notes |
|---|---|---|---|
knockout_reject | Knockout criteria met during SmartChat intake | Immediate rejection status plus reject message | No assessment sent; candidate rejected at screening layer |
completed_pass | match_score >= role threshold | Advance to next stage | Recruiter review optional or bypassed |
completed_fail | match_score < role threshold | Rejection status (assessment-stage) | Rejection message sent via configured channel |
declined | Candidate refused invite | Withdrawal or "no response" status | No score available |
expired | Invite TTL elapsed | Rejection or "no show" status | Configurable; some orgs prefer manual review |
error | Technical failure | Manual review queue | Do not auto-reject; retry or re-invite |
The principle behind this matrix is normalize first, then map. Your ATS-specific picklist values should never be hardcoded directly in the integration callback logic. Maintain a mapping table in your integration configuration layer that translates Selection Lab's canonical statuses to your ATS strings. That way, if Emply renames a pipeline status, you update the mapping table once rather than changing the integration logic.
application_id and candidate_id are present in every invite payload| Symptom | Likely cause | Fix |
|---|---|---|
| Candidate moved to assessment stage but received no invite | Webhook not firing or auth failure | Check connector logs; verify credentials; confirm Pipeline Actions config (Jobylon) or connector mapping (Emply/Salesforce) |
| Invite delivered but wrong language | locale field missing or not passed | Confirm ATS passes locale; set default locale in Selection Lab assessment profile as fallback |
| Duplicate invites sent | candidate_id not deduplicating correctly | Confirm dedup logic in Selection Lab tenant; check whether ATS is firing the trigger multiple times on re-entry to a stage |
| Rate limit error on invite endpoint | High-volume hiring burst | Review Selection Lab's API rate limits with your account manager; implement queue-based dispatch if needed |
| Symptom | Likely cause | Fix |
|---|---|---|
| Results not appearing in ATS | Consent gate pending or application_id mismatch | Check consent status in Selection Lab admin; verify application_id is echoed correctly in callback |
report_url returns 403 | Insufficient permissions (common in Salesforce Experience Cloud setups) | Configure external user/profile permissions for the report object |
| ATS status not updated after completion | Picklist value mismatch | Export ATS picklist; update mapping table in integration config |
| Score fields missing in ATS | Assessment profile doesn't include all components | Review active components in assessment profile; confirm return schema with Selection Lab integration spec |
Configure logging at three points. (1) The ATS connector/webhook dispatch log to confirm invite events fired, (2) the Selection Lab admin event log to confirm invites were received and delivered, and (3) the ATS update log to confirm completion callbacks were applied. For Salesforce, Apex debug logs or Platform Event logs give the most granular visibility.
Reconciliation. Run a weekly report comparing candidates in the "Assessment Stage" status with candidates who have a completed Selection Lab result. Any gap indicates an invite delivery failure or a consent-blocked result. Most ATS platforms support this as a simple pipeline filter; Selection Lab's reporting panel provides a matching export.
For persistent delivery failures, request an audit trail export from Selection Lab that includes event timestamps, HTTP response codes, and any retry attempts. This is the fastest path to diagnosing whether a failure is on the ATS connector side or within Selection Lab's delivery pipeline. Want to see the integration with your ATS? Book a demo.
A pipeline stage change. Emply, Jobylon and Salesforce each send an invite event to Selection Lab when a candidate enters the configured assessment stage. In Jobylon this is set up through Pipeline Actions, in Emply through the connector settings, in Salesforce through a Flow, an Apex trigger or the Selection Lab connector.
A completion status (completed, declined, expired, partial or error), a match score from 0 to 100, per-component scores, a report URL, a report-available flag, a UTC timestamp, and the application_id and candidate_id echoed back so the ATS updates the right record.
Most often because post-assessment consent is still pending, the application_id doesn't match, or the status value doesn't match an ATS picklist entry exactly. Check the consent status in the Selection Lab admin first, then the correlation key, then the picklist mapping.
Normalize first, then map. Translate Selection Lab's canonical outcomes (completed_pass, completed_fail, declined, expired, error, knockout_reject) into your ATS statuses through a mapping table, never by hardcoding picklist strings in the callback logic. Send error outcomes to manual review, never to automatic rejection.
Only if a fallback channel is configured. WhatsApp delivery needs an E.164 phone number. Without it, the invite falls back to email where fallback is enabled and fails silently where it isn't, so check your fallback setting before going live.