HRMS migration
Field-level mapping, validation, and rollback between Personio and BambooHR. We move data and schema; workflows are rebuilt natively in BambooHR.
Personio
Source
BambooHR
Destination
Compatibility
11 of 12
objects map 1:1 between Personio and BambooHR.
Complexity
BStandard
Timeline
3-5 weeks
Overview
The Personio to BambooHR migration is primarily a records migration with three structural adjustments: absence category mapping between the two systems, compensation history preservation as effective-dated entries, and a manual extraction step for custom application form fields that Personio does not expose through its API. BambooHR organizes data around the Employee as the central record, mirroring Personio's model, but differs in absence entitlement display (BambooHR shows balances per type rather than a calendar view) and in recruiting structure (BambooHR Job Openings contain a single embedded candidate list rather than separate Position and Application objects). We sequence the migration with Employee as the first import object because all other records depend on its employee ID, resolve Departments before Contacts, and map Absence types individually before entitlements load. We do not migrate Personio Workflows, Approval Chains, or onboarding document templates as code; we deliver a written inventory of every active workflow and approval chain for the customer's HR admin to rebuild in BambooHR's workflow builder.
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 BambooHR, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Personio
Employee
BambooHR
Employee
1:1Personio Employee records map directly to BambooHR Employee. The employee's UUID from Personio is stored in a custom field bhr_legacy_id__c for reconciliation. BambooHR requires the Employee record to exist before any related objects (Absence, Documents, Compensation) can be imported, so we import Employees first and use the returned BambooHR employee ID as the foreign key for all dependent objects. We handle Personio's date-format inconsistencies (DD/MM and DD.MM by locale) by normalising all dates to ISO 8601 during extraction and validating numeric fields against expected ranges before load.
Personio
Department
BambooHR
Department
1:1Organisational hierarchy of departments exports from Personio as a flat or nested list depending on the customer's configuration. We map departments to BambooHR Departments before Employee import so that the department_id resolves at the time of Employee insert. BambooHR supports a flat department list; nested sub-departments in Personio map to the parent department in BambooHR with a note that hierarchical org chart visualisation is handled in BambooHR separately.
Personio
Absence
BambooHR
Time Off
lossyPersonio Absence records (vacation, sick leave, and other absence types) map to BambooHR Time Off entries. Each absence category in Personio must be mapped individually to a BambooHR Time Off type because the system-level type names differ between platforms. Entitlement balances export from Personio as effective-dated records and are created as accrual rules in BambooHR. We flag any absence categories that have no direct BambooHR equivalent (for example, special German leave types) and present a mapping table to the customer for confirmation before import.
Personio
Document
BambooHR
Employee File
1:1Employee documents (contracts, certificates, ID scans) stored in Personio are retrieved via the API and mapped to BambooHR Employee Files. Document naming conventions in Personio vary by company and by folder structure, so we flatten the hierarchy into a single file list per employee and map the Personio document category to a BambooHR file category label. Binary file content transfers directly. We flag any files that exceed BambooHR's size limits or use unsupported formats.
Personio
Recruiting Position
BambooHR
Job Opening
1:1Personio Recruiting Positions (job postings with department, location, status, and hiring manager metadata) map to BambooHR Job Openings. We map Personio's position status (open, paused, filled, cancelled) to BambooHR's Job Opening status equivalents. The hiring manager field resolves via the Personio manager UUID to the corresponding BambooHR employee record.
Personio
Application
BambooHR
Candidate
1:1Personio Applications (candidates linked to recruiting positions) map to BambooHR Candidates. The candidate's email address serves as the dedupe key during import. Standard application fields (name, email, phone, status, source) migrate directly. However, custom_attributes configured on Personio application forms are not accessible via any documented API endpoint, so we request the customer to enumerate these fields and their data during scoping, then create equivalent custom fields in BambooHR before applying the values. Without this step, custom candidate data is not transferred.
Personio
Compensation History
BambooHR
Pay / Compensation
1:1Personio stores salary, bonus, and compensation data as effective-dated entries per employee. We export the full compensation history with each effective_date preserved as a distinct record and insert all dated entries into BambooHR's pay history fields. BambooHR supports a single current compensation rate; historical entries are stored in a custom pay history table that we create as part of the schema. We flag any compensation components (allowances, equity, benefits in kind) that have no direct BambooHR field and present alternatives to the customer.
Personio
Benefits
BambooHR
Benefits
1:1Employee benefit enrolments (health insurance, pension, company car, etc.) stored against the Personio employee record map to BambooHR's Benefits section. Benefit types and coverage levels transfer directly. Any benefit plans requiring carrier-specific configuration (e.g., German private health insurance providers) are flagged as items requiring post-migration setup rather than data migration because BambooHR's benefit module handles enrolment rather than carrier-level detail.
Personio
Performance Review
BambooHR
Performance Review
1:1Personio Performance Reviews with their review cycle, status, ratings, and reviewer assignments map to BambooHR Performance Reviews. Review templates and custom form question text vary by company in Personio, so we export the review status and scores and note that BambooHR's review form builder requires the customer's HR admin to recreate the questionnaire structure. We preserve the reviewer assignment as a BambooHR reviewer relationship and carry over any written review text as notes.
Personio
Goal / OKR
BambooHR
Goal
1:1Personio Goals and OKRs with titles, descriptions, progress percentages, and employee linkages map to BambooHR Goals. Goal alignment hierarchies (company goals cascading to team and individual goals) do not have a direct BambooHR equivalent, so we flatten the hierarchy and link each goal to its contributing employee with the parent goal ID preserved in a custom field for reference. BambooHR's goal-tracking module does not support automatic cascade calculations.
Personio
Custom Attributes
BambooHR
Custom Fields
1:1Personio custom attributes on Employees, Positions, and Applications are detected via API schema introspection. We create matching custom fields in BambooHR before migration, preserving the Personio field label as the BambooHR field name. Data type mapping converts Personio field types (text, number, date, select, multiselect) to their BambooHR equivalents. Custom attributes on recruiting application forms require the customer to provide the enumeration separately because the Personio API does not expose them.
Personio
Workflow / Approval Chain
BambooHR
Workflow (not migrated)
1:1Personio absence approval chains, onboarding step workflows, and document signing approval sequences are not exposed via the API in a migration-ready format. We do not migrate workflow definitions. We deliver a written inventory of every active Personio workflow and approval chain with its trigger, conditions, actions, and assigned approver, which the customer's HR admin uses to rebuild equivalent automations in BambooHR's workflow builder. Onboarding document templates and e-signature workflows are listed separately as items requiring manual recreation.
| Personio | BambooHR | Compatibility | |
|---|---|---|---|
| Employee | Employee1:1 | Fully supported | |
| Department | Department1:1 | Fully supported | |
| Absence | Time Offlossy | Fully supported | |
| Document | Employee File1:1 | Fully supported | |
| Recruiting Position | Job Opening1:1 | Fully supported | |
| Application | Candidate1:1 | Fully supported | |
| Compensation History | Pay / Compensation1:1 | Mapping required | |
| Benefits | Benefits1:1 | Mapping required | |
| Performance Review | Performance Review1:1 | Fully supported | |
| Goal / OKR | Goal1:1 | Fully supported | |
| Custom Attributes | Custom Fields1:1 | Mapping required | |
| Workflow / Approval Chain | Workflow (not migrated)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.
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
BambooHR gotchas
Undocumented API rate limits can trigger 503 errors
Per-employee pricing model requires active record count verification
API credentials must be sent on every request to avoid extra round trips
Custom field schema varies per account and requires manual inventory
Document and attachment exports are not covered by standard report exports
Pair-specific challenges
Migration approach
Discovery and scoping
We audit the source Personio account across all active modules (HR Core, Recruiting, Performance, Payroll, Time Tracking), custom attributes on each object, active absence categories, recruiting pipeline stages, and document volume per employee. We confirm the BambooHR destination account settings including date format, time-off types, and any existing custom fields. The discovery output is a written migration scope covering which objects are in scope, which require manual data provision (custom application fields), and which are excluded (workflows, approval chains). We also confirm the Personio API credentials and whitelist the developer.personio.de endpoint in the connection configuration.
Custom field enumeration and schema creation
We enumerate all custom attributes in Personio via API schema introspection. For each custom attribute on Employees and Positions, we create a matching custom field in BambooHR. For custom application form fields on recruiting forms, we request the customer to provide the field list and sample data during this step because the Personio API does not expose them. We create a mapping table for absence categories, confirm each Personio type with its BambooHR equivalent, and set up accrual rules for entitlement balances. All schema changes are applied to BambooHR in a pre-migration validation pass.
Department and employee dependency resolution
We extract Departments from Personio first and create them in BambooHR before Employees so that department_id references resolve at import time. Employees are extracted second with all standard and custom fields, date formats normalised to ISO 8601, and numeric fields validated. We resolve the BambooHR employee ID for each Personio employee record and hold this mapping in a lookup table used for all subsequent dependent object imports. A reconciliation report compares the Personio employee count to the BambooHR insert count before proceeding.
Documents, absence, and compensation import
Employee documents transfer from Personio to BambooHR Employee Files using the employee ID lookup. Absence records load after employees with category-to-type mapping confirmed. Compensation history loads as effective-dated entries against each employee using the employee ID lookup, with historical entries stored in the custom pay history table and the most recent entry applied as the current compensation rate. Each phase emits a reconciliation report before the next phase begins.
Recruiting pipeline import
Personio Recruiting Positions export as Job Openings in BambooHR with status and hiring manager fields resolved. Candidates export from Personio Applications and import to BambooHR Candidates using email as the dedupe key. Standard fields transfer directly; custom application field values from the manually provided enumeration are applied to the corresponding BambooHR custom fields. The job opening to candidate linkage is preserved by matching the BambooHR Job Opening ID against the candidate's application history.
Performance, goals, and benefits import
Performance Reviews transfer with review cycle, status, ratings, and reviewer assignments. Written review text migrates as notes on the review record. Goals and OKRs transfer with titles, descriptions, progress, and employee linkages, with parent goal IDs preserved in a custom field. Benefits enrolments transfer as benefit type and coverage level entries. All records use the employee ID lookup from Step 3.
Cutover, validation, and workflow handoff
We freeze Personio writes during the cutover window, run a final delta migration of any records modified since the initial extraction, then set BambooHR as the system of record. We deliver the Workflow and Approval Chain inventory document to the customer's HR admin for rebuild in BambooHR's workflow builder. We support a one-week post-migration validation window where we resolve any reconciliation discrepancies raised by the customer's team. We do not rebuild Personio workflows as BambooHR automations within the migration scope; that work is a separate engagement.
Platform deep dives
Personio
Source
Strengths
Weaknesses
BambooHR
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 BambooHR.
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 BambooHR migration scoping. Not seeing yours? Book a call.
Walk through your Personio to BambooHR 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 BambooHR
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.