HRMS migration
Field-level mapping, validation, and rollback between Sage People and Bullhorn ATS & CRM. We move data and schema; workflows are rebuilt natively in Bullhorn ATS & CRM.
Sage People
Source
Bullhorn ATS & CRM
Destination
Compatibility
10 of 12
objects map 1:1 between Sage People and Bullhorn ATS & CRM.
Complexity
CModerate
Timeline
3-5 weeks
Overview
Sage People and Bullhorn serve fundamentally different functions in an organization's stack. Sage People is a cloud HRIS built on Salesforce for mid-size organizations managing the full employee lifecycle: onboarding, absence tracking, compensation history, and performance reviews. Bullhorn is an ATS and CRM designed for staffing and recruiting agencies, where the primary record is the Candidate and the primary workflow is the placement lifecycle. Migrating between them requires translating a Human Resources data model into a Talent Acquisition data model. We map Sage People Employees to Bullhorn Candidate records with an employee-status custom field, preserve department hierarchies as custom fields on ClientCorporation or as a custom object, and store compensation history and performance objectives as Bullhorn custom objects. Bullhorn ATS enforces custom object limits by edition (none on ATS Growth, two on ATS, ten on Enterprise), which shapes the schema design. Workflows, approval chains, and onboarding automation are not exportable from Sage People via API and must be rebuilt in Bullhorn using Bullhorn Automation or documented for admin rebuild post-migration.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Sage People object lands in Bullhorn ATS & CRM, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Sage People
Employee
Bullhorn ATS & CRM
Candidate
1:1Sage People Employee records map to Bullhorn Candidate records. The core fields (first name, last name, email, phone, address, employment dates, job title, department) map directly to Bullhorn Candidate fields. We add a custom field employee_status__c set to true to distinguish migrated employees from pure recruiting candidates. The Bullhorn Candidate record is the parent record for all subsequent HR data in Bullhorn.
Sage People
Employee
Bullhorn ATS & CRM
Contact (on ClientCorporation)
1:1For organizations that use Bullhorn to track internal employees as contacts on a ClientCorporation representing the employer entity, we create a ClientCorporation for the organization itself and attach Employee records as Contact records with a custom employment_status field. The customer's Bullhorn admin chooses this pattern during scoping based on whether Bullhorn is the sole HR record or dual-system with another HRIS.
Sage People
Department
Bullhorn ATS & CRM
ClientCorporation or custom object
lossySage People Departments with parent-child hierarchies have no direct Bullhorn equivalent. We create a departments__c custom object (or use custom fields on ClientCorporation) with name, cost_center_code, and parent_department__c lookup. If the organization uses Bullhorn to track staffing clients, ClientCorporation is reserved for external clients and internal org structure uses the custom object. The customer decides during scoping.
Sage People
Absence and Leave Records
Bullhorn ATS & CRM
customObject1 (absence_records__c)
1:1Leave balances, absence types, and accrual histories migrate to a Bullhorn custom object (customObject1s) linked to the Candidate record. Fields include absence_type__c (text), start_date__c, end_date__c, hours_taken__c, accrual_balance__c, and carryover__c. Bullhorn ATS Growth edition does not include custom objects—absence data is documented in a written inventory for manual re-entry. Custom objects require Bullhorn Support to provision before migration data load.
Sage People
Compensation History
Bullhorn ATS & CRM
customObject2 (compensation_history__c)
1:1Effective-dated compensation records migrate as Bullhorn custom object instances (customObject2s) linked to the Candidate. Each record carries effective_date__c, base_salary__c, bonus_amount__c, currency__c, and change_reason__c. Custom compensation components (allowances, equity, commissions) migrate as additional custom fields on the compensation object. The customer confirms which compensation fields exist in their Sage People schema during discovery.
Sage People
Jobs and Positions
Bullhorn ATS & CRM
JobOrder
1:manySage People separates Job templates from filled Position records. Filled positions map to Bullhorn JobOrder records representing active or historical job openings. Job templates that do not have a corresponding vacancy are stored as a jobs_template__c custom object or documented in the handoff inventory. The mapping preserves the relationship between a position and its assigned Employee (Candidate) as a custom field on JobOrder.
Sage People
Objectives and Performance Reviews
Bullhorn ATS & CRM
customObject3 (performance_records__c)
1:1Enhanced Objectives and performance review records migrate to Bullhorn customObject3s linked to the Candidate. We map objective_text__c, metrics__c, review_status__c, review_date__c, and overall_rating__c. Draft-state objectives with known Sage People state-machine issues are flagged in the mapping notes for admin review before insert. Bullhorn ATS Growth and ATS editions have limited custom object capacity—performance data may require a staged migration or written inventory approach.
Sage People
Documents
Bullhorn ATS & CRM
ContentDocument + ContentDocumentLink
1:1Employee documents (contracts, certifications, ID copies) export from Sage People as Salesforce attachments with time-limited URLs that expire in approximately two minutes. We pre-fetch all document binary blobs in a batch queue immediately before Bullhorn insert, avoiding the URL expiry window entirely. Each document uploads to Bullhorn as ContentDocument, associated to the Candidate via ContentDocumentLink. File names and MIME types are preserved for admin reference.
Sage People
Candidate and Vacancy Records (Recruitment module)
Bullhorn ATS & CRM
Candidate + JobOrder
1:1If the Sage People organization uses the Recruitment add-on module, candidate applications and vacancy postings migrate to Bullhorn Candidate and JobOrder records. Vacancy requirements and compensation bands stored as custom fields on the vacancy object map to equivalent custom fields on JobOrder. The Sage People candidate record maps directly to Bullhorn Candidate with application status preserved in a custom field.
Sage People
Time and Attendance (Timesheets module)
Bullhorn ATS & CRM
customObject4 (timesheet_entries__c)
1:1Timesheet entries from Sage People Timesheets module migrate to Bullhorn customObject4s linked to the Candidate. Shift schedules and recurring patterns are not fully mappable if the destination does not use a shift management module—we document shift patterns as a written schedule reference for the admin to reconfigure in Bullhorn or a separate time-tracking tool. Shift patterns with complex recurring rules are not automated in this migration scope.
Sage People
Workflows and Approval Rules
Bullhorn ATS & CRM
Not migrated
1:1Sage People workflows and approval rules are Salesforce configuration objects that are not exposed via API. We cannot export them as data. During discovery we document every active workflow (leave approval chains, manager escalation paths, onboarding automation) as a written configuration inventory. Bullhorn Automation (formerly Herefish) or manual workflow setup in Bullhorn replaces these. The inventory document is delivered before cutover.
Sage People
Reports and Dashboards
Bullhorn ATS & CRM
Not migrated
1:1Sage People reports and dashboards are built on the Salesforce reporting engine and are not portable across platforms. We do not migrate them. We deliver a written index of every Sage People report with its name, object dependency, filters, and scheduling as reference for the customer's admin to rebuild in Bullhorn reporting or a third-party BI tool.
| Sage People | Bullhorn ATS & CRM | Compatibility | |
|---|---|---|---|
| Employee | Candidate1:1 | Fully supported | |
| Employee | Contact (on ClientCorporation)1:1 | Fully supported | |
| Department | ClientCorporation or custom objectlossy | Fully supported | |
| Absence and Leave Records | customObject1 (absence_records__c)1:1 | Fully supported | |
| Compensation History | customObject2 (compensation_history__c)1:1 | Mapping required | |
| Jobs and Positions | JobOrder1:many | Fully supported | |
| Objectives and Performance Reviews | customObject3 (performance_records__c)1:1 | Mapping required | |
| Documents | ContentDocument + ContentDocumentLink1:1 | Mapping required | |
| Candidate and Vacancy Records (Recruitment module) | Candidate + JobOrder1:1 | Fully supported | |
| Time and Attendance (Timesheets module) | customObject4 (timesheet_entries__c)1:1 | Fully supported | |
| Workflows and Approval Rules | Not migrated1:1 | Not supported | |
| Reports and Dashboards | Not migrated1:1 | Not supported |
Gotchas + challenges
Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.
Sage People gotchas
Sandbox environments block all data exports
Attachment links expire after approximately two minutes
Workflows and approval rules are not API-exportable
Rate limit of 180 requests per minute with 10 calls per second burst
Custom fields use inconsistent naming prefixes across orgs
Bullhorn ATS & CRM gotchas
ATS Growth edition has no API access
Attachments excluded from CSV bulk exports
Custom Object limits vary sharply by edition
Opportunity pipeline stages are recruitment-specific
Resume parse quality varies by document format
Pair-specific challenges
Migration approach
Discovery and Bullhorn edition selection
We audit the Sage People Salesforce org across all active modules (Core HR, Timesheets, Performance Management, Recruitment if present), custom fields (UD_, UDF_, IM_ prefixes), active workflows, document volume, and employee record count. We pair this with a Bullhorn edition assessment: ATS Growth (no custom objects) covers simple employee record migration; ATS ($99/user) supports two custom objects for absence and compensation; Enterprise supports ten custom objects for full HR data. The discovery output is a written migration scope, custom object allocation plan, and Bullhorn edition recommendation if the current edition constrains the migration.
Custom object provisioning and schema design
We coordinate with the customer's Bullhorn admin to submit the Custom Object Setup Sheet to Bullhorn Support, requesting the required custom objects (absence_records__c, compensation_history__c, performance_records__c, timesheet_entries__c) with their field definitions. Once Bullhorn Support confirms provisioning, we design the field-level schema in Bullhorn: data types, required fields, picklist values, and lookup relationships to the Candidate entity. Schema validation happens in the Bullhorn test environment before production data load.
Sandbox migration and reconciliation
We run a full migration into a Bullhorn test environment using production-like data volume. The customer's HR operations lead reconciles record counts (Employees in vs Candidates in, custom object instances in vs absence and compensation records sourced), spot-checks 25-50 random records against the Sage People source, and reviews document associations. Any mapping corrections, custom field type mismatches, or custom object field limit issues are resolved here before production cutover.
Document pre-fetch and binary download
We extract all Sage People document attachment URLs in a single batch job and download the binary blobs immediately before Bullhorn insert. This pre-fetch runs in a dedicated queue with a two-minute maximum window from URL generation to download completion. Each downloaded file is associated to the correct Candidate record in Bullhorn via ContentDocument and ContentDocumentLink on the same migration transaction.
Production migration in dependency order
We run production migration in record-dependency order: Candidate base records (from Employees) first, then ClientCorporation or custom org structure, then custom object instances (absence records, compensation history, performance reviews, timesheet entries) linked to Candidates by ID map, then documents, then JobOrder records from Sage People vacancies. Each phase emits a row-count reconciliation report before the next phase begins. We throttle to Sage People's 180 req/min API limit with 10 calls/second burst cap throughout.
Cutover, validation, and workflow rebuild handoff
We freeze Sage People writes during the cutover window, run a final delta migration of any records modified during the window, then enable Bullhorn as the system of record for recruiting and HR data. We deliver the workflow configuration inventory document to the customer's admin team. We support a one-week hypercare window where we resolve any reconciliation issues. We do not rebuild Sage People workflows as Bullhorn Automation inside the migration scope; that is a separate engagement or an internal admin task.
Platform deep dives
Sage People
Source
Strengths
Weaknesses
Bullhorn ATS & CRM
Destination
Strengths
Weaknesses
Complexity grading
Moderate HRMS migration. 1 of 7 objects need a mapping; the rest are 1:1.
Overall complexity
Moderate migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Sage People and Bullhorn ATS & CRM.
Object compatibility
1 of 7 objects need a mapping; the rest are 1:1.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
7-object category — typical timelines run 2–7 days end-to-end.
API constraints
Sage People: 180 requests per minute with a maximum burst of 10 calls per second.
Data volume sensitivity
Sage People doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during Sage People to Bullhorn ATS & CRM migration scoping. Not seeing yours? Book a call.
Walk through your Sage People to Bullhorn ATS & CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Sage People
Other ways to arrive at Bullhorn ATS & CRM
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.