HRMS migration
Field-level mapping, validation, and rollback between E-Staff and Bullhorn ATS & CRM. We move data and schema; workflows are rebuilt natively in Bullhorn ATS & CRM.
E-Staff
Source
Bullhorn ATS & CRM
Destination
Compatibility
8 of 12
objects map 1:1 between E-Staff and Bullhorn ATS & CRM.
Complexity
CModerate
Timeline
2-4 weeks
Overview
E-Staff combines standard HR objects (Employee, Department, Payroll) with staffing-specific objects (Candidate, Placement, JobOrder, Client) in a single system, while Bullhorn separates its ATS schema (Candidate, JobOrder, Placement, ClientCorporation, ClientContact) from its HRMS and back-office modules. We map E-Staff's unified object model to Bullhorn's relational ATS schema by first auditing the full field inventory via CSV export, then routing each object to its Bullhorn equivalent. Custom fields added by the staffing agency are flagged during scoping and mapped explicitly, since E-Staff allows user-defined fields with no enforced naming convention and Bullhorn enforces type and edition limits per Custom Object. Effective-dated compensation and benefits rows from E-Staff migrate as custom fields on the Bullhorn Placement record with their original effective dates preserved. Bullhorn caps its REST API at 1,500 requests per minute, so we use batch chunking, exponential backoff, and parent-record lookup resolution throughout. Workflows, forms, and reports do not migrate; we deliver a written inventory of these 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 E-Staff 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.
E-Staff
Candidate
Bullhorn ATS & CRM
Candidate
1:1E-Staff Candidate records map directly to Bullhorn Candidate. E-Staff stores candidate contact info, skills, employment history, and staffing status in its Candidate object. We preserve the candidate's original record ID as a custom field e_staff_candidate_id__c for cross-system audit. Bullhorn's Candidate is the parent record for all subsequent JobSubmission and Placement objects, so it must insert first. E-Staff custom fields on Candidate are audited during scoping and mapped to Bullhorn standard fields or Custom Objects depending on Bullhorn edition limits.
E-Staff
JobOrder
Bullhorn ATS & CRM
JobOrder
1:1E-Staff JobOrder records map to Bullhorn JobOrder. JobOrder in Bullhorn represents an open req with fields for title, description, status, and pay/compensation range. The E-Staff job classification or skill requirement maps to Bullhorn's skills or custom fields. Bullhorn's JobOrder is the parent record for JobSubmission records, so it inserts before any candidate submission records. If E-Staff tracks multiple job statuses, we configure Bullhorn JobOrder Status values during the schema phase.
E-Staff
Placement
Bullhorn ATS & CRM
Placement
1:1E-Staff Placement records map to Bullhorn Placement. Placement is the core staffing transaction record representing a candidate placed at a client. E-Staff stores effective start date, end date, pay rate, bill rate, and assignment status in this object. We map effective-dated compensation rows as Bullhorn custom fields on the Placement record: placement_effective_date__c, placement_base_pay__c, placement_bill_rate__c, and placement_pay_rate__c preserve the staffing history audit trail. Bullhorn ATS Growth edition may have limited placement fields; Front Office Growth and Enterprise support Custom Objects for additional staffing attributes.
E-Staff
Client
Bullhorn ATS & CRM
ClientCorporation
1:1E-Staff Client records map to Bullhorn ClientCorporation. ClientCorporation is Bullhorn's company record representing the hiring client. The E-Staff client name, address, industry classification, and account manager fields map to Bullhorn ClientCorporation standard fields. ClientCorporation must insert before any Placement or JobOrder referencing it, so that the Bullhorn clientID foreign key resolves at migration time. If E-Staff stores client-specific custom fields (preferred industries, MSA status, tier classification), these map to Bullhorn ClientCorporation custom fields.
E-Staff
ClientContact
Bullhorn ATS & CRM
ClientContact
1:1E-Staff client contact records map to Bullhorn ClientContact. ClientContact represents the hiring manager or procurement contact at the client company. E-Staff stores contact name, email, phone, title, and relationship status in this object. We resolve the ClientCorporation reference by matching client name, then set the corporationID on ClientContact to the newly inserted Bullhorn ClientCorporation. ClientContact must insert after ClientCorporation to satisfy Bullhorn's required corporationID lookup.
E-Staff
Employee
Bullhorn ATS & CRM
Candidate
1:manyE-Staff Employee records (standard HRMS object) and Candidate records (staffing object) are distinct in E-Staff's unified schema. Both map to Bullhorn Candidate because Bullhorn uses Candidate to represent both temporary workers and direct-hire employees on the same record type. We split by E-Staff record type: Employee records flagged as internal staff map to Bullhorn Candidate with a custom field record_origin__c = 'E-Staff Employee'; Candidate records map with record_origin__c = 'E-Staff Candidate'. The origin field preserves the E-Staff object lineage for reporting.
E-Staff
Department
Bullhorn ATS & CRM
Department
1:1E-Staff Department records map to Bullhorn Department if the destination Bullhorn org includes Bullhorn Middle Office. Bullhorn Middle Office handles the back-office org structure including departments and cost centers. If the customer's Bullhorn deployment does not include Middle Office, we map Department to a Bullhorn custom field or flag it as out-of-scope for the admin to configure post-migration.
E-Staff
PayrollHistory
Bullhorn ATS & CRM
Placement custom fields
lossyE-Staff payroll history rows (effective-dated compensation records) do not map to a standalone Bullhorn object. Bullhorn stores payroll and timesheet data in Bullhorn Middle Office, which is a separate module from the ATS. We map effective-dated payroll rows to custom fields on the Bullhorn Placement record: effective_date__c, pay_rate__c, billing_rate__c, overtime_eligible__c. Each payroll row becomes a separate Placement insert with historical dates, preserving the compensation audit trail. Customers needing full payroll history in Bullhorn should consider adding Middle Office; we flag this as a separate scope recommendation during scoping.
E-Staff
Custom Fields
Bullhorn ATS & CRM
Custom Objects
lossyE-Staff allows user-defined custom fields with no enforced naming convention, so every E-Staff custom field must be audited, typed, and explicitly mapped during scoping. Bullhorn's Custom Object system requires Bullhorn Support to create each Custom Object, with field-type limits per object (up to 20 checkbox/dropdown/picker fields and up to 20 text fields). Bullhorn ATS Growth has 0 Custom Objects; Bullhorn ATS caps at 2; Front Office Growth and Enterprise allow 10 Custom Objects with 55 fields each. We pre-create the destination schema before migration, configuring Bullhorn Custom Objects via support ticket, and then map E-Staff custom field values into the typed Bullhorn fields. Any E-Staff custom fields that exceed Bullhorn's edition limit are flagged for the customer to either upgrade or consolidate into fewer Bullhorn standard fields.
E-Staff
Engagement (notes, calls, emails)
Bullhorn ATS & CRM
Task, Event, Note
1:1E-Staff engagement records (internal notes, call logs, email threads attached to a Candidate or Placement) map to Bullhorn Task, Event, and Note records. Call engagements map to Bullhorn Task with TaskSubtype = Call; email threads map to Bullhorn Task or Note depending on content type; internal recruiter notes map to Bullhorn Note. The Bullhorn REST API supports these as entity types with bulk insert capability. Parent-record resolution (linking tasks to the correct Candidate, JobOrder, or Placement) is resolved by matching E-Staff's foreign key references to the newly inserted Bullhorn IDs before each batch commits.
E-Staff
User (E-Staff staff accounts)
Bullhorn ATS & CRM
User (Bullhorn)
1:1E-Staff staff user accounts map to Bullhorn User records. We match by email address during the migration. Any E-Staff Owner referenced on Candidate, Placement, or JobOrder records is resolved to a Bullhorn User by email lookup before the referencing records insert. Owners without a matching Bullhorn User go to a reconciliation queue; the customer's Bullhorn admin provisions missing Users before record import resumes. Bullhorn supports active and inactive User states; we map the E-Staff active/inactive flag to the Bullhorn isActive field.
E-Staff
Candidate Status History
Bullhorn ATS & CRM
CandidateCustomObject or custom fields
lossyE-Staff tracks candidate status transitions (e.g., New, Screening, Interview, Placed, Archived) as audit rows or effective-dated fields. Bullhorn Candidate does not natively store status history as separate records. We map the current candidate status to Bullhorn's Candidate status field and store the most recent prior status in a custom field last_legacy_status__c. If the customer requires full status history for compliance or audit purposes and the Bullhorn edition supports Custom Objects, we create a CandidateCustomObject with status and effective_date fields for each transition row.
| E-Staff | Bullhorn ATS & CRM | Compatibility | |
|---|---|---|---|
| Candidate | Candidate1:1 | Fully supported | |
| JobOrder | JobOrder1:1 | Fully supported | |
| Placement | Placement1:1 | Fully supported | |
| Client | ClientCorporation1:1 | Fully supported | |
| ClientContact | ClientContact1:1 | Fully supported | |
| Employee | Candidate1:many | Fully supported | |
| Department | Department1:1 | Fully supported | |
| PayrollHistory | Placement custom fieldslossy | Fully supported | |
| Custom Fields | Custom Objectslossy | Mapping required | |
| Engagement (notes, calls, emails) | Task, Event, Note1:1 | Fully supported | |
| User (E-Staff staff accounts) | User (Bullhorn)1:1 | Fully supported | |
| Candidate Status History | CandidateCustomObject or custom fieldslossy | Fully 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.
E-Staff gotchas
Catalog URL refers to an unrelated US IT staffing agency (eStaff LLC, Texas)
Windows-desktop architecture complicates remote extraction
No public API — vendor-assisted exports are the norm
Russian-vendor sanctions/export-control screening
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 E-Staff schema audit
We extract the full E-Staff field inventory via CSV export, identifying every standard and custom field on Candidate, Placement, JobOrder, Client, ClientContact, Employee, Department, and PayrollHistory. We determine which objects carry business value for Bullhorn (staffing records migrate; internal-only HR records may be archived or flagged for the admin). We audit E-Staff's custom field naming, assign Bullhorn-compatible types, and map each to either a Bullhorn standard field, a Custom Object, or a custom field on the Placement record. We also extract engagement records and user accounts at this stage.
Bullhorn schema design and Custom Object provisioning
We design the destination Bullhorn schema based on the E-Staff audit. This includes identifying which Bullhorn edition the customer has licensed, provisioning Custom Objects via Bullhorn Support ticket (for Front Office Growth and Enterprise), and mapping E-Staff custom fields to typed Bullhorn fields. We configure JobOrder Status values, Candidate status picklists, and Placement record type defaults. Bullhorn edition limits are enforced at this stage: if E-Staff has more custom fields than Bullhorn ATS Growth can hold, we flag the edition upgrade requirement before proceeding.
Staging environment migration and reconciliation
We run a full migration into a Bullhorn Sandbox or staging environment using production-like data volume. The customer's operations lead reconciles record counts, spot-checks 25-50 Candidate, Placement, and JobOrder records against the E-Staff source, and validates that effective-dated compensation rows are represented as separate Placement inserts with historical dates. Any mapping corrections happen in staging, not in production. The staging run also surfaces missing User accounts (no matching Bullhorn user for a given E-Staff owner email) for the admin to provision.
Production migration in dependency order
We run production migration in record-dependency order: ClientCorporation (from E-Staff Client), then ClientContact (with corporationID resolved), then JobOrder (parent to JobSubmission), then Candidate (parent to Placement), then Placement (with ClientCorporationID and CandidateID resolved), then engagement history (Tasks, Events, Notes linked by foreign key to the newly inserted Bullhorn IDs). Payroll history rows insert as additional Placement records with their effective-dated custom fields. Each phase emits a row-count reconciliation report before the next phase begins. Bullhorn's 1,500 req/min API limit is managed via batch chunking and exponential backoff throughout.
Cutover, delta migration, and workflow inventory handoff
We freeze E-Staff writes during cutover, run a final delta migration of any records modified during the migration window, then designate Bullhorn as the system of record. We deliver the E-Staff workflow, form, and report inventory document to the customer's Bullhorn admin with a recommended Bullhorn Automation equivalent for each workflow entry. We support a one-week hypercare window to resolve reconciliation issues raised by the recruiting team. We do not rebuild E-Staff workflows as Bullhorn Automation inside the migration scope; that is a separate engagement or an internal admin task.
Platform deep dives
E-Staff
Source
Strengths
Weaknesses
Bullhorn ATS & CRM
Destination
Strengths
Weaknesses
Complexity grading
Moderate HRMS migration. 1 of 7 objects need a manual workaround.
Overall complexity
Moderate migration
Derived from compatibility, mapping clarity, API constraints, and data volume across E-Staff and Bullhorn ATS & CRM.
Object compatibility
1 of 7 objects need a manual workaround.
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
E-Staff: Not publicly documented.
Data volume sensitivity
E-Staff 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 E-Staff to Bullhorn ATS & CRM migration scoping. Not seeing yours? Book a call.
Walk through your E-Staff 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 E-Staff
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.