HRMS migration
Field-level mapping, validation, and rollback between Personio and Bullhorn ATS & CRM. We move data and schema; workflows are rebuilt natively in Bullhorn ATS & CRM.
Personio
Source
Bullhorn ATS & CRM
Destination
Compatibility
5 of 12
objects map 1:1 between Personio and Bullhorn ATS & CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Personio and Bullhorn serve fundamentally different buyers. Personio is an all-in-one HRIS for European SMEs managing internal employees, payroll, and light recruiting. Bullhorn is a purpose-built ATS and CRM for staffing and recruitment agencies managing external candidates across client job orders. The migration from Personio to Bullhorn is a recruiting-focused data move, not a full HRIS replacement. We extract active recruiting Positions, their associated Applications, and Candidate records from Personio, then map them into Bullhorn's Candidate, ClientCorporation, and JobOrder entities. Employee records that represent internal staff (not recruiting pipeline) do not have a direct Bullhorn equivalent and are flagged for manual entry or a separate HRIS implementation. Absence records, performance reviews, goals, and compensation history from Personio are evaluated individually against Bullhorn's data model; most have no standard Bullhorn object and are noted in the written inventory for the customer to handle separately. Bullhorn's Custom Objects are supported via the REST API but must be pre-provisioned through Bullhorn Support before migration begins. Workflows, approval chains, absence request automations, and custom application form attributes not exposed by the Personio API do not migrate; we deliver a written inventory for the customer's Bullhorn admin to 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 Personio 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.
Personio
Recruiting Position
Bullhorn ATS & CRM
JobOrder
1:1Personio Recruiting Positions map to Bullhorn JobOrder. The position's title, department, location, status (open/closed/hired), and hiring manager map to Bullhorn's title, clientCorporation (created from the company's own ClientCorporation record or a designated internal client), address, status, and assignedUser fields. We flag any Personio position that represents an internal role (not a client engagement) as requiring a separate Bullhorn client structure or manual categorization. JobOrder custom fields are available via Bullhorn REST API for any Personio custom position attributes.
Personio
Application
Bullhorn ATS & CRM
Candidate
1:1Personio Applications map to Bullhorn Candidate records. Each application is a distinct Candidate record with its own application history (status, applied date, interview notes). The Personio candidate's name, email, phone, and resume link map to Bullhorn Candidate fields. We link each Candidate to the target JobOrder via a JobSubmission record. Active applications migrate as Candidates with a current JobSubmission; historical applications migrate as Candidates with a closed JobSubmission preserving the original outcome.
Personio
Employee
Bullhorn ATS & CRM
Candidate or User (split by use case)
1:manyPersonio Employees do not map 1:1 to Bullhorn Candidates because Personio manages internal staff and Bullhorn manages external candidates. If the migration scope includes existing employees who will be placed by the agency, we create Bullhorn Candidate records with an internal-employee flag (via customObject1 or a custom field). If the agency's own staff records need to exist in Bullhorn for system administration or internal recruiter tracking, we create Bullhorn User records and link them as assignedUser on JobOrder. We define the split rule during scoping based on whether the agency uses Bullhorn to manage its own headcount or only external candidate pipelines.
Personio
Employee Document (Contract, Certificate, ID)
Bullhorn ATS & CRM
Candidate Attachment via ContentDocumentLink
lossyPersonio employee documents (contracts, certificates, ID scans) retrieve via the Personio API as binary blobs or download URLs. We download each document, rename it with a consistent convention (CandidateName_DocumentType_Date), and upload to Bullhorn as a ContentDocument linked via ContentDocumentLink to the associated Candidate record. Document naming and folder structures in Personio vary by company configuration, so we flatten them into a flat list with descriptive filenames at the destination. Resume files map to the Candidate's primary resume field in Bullhorn.
Personio
Absence Record
Bullhorn ATS & CRM
Note or Custom Object
1:1Personio absence records (vacation, sick leave, other absence types) have no native equivalent in Bullhorn ATS. Bullhorn does not include an absence management module. We evaluate each absence type during scoping: if absence data is relevant to the staffing context (e.g., a candidate's availability or a contractor's leave history), we map it to a Bullhorn Custom Object (customObject1) with fields for absence type, start date, end date, and status. If absence data is internal HR data unrelated to the staffing pipeline, we exclude it from the migration scope and note it in the written inventory for the customer's HR admin.
Personio
Performance Review
Bullhorn ATS & CRM
Note or Custom Object
1:1Personio performance review records (review cycle, ratings, scores, status) have no standard Bullhorn equivalent. Bullhorn is not an HR performance management platform. We map performance review status and overall rating to a Bullhorn Custom Object attached to the Candidate record if the agency needs to preserve historical performance data for placement decisions. Review form question text and competency ratings that require free-text storage are noted as out-of-scope for migration and documented for manual re-entry or a separate performance tool implementation.
Personio
Payroll Record
Bullhorn ATS & CRM
Not Migrated
lossyPersonio payroll records (salary, bonus, compensation, effective-dated pay changes) are out of scope for Bullhorn migration. Bullhorn ATS does not include payroll functionality and is not a replacement for a payroll system. If the agency needs to track pay rate information for contractors or placed candidates, we map the most recent pay rate to a Bullhorn Custom Object field (customObject1 payRate or billingRate) rather than a full payroll history. Full payroll records remain in Personio or migrate to a dedicated payroll platform separately.
Personio
Goal and OKR
Bullhorn ATS & CRM
Not Migrated
lossyPersonio company-level goals and individual employee OKRs have no Bullhorn equivalent and are not migrated. Bullhorn does not include a goal-management or OKR module. If the agency's recruiting team uses goals and objectives as part of recruiter performance tracking, we document the existing goal structure in the written inventory for manual reconfiguration in Bullhorn or a separate performance management tool. Goal alignment hierarchies from Personio are noted as not transferable.
Personio
Department and Org Structure
Bullhorn ATS & CRM
ClientCorporation or Note
1:1Personio organizational departments and sub-departments map to Bullhorn ClientCorporation records if they represent external client organizations in the staffing pipeline. If the department structure represents the agency's internal org chart (internal recruiters, sales teams), we document it separately rather than importing it as Bullhorn ClientCorporations, since those records are semantically reserved for external recruiting clients.
Personio
Custom Attributes (Recruiting Position)
Bullhorn ATS & CRM
Custom Fields on JobOrder
lossyPersonio custom attributes on Recruiting Positions migrate to Bullhorn JobOrder custom fields. Bullhorn supports custom fields on JobOrder via the REST API (fields such as customText1, customText2, customDate1). We pre-create the field mapping during scoping by querying the Personio Position schema for custom attributes and matching them to Bullhorn field types (text, date, number, dropdown). Bullhorn custom fields on standard entities are client-configurable without Support involvement.
Personio
Custom Attributes (Application Form)
Bullhorn ATS & CRM
Custom Object or Custom Fields on Candidate
lossyPersonio custom_attributes on job application forms cannot be retrieved via any documented Personio API endpoint according to community reports. During migration scoping, we explicitly ask the customer to provide the complete list of custom application form fields and their data values. We map these to Bullhorn Custom Object fields attached to the Candidate record or to Candidate custom fields if the number of attributes is small. Without this step, custom candidate data will be missed and not transferred. This is one of the highest-severity pair-specific gotchas for the migration.
Personio
Benefit Enrollment
Bullhorn ATS & CRM
Not Migrated
lossyPersonio employee benefit enrollments (health insurance, pension, company benefits) are out of scope for Bullhorn migration. Bullhorn ATS does not include a benefits administration module. If the agency manages benefits information for contractors (e.g., health insurance tier for W-2 contractors), we map the most recent benefit type and coverage level to a Bullhorn Custom Object. Full benefits history and carrier-specific details require a separate HRIS or benefits administration platform.
| Personio | Bullhorn ATS & CRM | Compatibility | |
|---|---|---|---|
| Recruiting Position | JobOrder1:1 | Fully supported | |
| Application | Candidate1:1 | Fully supported | |
| Employee | Candidate or User (split by use case)1:many | Fully supported | |
| Employee Document (Contract, Certificate, ID) | Candidate Attachment via ContentDocumentLinklossy | Fully supported | |
| Absence Record | Note or Custom Object1:1 | Fully supported | |
| Performance Review | Note or Custom Object1:1 | Fully supported | |
| Payroll Record | Not Migratedlossy | Fully supported | |
| Goal and OKR | Not Migratedlossy | Fully supported | |
| Department and Org Structure | ClientCorporation or Note1:1 | Fully supported | |
| Custom Attributes (Recruiting Position) | Custom Fields on JobOrderlossy | Fully supported | |
| Custom Attributes (Application Form) | Custom Object or Custom Fields on Candidatelossy | Fully supported | |
| Benefit Enrollment | Not Migratedlossy | 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.
Personio gotchas
GET Employees API rate limit of 300 req/min
Custom attributes on recruiting application forms not in API
Domain migration from .de to .com but API stays on .de
Date and number format inconsistencies by locale
Recruiting report figures are not always accurate
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
Scoping and data inventory
We audit the source Personio account across modules in scope (Recruiting, Employee Records, Absences, Documents). We extract a full list of Recruiting Positions, Applications, and Employee records with their current status and modification timestamps. We specifically enumerate custom_attributes on application forms by asking the customer to provide the form field list. We review Bullhorn destination edition (Bullhorn ATS, Growth, or Enterprise) and confirm Custom Object entitlements per the edition. The scoping output is a written migration scope document listing every object to be migrated, excluded, or handled manually.
Custom Object pre-provisioning and schema design
We submit the Bullhorn Custom Object Setup Sheet to Bullhorn Support for any Custom Objects required for absence, performance, pay rate, or custom application data. This step begins at project kickoff because provisioning takes 3-5 business days. In parallel, we design the destination Bullhorn schema: JobOrder fields (standard plus any custom fields for position attributes), Candidate fields (standard plus any custom fields for application data), and Custom Object field definitions. Bullhorn custom fields on standard entities (JobOrder, Candidate) are self-service via Admin > Field Mappings and do not require Support.
Sandbox migration and reconciliation
We run a full migration into a Bullhorn Sandbox environment using production-like data volume. The customer's Bullhorn admin reconciles record counts (Candidates in, JobOrders in, JobSubmissions in), spot-checks 25-50 randomly selected records against the Personio source, and verifies that custom field values, application statuses, and document attachments are correctly placed. Any mapping corrections — particularly the Employee-to-Candidate or Employee-to-User split rule — are validated here before production migration begins.
Document extraction and attachment preparation
We download all employee documents from Personio (contracts, resumes, ID scans, certificates) via the Personio API document endpoints. Each file is renamed with a FlitStack AI-standard convention (CandidateName_DocumentType_Date.ext) and mapped to a Bullhorn ContentDocument record linked via ContentDocumentLink to the target Candidate. Resume files are mapped to the Candidate's primary resume field. Any document that cannot be retrieved (access-restricted files, deleted records) is logged in the exclusion report.
Production migration in dependency order
We run production migration in record-dependency order: ClientCorporation records (for external client job orders if applicable), JobOrder records (from Personio Recruiting Positions), Candidate records (from Personio Applications and Employees), JobSubmission records (linking Candidates to JobOrders), then custom attribute data into Bullhorn Custom Objects. Documents are uploaded in parallel with record migration. Each phase emits a row-count reconciliation report. We use Bullhorn's REST API with exponential backoff and batch chunking to stay within Bullhorn's rate limits and avoid 429 errors.
Cutover, validation, and workflow rebuild handoff
We freeze Personio recruiting 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 written workflow and automation inventory to the customer's Bullhorn admin team along with the custom application form attributes exclusion report. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's recruiting team. Workflow rebuilds, Bullhorn Automation setup, and absence management configuration are outside standard migration scope and are flagged as separate engagements.
Platform deep dives
Personio
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 Personio 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
Personio: 300 requests per minute on GET Employees endpoint; 15 req/s burst.
Data volume sensitivity
Personio 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 Personio to Bullhorn ATS & CRM migration scoping. Not seeing yours? Book a call.
Walk through your Personio 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 Personio
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.