HRMS migration
Field-level mapping, validation, and rollback between Breathe and Bullhorn ATS & CRM. We move data and schema; workflows are rebuilt natively in Bullhorn ATS & CRM.
Breathe
Source
Bullhorn ATS & CRM
Destination
Compatibility
4 of 12
objects map 1:1 between Breathe and Bullhorn ATS & CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Breathe to Bullhorn is a cross-domain migration: Breathe is an internal HR platform built around the employee record, and Bullhorn is a recruitment ATS and CRM built around the candidate and placement lifecycle. There is no native object-to-object correspondence for most HR data types, so we design a mapping strategy during scoping that preserves the data that matters operationally and documents what cannot move as code. Breathe Employees map to Bullhorn Candidate records with employment dates, job title, and department transferred as standard or custom fields. Absence history (annual leave, sick leave, other) migrates as Bullhorn Task records linked to the Candidate, preserving dates, absence type, and approval status. Leave balance carry-forward is verified against the source entitlement settings and approval log rather than assumed from any pre-calculated balance field. Breathe custom fields on the Employee record map to Bullhorn custom fields on Candidate, which Bullhorn creates via Tools > Field Mappings. Documents (Company and Employee) cannot be bulk-exported from Breathe and must be individually downloaded; we provide a guided checklist and advise starting document archiving at scoping. Bullhorn does not have native onboarding workflow, absence management, performance review, or payroll modules — Breathe Learn completion records, onboarding task status, performance review cycles, and remuneration history require custom field or note-based storage in Bullhorn, or a rebuild in Bullhorn's optional Onboarding and Back Office products.
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 Breathe 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.
Breathe
Employee
Bullhorn ATS & CRM
Candidate
1:1Breathe Employees map to Bullhorn Candidate records as the primary record in the destination. We extract name, contact details (email, phone, address), job title, department, start date, employment status, and manager relationship from the People Data Export. In Bullhorn, Candidate is the central record for any individual — whether internal hire, contractor, or external candidate — so Breathe's employment data (start date, job title, status) maps to Candidate fields or custom fields. We pre-create any required Bullhorn custom fields via Tools > Field Mappings before migration. The Candidate's email address serves as the primary dedupe key during import.
Breathe
Custom Fields (Employee)
Bullhorn ATS & CRM
Custom Fields (Candidate)
lossyBreathe custom fields on the Employee record are extracted from the People Data Export with field name and value. Bullhorn creates custom fields via Tools > Field Mappings by typing 'custom' and pressing Enter to filter for all custom field options. We pre-create the destination custom field schema in Bullhorn during configuration, matching field names and selecting appropriate Bullhorn field types (text, number, date, picklist). Field type mapping is validated against the source data — for example, Breathe multi-select values map to Bullhorn multi-select picklist. Fields that do not map to a Bullhorn native type are stored as text with the original type noted for the customer's admin to restructure post-migration.
Breathe
Absence / Leave records
Bullhorn ATS & CRM
Task
1:manyBreathe absence records (annual leave, sick leave, other absence types) map to Bullhorn Task records linked to the Candidate. Each absence entry generates one Task with TaskType or a custom absence-type field indicating the absence category, the original absence date as ActivityDate, and the approval status preserved in a custom field. Bullhorn does not have a native absence management module, so this mapping preserves the historical absence data in the candidate record for audit purposes but does not replicate Breathe's balance calculation engine. We flag this as a limitation and recommend the customer evaluate Bullhorn's optional absence management features or a third-party HR integration if active leave tracking is required post-migration.
Breathe
Leave balance carry-forward
Bullhorn ATS & CRM
Custom fields on Candidate
lossyBreathe leave balances are calculated internally from entitlement settings and approval records. We extract entitlement settings and approval records independently from the People Data Export, compute expected leave balances at the migration cutover date, and compare against any pre-calculated balance fields before loading. Verified balances are stored as custom fields on the Candidate record in Bullhorn. Because Bullhorn does not have a native leave balance engine, these values are static at migration cutover — the customer's admin must configure any ongoing balance tracking in Bullhorn or a connected absence management tool.
Breathe
Sickness records
Bullhorn ATS & CRM
Task (sickness type)
1:manyBreathe sickness entries — a distinct record type linked to employees with dates, reasons, and Fit Note references — map to Bullhorn Task records with a sickness-specific custom field indicating absence type and a separate custom field carrying Fit Note reference where present. Sickness records are migrated as a separate task sequence from other absence types to allow the customer's admin to filter and report on sickness history independently in Bullhorn.
Breathe
Onboarding
Bullhorn ATS & CRM
Task (checklist)
1:manyBreathe onboarding task lists and completion status migrate as Bullhorn Task records linked to the Candidate, with the original task name, due date, and completion status preserved in custom fields. Bullhorn's optional paid Onboarding product is not activated by default; we document the onboarding task structure so the customer's admin can decide whether to rebuild it natively in Bullhorn Onboarding or continue managing it as a task checklist. This is a configuration decision, not a direct automation migration.
Breathe
Performance reviews
Bullhorn ATS & CRM
Note or Custom Object
lossyBreathe performance review module exports include review cycle, template, ratings, and reviewer comments. Bullhorn does not have a native performance review object. We store review history as Bullhorn Note records with rich text for comments and custom fields for rating scores and review dates, or we create a Bullhorn custom object for performance review if the customer's data volume warrants the schema complexity. The customer chooses the storage strategy during scoping. Bullhorn's Note object supports ContentDocumentLink for any supporting documents from the review.
Breathe
Remuneration / Payroll data
Bullhorn ATS & CRM
Placement (custom fields) or Custom fields on Candidate
lossyBreathe Remuneration Report and Payroll Export data (salary, additional payments, benefits, auto-enrolment status) is extracted as structured records. Bullhorn Placement records carry bill rate, pay rate, start date, and end date for temporary workers, which maps cleanly for staffing firms with placement-based pay. For permanent employee salary data with no placement context, we store remuneration fields as custom fields on the Candidate record. The customer confirms during scoping whether the migration is for a staffing firm (placement-centric) or a company using Breathe for internal HR (salary on Candidate). Bullhorn Back Office product may be relevant for ongoing payroll integration but is out of migration scope.
Breathe
Company documents
Bullhorn ATS & CRM
ContentDocument
1:1Breathe Company-level documents (policies, handbooks, templates) are stored in a separate silo from employee documents and cannot be bulk-exported via API. We document the manual download steps for the customer (Company > Company documents section) and provide a checklist. Downloaded documents are stored locally and handed to the customer for manual upload into Bullhorn as ContentDocument records, linked to the relevant ClientCorporation or Candidate. Bullhorn's package deployment or REST API can handle bulk document attach if the customer provides a named file inventory.
Breathe
Employee documents
Bullhorn ATS & CRM
ContentDocument
1:1Breathe Employee documents (contracts, ID copies, certification records) are stored in the Profile > More > Documents section with no bulk export API. We flag this as a high-severity manual step in the scoping checklist and advise the customer to begin document downloads at the start of the engagement. Documents downloaded from Breathe are handed to the customer for manual upload into Bullhorn, where they attach via ContentDocumentLink to the corresponding Candidate record. This is a manual step that adds time to the overall migration timeline depending on document volume.
Breathe
Breathe Learn completion records
Bullhorn ATS & CRM
Not migrated
lossyBreathe Learn completion records (GDPR awareness, health and safety compliance training) may not be included in the standard People Data Export if the customer is on a lower Breathe tier or if Learn is an add-on module. We perform a pre-migration data audit against the customer's module list and flag any Learn records that require additional extraction. Bullhorn does not have a native learning management system; completion records can be stored as Note records on the Candidate or as a custom object if the customer requires auditable compliance history in Bullhorn. This is a configuration decision documented during scoping.
Breathe
Owner (Breathe user)
Bullhorn ATS & CRM
User (Bullhorn)
1:1Breathe owners (HR administrators, line managers) referenced on employee records are resolved by email match against Bullhorn User records in the destination. We extract all distinct owner IDs and emails from the source export and cross-reference against Bullhorn User. Owners without a matching Bullhorn User are placed in a reconciliation queue for the customer's admin to provision before record import resumes, because Bullhorn requires a valid OwnerId on Candidate and related Task records.
| Breathe | Bullhorn ATS & CRM | Compatibility | |
|---|---|---|---|
| Employee | Candidate1:1 | Fully supported | |
| Custom Fields (Employee) | Custom Fields (Candidate)lossy | Fully supported | |
| Absence / Leave records | Task1:many | Fully supported | |
| Leave balance carry-forward | Custom fields on Candidatelossy | Fully supported | |
| Sickness records | Task (sickness type)1:many | Fully supported | |
| Onboarding | Task (checklist)1:many | Mapping required | |
| Performance reviews | Note or Custom Objectlossy | Mapping required | |
| Remuneration / Payroll data | Placement (custom fields) or Custom fields on Candidatelossy | Mapping required | |
| Company documents | ContentDocument1:1 | Not supported | |
| Employee documents | ContentDocument1:1 | Fully supported | |
| Breathe Learn completion records | Not migratedlossy | Fully supported | |
| Owner (Breathe user) | User (Bullhorn)1:1 | 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.
Breathe gotchas
No bulk document export — manual download required
No direct migration path between Breathe accounts
People Data Export may omit data in non-standard modules
Leave balance carry-forward requires manual verification
Tier-gated features may limit export coverage
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 module audit
We audit the source Breathe account across tier (Starter, Professional, Enterprise), active modules, custom fields, absence history volume, performance review data, onboarding task structure, and remuneration report availability. We pair this with a Bullhorn scope review — which Bullhorn tier (Starter at $99/user, Core at $165/user, or Pro with custom pricing), whether the optional Onboarding or Back Office products are in scope, and how many Bullhorn users will be provisioned. The discovery output is a written migration scope confirming which Breathe data types migrate, which require custom storage design in Bullhorn, and which are manual handoffs.
Document archive initiation
We provide the customer with a step-by-step checklist for the Breathe Company and Employee document download process and advise starting this work immediately. Document download is a manual, parallel activity that does not require migration engineering but does affect overall timeline. We track completion of the document checklist as a dependency before the Bullhorn ContentDocument upload phase begins.
Bullhorn schema design and custom field pre-creation
We design the Bullhorn destination schema before any data moves. This includes pre-creating all custom fields on the Candidate object via Tools > Field Mappings (typing 'custom' and pressing Enter to filter the entity list), designing the custom absence-type field on Task, designing the performance review storage strategy (Note or custom object), and confirming the remuneration field placement (Placement custom fields for staffing firms, Candidate custom fields for permanent-hire customers). Schema is validated in a Bullhorn sandbox or test org before production migration begins.
Leave balance verification
We extract Breathe entitlement settings and approval records independently, compute expected leave balances at the migration cutover date, and compare against any pre-calculated balance fields in the export. Discrepancies are flagged to the customer for confirmation before balances are loaded into Bullhorn custom fields. This step is scoped separately for customers with complex entitlement structures or multiple leave policies.
Sandbox migration and reconciliation
We run a full migration into a Bullhorn sandbox using production-like data volume. The customer's Bullhorn admin reconciles record counts (Candidates in, Tasks in by type, Notes or custom object records in), spot-checks 25-50 random records against the Breathe source, and validates the absence history task chain and leave balance custom fields. Any mapping corrections and Bullhorn validation rule issues are resolved in sandbox before production migration begins.
Production migration in dependency order
We run production migration in record-dependency order: Bullhorn Users (validated against the Breathe owner list), Candidate records (with custom fields pre-created), Task records for absence history (linked to Candidate by email match), onboarding Task checklist (linked to Candidate), performance review Notes or custom object records, and remuneration data on Placement or Candidate custom fields. Each phase emits a row-count reconciliation report before the next phase begins. Document upload into Bullhorn ContentDocument follows as a manual step by the customer, with a named file inventory provided by FlitStack AI.
Cutover, validation, and admin handoff
We freeze Breathe write access during cutover, run a final delta migration of any records modified during the window, then enable Bullhorn as the system of record. We deliver a written inventory of any Breathe modules not migrated (automations, onboarding workflow definitions, Breathe Learn completion records) with recommendations for Bullhorn alternatives. We support a one-week hypercare window for reconciliation issues. We do not rebuild Breathe onboarding workflows as Bullhorn Onboarding configurations or performance review processes as Bullhorn native features inside migration scope; these are separate configuration engagements.
Platform deep dives
Breathe
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 Breathe 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
Breathe: Not publicly documented.
Data volume sensitivity
Breathe 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 Breathe to Bullhorn ATS & CRM migration scoping. Not seeing yours? Book a call.
Walk through your Breathe 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 Breathe
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.