HRMS migration
Field-level mapping, validation, and rollback between Sage HRMS and Bullhorn ATS & CRM. We move data and schema; workflows are rebuilt natively in Bullhorn ATS & CRM.
Sage HRMS
Source
Bullhorn ATS & CRM
Destination
Compatibility
8 of 14
objects map 1:1 between Sage HRMS and Bullhorn ATS & CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Sage HRMS and Bullhorn serve fundamentally different functions. Sage HRMS is an on-premise core HRMS and payroll platform; Bullhorn is a cloud ATS and CRM built for staffing and recruiting agencies. Migrating between them requires more than a field mapping exercise — it requires a semantic translation of the data model. Employee records from Sage HRMS map to Bullhorn Candidates or Contacts depending on whether the firm is recruiting for its own headcount or for client placements. Payroll history, pay groups, tax codes, and benefit enrollments have no native Bullhorn equivalent and require custom field configuration or document-based transfer. We handle the export choreography from Sage HRMS (pre-configured CSV and ODBC paths with no programmatic bulk API), build the Bullhorn schema with the required custom fields and objects, and load through the Bullhorn REST API with rate-limit-aware chunking. Workflows and alerts configured in Sage HRMS Alerts and Workflow do not migrate; we deliver a written inventory for the customer's admin to rebuild in Bullhorn Automation or the Bullhorn Alerts module.
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 HRMS 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 HRMS
Employee
Bullhorn ATS & CRM
Candidate
1:1Sage HRMS Employee records map to Bullhorn Candidate records for firms recruiting for their own headcount. EmployeeID, name fields, address, contact info, date of hire, job title, and department assignment migrate as standard Candidate fields. Biographical data, employment status, and org assignment (Position, Pay Group) are mapped to typed Bullhorn Candidate fields or custom fields. Employee records from Sage HRMS that represent candidates for external placements (if the ATS module is active) map to Candidates with a source tag indicating the internal HRMS origin.
Sage HRMS
Employee
Bullhorn ATS & CRM
Contact
1:1For staffing firms, Sage HRMS Employee records for internal staff (recruiters, account managers, operations) map to Bullhorn Contact records. The Contact represents the internal team member using Bullhorn, not a candidate or client. We map name, email, phone, and department to Bullhorn Contact fields and configure the appropriate user type during Bullhorn setup.
Sage HRMS
Department
Bullhorn ATS & CRM
Client (Company)
1:1Sage HRMS Departments map to Bullhorn Client records. The department name becomes the Client name, cost center assignments become custom fields on the Client record, and the organizational hierarchy is preserved as a custom field tree or a Note attachment. If the organization has a multi-level department structure, we create a custom field department_level_1 through department_level_5 to represent the full hierarchy in Bullhorn.
Sage HRMS
Position
Bullhorn ATS & CRM
Job Order (Job)
lossySage HRMS Positions define job titles, grade levels, and pay ranges. In Bullhorn, these map to Job Order templates rather than direct records. We extract the position table (title, description, grade, pay range low/high, FLSA status) and use it to pre-populate Bullhorn Job Order templates so that when a recruiter creates a new job order matching an internal position, the pay structure and classification are pre-loaded. FLSA status and exempt/non-exempt classification migrate as custom fields on the Job record.
Sage HRMS
Pay Group
Bullhorn ATS & CRM
Custom Fields on Placement
lossySage HRMS Pay Groups define pay frequency (weekly, biweekly, semimonthly, monthly), deduction priority order, and tax jurisdiction. Bullhorn has no native Pay Group concept. We extract Pay Group definitions and create Bullhorn custom fields on the Placement object: pay_frequency, deduction_priority, and tax_jurisdiction. The values populate when a Placement is created and carry the pay structure from Sage HRMS into Bullhorn's billing context.
Sage HRMS
Payroll History
Bullhorn ATS & CRM
Placement Billing Custom Fields
lossyHistorical earnings, deductions, and tax withholdings from Sage HRMS do not have a native Bullhorn equivalent because Bullhorn manages placement billing (what the client pays the agency) rather than employee payroll. We extract the last two to three fiscal years of payroll history as a summary object: annual earnings bands, total tax withholdings, and year-end totals. These are stored as a document attachment (CSV export) on the corresponding Candidate record and as a structured custom fields set on the Placement for compliance and audit purposes.
Sage HRMS
Benefit Plans
Bullhorn ATS & CRM
Custom Fields or Note on Candidate
lossyBenefit enrollments, carrier assignments, and coverage tiers from Sage HRMS do not map to any standard Bullhorn object. We extract active benefit plan enrollments per employee and create a structured custom fields section on the Candidate record (benefit_plan_type, carrier_name, coverage_tier, enrollment_status). If the enrollment data is complex or includes multiple dependents, we deliver it as a CSV file attachment on the Candidate record keyed by EmployeeID.
Sage HRMS
Tax Codes
Bullhorn ATS & CRM
Custom Fields on Job or Placement
1:1Federal, state, and local tax codes from Sage HRMS define payroll tax jurisdictions and withholding rules. Bullhorn does not process payroll taxes. We extract the tax code table and create Bullhorn custom fields on Job and Placement records (federal_tax_code, state_tax_code, local_tax_code, eic_status) so that staffing firms can track tax jurisdiction requirements for compliance and billing purposes. The tax code values are reference data only in Bullhorn.
Sage HRMS
Employee Documents
Bullhorn ATS & CRM
File Attachments on Candidate
1:1Sage HRMS stores employee documents (I-9s, W-4s, offer letters, performance reviews, benefit elections) as file attachments in the database. We extract these as a file bundle keyed by EmployeeID and load them into Bullhorn as file attachments on the corresponding Candidate record. Each document type is placed in a named subfolder (i9, w4, offer_letter, performance_review, benefit_election) within the candidate's document library. We verify that Bullhorn's file attachment limit is not exceeded for any single candidate during migration.
Sage HRMS
Time Off Balances
Bullhorn ATS & CRM
Custom Fields on Candidate or Note
1:1Accrual rules and current time-off balances from Sage HRMS have no Bullhorn equivalent in a recruiting context. We extract balances as of the migration date and store them as a structured Note on the Candidate record (accrual_type, balance_hours, accrued_date, policy_name). If the customer's Bullhorn instance has the Bullhorn Time and Expense module active, we map balances to the corresponding time-tracking records there.
Sage HRMS
Performance Reviews
Bullhorn ATS & CRM
Custom Object on Candidate
1:manySage HRMS performance review templates, ratings, and narrative responses migrate to a Bullhorn Custom Object (PerformanceReview) linked to the Candidate record. The Custom Object captures review_date, rating_value, reviewer_name, and narrative_text fields. If the Sage HRMS schema uses a separate review table with multiple review cycles per employee, we create multiple Custom Object records per Candidate, ordered by review_date.
Sage HRMS
Applicant Tracking (if active)
Bullhorn ATS & CRM
Candidate, Job, Placement
1:manyIf the Sage HRMS ATS module is active, job requisitions, candidate profiles, and application status migrate to Bullhorn Job Order (requisition), Candidate (profile), and a custom Application status field on the Candidate record. We extract active and recent candidates from the ATS table, map their application status (new, screening, interview, offer, hired, rejected) to Bullhorn Candidate status values, and link them to the corresponding Job Order if a matching requisition exists.
Sage HRMS
User and Permissions
Bullhorn ATS & CRM
Bullhorn User
1:1Sage HRMS user accounts and role-based permissions map to Bullhorn User records. We extract user names, email addresses, and role assignments and provision corresponding Bullhorn Users with matching user types (Full Recruiter, Limited Recruiter, Standard, Read-Only, or Admin). Sage HRMS role permissions are documented in a written permissions matrix so the customer's Bullhorn admin can configure equivalent access controls post-migration.
Sage HRMS
Custom Fields
Bullhorn ATS & CRM
Bullhorn Custom Fields
1:1Sage HRMS custom fields on Employees, Positions, Jobs, and other objects are inventoried during discovery and re-created as Bullhorn custom fields on the equivalent entity. We map field data types (text, number, date, picklist, checkbox) to the corresponding Bullhorn custom field type. ESS-specific custom columns from Sage HRMS that do not survive a version upgrade are flagged as requiring re-creation in Bullhorn as standard custom fields rather than custom component fields, per Bullhorn's guidance that custom component fields are reserved for integrations only.
| Sage HRMS | Bullhorn ATS & CRM | Compatibility | |
|---|---|---|---|
| Employee | Candidate1:1 | Fully supported | |
| Employee | Contact1:1 | Fully supported | |
| Department | Client (Company)1:1 | Fully supported | |
| Position | Job Order (Job)lossy | Fully supported | |
| Pay Group | Custom Fields on Placementlossy | Fully supported | |
| Payroll History | Placement Billing Custom Fieldslossy | Mapping required | |
| Benefit Plans | Custom Fields or Note on Candidatelossy | Mapping required | |
| Tax Codes | Custom Fields on Job or Placement1:1 | Fully supported | |
| Employee Documents | File Attachments on Candidate1:1 | Mapping required | |
| Time Off Balances | Custom Fields on Candidate or Note1:1 | Mapping required | |
| Performance Reviews | Custom Object on Candidate1:many | Mapping required | |
| Applicant Tracking (if active) | Candidate, Job, Placement1:many | Fully supported | |
| User and Permissions | Bullhorn User1:1 | Fully supported | |
| Custom Fields | Bullhorn Custom Fields1:1 | Mapping required |
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 HRMS gotchas
Database restore between versions drops permissions
No documented public API for bulk data ingestion
ESS custom field columns break on version upgrade
Export requires pre-configured file paths and file types
Pricing is not publicly disclosed by Sage
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 export path configuration
We audit the source Sage HRMS environment: SQL Server or Pervasive database version, active modules (HR, payroll, benefits, ESS, ATS, Alerts and Workflow), custom field definitions, and export format history. We identify every distinct Sage HRMS object, estimate row counts per table, and inventory custom ESS column dependencies. We pre-configure all export file paths, empty target files, and ODBC connections during this phase so the export step is automated, not manual.
Bullhorn edition verification and schema design
We verify the destination Bullhorn edition (ATS Growth excludes API access) and design the Bullhorn schema. This includes creating custom fields on Candidate, Client, Job, Placement, and Opportunity; creating any required Custom Objects (PerformanceReview, BenefitEnrollment); configuring Bullhorn user types to match Sage HRMS role assignments; and mapping Pay Group definitions to Placement custom fields. Schema is deployed into the Bullhorn Sandbox first for validation before any records move.
Sandbox migration and reconciliation
We run a full migration into the Bullhorn Sandbox using production-like data volumes. The customer's Bullhorn admin reconciles record counts (Candidates in, Contacts in, Clients in, Documents attached), spot-checks 25-50 random candidate records against the Sage HRMS source, and validates that custom fields populated correctly. Any mapping corrections and custom field adjustments happen in the Sandbox, not in production.
Employee and document extraction
We extract all Sage HRMS Employee records through the pre-configured file export (CSV via ODBC). We extract employee documents as file attachments keyed by EmployeeID. For each employee, we extract payroll history (last two to three fiscal years), benefit enrollments, time-off balances, performance reviews, and any applicant tracking data. All extractions are timestamped and checksummed for reconciliation.
Production migration in dependency order
We run production migration in record-dependency order: Users (validated against Bullhorn User table by email), Clients (from Sage HRMS Departments), Candidates (from Employees with type-tagged source), Contacts (for internal staff), Job Orders (from Sage HRMS Positions as templates), Placements (with Pay Group custom fields populated), custom objects (PerformanceReview linked to Candidate), document attachments, and payroll history as structured notes or custom field summaries. We use the Bullhorn REST API with batch chunking and exponential backoff on rate-limit responses.
Cutover, validation, and workflow handoff
We freeze Sage HRMS writes during cutover, run a final delta migration of any records modified during the migration window, then enable Bullhorn as the system of record. We deliver the Sage HRMS Alerts and Workflow inventory document to the customer's Bullhorn admin team for rebuild in Bullhorn Automation or Bullhorn Alerts. We support a one-week hypercare window for reconciliation issues. We do not rebuild Sage HRMS workflows or automations as Bullhorn workflows inside the migration scope.
Platform deep dives
Sage HRMS
Source
Strengths
Weaknesses
Bullhorn ATS & CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard HRMS migration. 1 of 7 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Sage HRMS 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 HRMS: Not publicly documented.
Data volume sensitivity
Sage HRMS 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 HRMS to Bullhorn ATS & CRM migration scoping. Not seeing yours? Book a call.
Walk through your Sage HRMS 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 HRMS
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.