HRMS migration
Field-level mapping, validation, and rollback between Darwinbox and Bullhorn ATS & CRM. We move data and schema; workflows are rebuilt natively in Bullhorn ATS & CRM.
Darwinbox
Source
Bullhorn ATS & CRM
Destination
Compatibility
10 of 13
objects map 1:1 between Darwinbox and Bullhorn ATS & CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Moving from Darwinbox to Bullhorn is a cross-domain migration. Darwinbox centres on a unified Employee record covering the full hire-to-retire lifecycle with native modules for recruitment, attendance, leave, payroll, and performance. Bullhorn separates Candidate records (for job seekers in the ATS/CRM) from Employee records (for staff in Bullhorn HCM), and does not have a direct equivalent for Darwinbox's effective-dated compensation rows, multi-policy leave structures, or performance review cycles. We extract Darwinbox's employee data and split it into Bullhorn Candidate and Employee records based on employment status at migration time, preserving original Darwinbox identifiers as custom fields for audit. We load leave balances as Bullhorn time-off entries and map shift-policy references to Bullhorn's time-tracking configuration. We do not migrate document blobs (not accessible via Darwinbox API), workflows, automations, or recruitment-to-employee transition logic as code; we deliver written inventories for the customer's admin to rebuild in Bullhorn.
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 Darwinbox 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.
Darwinbox
Employee
Bullhorn ATS & CRM
Candidate and/or Employee (split required)
1:manyDarwinbox's unified Employee record does not map directly to a single Bullhorn object. We split based on employment status at migration time: active employees become Bullhorn Employee records (in the HCM module), former employees or applicants without an employment record become Bullhorn Candidate records, and current applicants still in the recruitment pipeline become Bullhorn Candidate records with status preserved. The original Darwinbox employee ID migrates as a custom field darwinbox_id__c on both Bullhorn Candidate and Employee for audit traceability. The split rule is defined during discovery and reviewed with the customer before migration day.
Darwinbox
Organisation / Org Structure
Bullhorn ATS & CRM
Corporate Structure
1:1Darwinbox organisational units, cost centres, and location hierarchies map to Bullhorn Corporate Structure using the corporateCorporationID and parentID fields. The top-level org unit becomes the root CorporateCorporation record in Bullhorn, and child departments map as child CorporateCorporation records with the appropriate parent references. Cost-centre assignments from Darwinbox migrate as custom fields on each CorporateCorporation record. Location data maps to Bullhorn's Address object linked via the CorporateCorporation.
Darwinbox
Attendance Records
Bullhorn ATS & CRM
TimeTracking / Punch Records
1:1Darwinbox attendance punch logs (employee ID, timestamp, in/out status, machine ID, shift-date reference) map to Bullhorn TimeTracking records. Darwinbox shift policies and weekly-off names are extracted alongside attendance data and mapped to Bullhorn's time-tracking configuration before punch records are loaded. Each punch record receives a shift-policy mapping tag so that records remain auditable against Darwinbox's original shift rules. We flag any punch records that reference shift policies not representable in Bullhorn's model for customer review.
Darwinbox
Leave Balances
Bullhorn ATS & CRM
Time-Off / PTO
1:1Darwinbox leave types (annual, sick, maternity, paternity, unpaid) and per-employee accrual balances map to Bullhorn Time-Off entries with accrual-type rules. We extract each employee's leave entitlement by type with the accrual rate, balance, and policy name, and create Bullhorn time-off entries with the corresponding accrual category. Darwinbox's multiple leave policies per org unit require a policy-mapping step before bulk leave loading. Leave that does not have a direct Bullhorn equivalent (for example, Darwinbox-specific leave types) migrates as a custom field on the Employee record.
Darwinbox
Payroll / Compensation History
Bullhorn ATS & CRM
JobSubmission / Employee Custom Fields
1:1Darwinbox effective-dated compensation rows (salary, bonus, deductions, tax codes) map to Bullhorn as historical records on the Employee object. Each effective-dated row becomes a dated entry in a custom compensation history object we pre-create in Bullhorn, with fields for effective_date, salary_amount, currency, bonus_amount, and deduction_type. The most recent effective-dated row becomes the active compensation on the Bullhorn Employee record. We sequence compensation rows chronologically and flag any overlapping effective dates for customer review before applying.
Darwinbox
Recruitment / Candidates
Bullhorn ATS & CRM
Candidate
1:1Darwinbox recruitment candidate profiles, applicant-stage history, sourcing information, feedback, and offer data export as Bullhorn Candidate records. The Darwinbox candidate ID migrates as a custom field darwinbox_candidate_id__c on Bullhorn Candidate for cross-reference. Applicant-stage history (applied, screening, interview, offer, hired, rejected) maps to Bullhorn's CandidateStatus field, and custom stage names are mapped to Bullhorn status values during the pre-migration schema review. Offer letters migrate as content document attachments on the Candidate record.
Darwinbox
Performance Reviews
Bullhorn ATS & CRM
Custom Object (PerformanceReview)
lossyDarwinbox performance review cycles, ratings, goals, and manager feedback have no direct Bullhorn standard object equivalent. We pre-create a Bullhorn custom object (PerformanceReview__c) with fields for cycle_name, employee_id, reviewer_id, rating_value, rating_scale, goal_content, and feedback_text. Each review migrates as a PerformanceReview__c record linked to the Bullhorn Employee record via a lookup field. Rating scale values are normalised to a consistent numeric range defined during discovery.
Darwinbox
Users / Roles
Bullhorn ATS & CRM
User
1:1Darwinbox users carrying admin, manager, or employee roles map to Bullhorn User records with the corresponding Bullhorn permission set or role hierarchy. We extract user-role assignments from Darwinbox and map them to Bullhorn's role and permission-set model during the migration. Any Darwinbox user without a matching Bullhorn User email is placed in a reconciliation queue for the customer's Bullhorn admin to provision before record import resumes.
Darwinbox
Custom Fields
Bullhorn ATS & CRM
Custom Fields
lossyDarwinbox tenant-specific custom fields (text, number, boolean, date, predefined-list types) require Bullhorn custom field creation before migration. We introspect the Darwinbox tenant's custom field registry during discovery to build the complete field list, then pre-create matching Bullhorn custom fields on the corresponding Bullhorn objects (Candidate, Employee, CorporateCorporation) using the Bullhorn Custom Object framework. Field types are mapped: Darwinbox text becomes Bullhorn String, number becomes Numeric, boolean becomes Boolean, date becomes Date, and predefined-list becomes a Bullhorn picklist.
Darwinbox
Engagement / Recognition
Bullhorn ATS & CRM
Activity / Note
1:1Darwinbox recognition events (peer awards, reward points, social recognition) with timestamps and point values map to Bullhorn Activity records (type = Note or Custom) on the Employee record. Recognition content migrates as a Note attached to the Employee with the point value stored in a custom field. Bullhorn does not have a native rewards/recognition module, so recognition history is preserved as an audit trail rather than as a functional module.
Darwinbox
Job Postings
Bullhorn ATS & CRM
JobOrder
1:1Open and historical job postings from Darwinbox migrate to Bullhorn JobOrder records. Fields including job_title, department, employment_type, location, and description migrate directly. Status (open, closed, on-hold) maps to Bullhorn JobOrder status. JobOrder ID is stored as a cross-reference field for any candidate applications linked to the original Darwinbox job posting.
Darwinbox
Documents / HR Files
Bullhorn ATS & CRM
ContentDocument (Attachment)
1:1Employee documents (contracts, IDs, certifications) stored in Darwinbox's document management module cannot be accessed via the Darwinbox public REST API and are not migratable programmatically. We extract document metadata (filename, document type, attached employee ID, upload date) as a written inventory list that the customer's admin uses to manually upload files into Bullhorn or a linked document store post-migration. This step is flagged as out-of-scope for the automated migration.
Darwinbox
Workflows / Approvals
Bullhorn ATS & CRM
Workflow (not migrated)
1:1Darwinbox approval chains, routing rules, and workflow logic are platform-stored automation configurations rather than data records and cannot be exported as structured objects. These do not migrate. We deliver a written inventory of every active Darwinbox workflow and approval chain with its trigger, conditions, actions, and assigned approvers. Bullhorn's own workflow and automation rebuild is a separate engagement or internal admin task documented in the handoff package.
| Darwinbox | Bullhorn ATS & CRM | Compatibility | |
|---|---|---|---|
| Employee | Candidate and/or Employee (split required)1:many | Fully supported | |
| Organisation / Org Structure | Corporate Structure1:1 | Fully supported | |
| Attendance Records | TimeTracking / Punch Records1:1 | Mapping required | |
| Leave Balances | Time-Off / PTO1:1 | Mapping required | |
| Payroll / Compensation History | JobSubmission / Employee Custom Fields1:1 | Mapping required | |
| Recruitment / Candidates | Candidate1:1 | Mapping required | |
| Performance Reviews | Custom Object (PerformanceReview)lossy | Mapping required | |
| Users / Roles | User1:1 | Mapping required | |
| Custom Fields | Custom Fieldslossy | Mapping required | |
| Engagement / Recognition | Activity / Note1:1 | Mapping required | |
| Job Postings | JobOrder1:1 | Fully supported | |
| Documents / HR Files | ContentDocument (Attachment)1:1 | Not supported | |
| Workflows / Approvals | Workflow (not migrated)1: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.
Darwinbox gotchas
API access is privileged and request-only
Custom fields are tenant-specific and not in public schema
Attendance records require shift-policy alignment
Effective-dated compensation rows need careful sequencing
Document blobs are not accessible via public API
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 product selection
We audit the Darwinbox tenant across all modules in scope: employee count, organisational hierarchy depth, leave policy count and accrual rules, attendance record volume and shift-policy configuration, recruitment candidate volume and stage history, compensation history row count, performance review cycle data, and the full tenant-specific custom field registry. We pair this with a Bullhorn product-scope decision: whether the destination uses Bullhorn ATS only, Bullhorn ATS plus CRM, or the full Bullhorn HCM stack. The discovery output is a written migration scope document with record counts per object, a custom field inventory, a leave-policy mapping table, and a Bullhorn product recommendation.
Schema design and Candidate-Employee split rule
We design the destination Bullhorn schema including pre-creation of any custom objects (PerformanceReview__c, CompensationHistory__c), custom fields on Candidate and Employee objects, Corporate Structure hierarchy, and the Candidate-Employee split rule based on the customer's employment status taxonomy. Schema is deployed into a Bullhorn sandbox first for validation. We also map Darwinbox leave policy names to Bullhorn time-off accrual categories and Darwinbox shift policy references to Bullhorn time-tracking configuration during this step.
Sandbox migration and reconciliation
We run a full migration into a Bullhorn sandbox using a representative data volume. The customer's HR and recruiting leads reconcile record counts (Employees in, Candidates in, Leave balances in, Attendance records in, Compensation rows in, Performance reviews in), spot-check 25-50 records against the Darwinbox source, and sign off the schema, mapping, and split rule before production migration begins. Mapping corrections happen in sandbox, not in production.
User reconciliation and Bullhorn User provisioning
We extract every distinct Darwinbox user and match by email against the Bullhorn destination's User table. Users without a matching Bullhorn User record are placed in a reconciliation queue for the customer's Bullhorn admin to provision before record import resumes. Migration cannot proceed past this step because User references are required for activity ownership and role assignment on most Bullhorn records.
Production migration in dependency order
We run production migration in record-dependency order: Corporate Structure hierarchy first (establishing the org root), then Employees (as split into Bullhorn Employee records for active staff), then Candidates (for applicants and former employees), then Compensation history (as custom records linked to Employee), then Leave balances (as time-off entries), then Attendance punch records (after shift-policy mapping), then Performance reviews (as custom object records), then Recruitment data (JobOrders and Candidates with applicant history), then Activity history (recognition events via Bulk API), then custom field data. Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and handoff
We freeze Darwinbox 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 validate record counts, spot-check key employee and candidate records, and confirm leave balance totals and attendance record continuity. We deliver the workflow and automation inventory document and the document-migration manual checklist to the customer's admin team. We support a one-week hypercare window for reconciliation issues raised by the HR or recruiting team. We do not rebuild Darwinbox workflows, automations, or Bullhorn Compose sequences inside the migration scope; those are separate engagements.
Post-migration reporting and cleanup
We deliver a post-migration reconciliation report showing record counts by object, a list of any unmapped fields with reasons, a list of records placed in the reconciliation queue with resolution instructions, and the document metadata inventory. We recommend the customer's Bullhorn admin reviews record-level permissions, role assignments, and Bullhorn user-seat allocation post-migration. Any Bullhorn workflow or automation rebuild is scoped as a separate engagement with the inventory document as the starting brief.
Platform deep dives
Darwinbox
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 Darwinbox 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
Darwinbox: Enforced via Istio service mesh policies; specific quotas not publicly published.
Data volume sensitivity
Darwinbox exposes a bulk API — large-volume migrations stream efficiently.
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 Darwinbox to Bullhorn ATS & CRM migration scoping. Not seeing yours? Book a call.
Walk through your Darwinbox 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 Darwinbox
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.