ATS & HRMS migration guide

The Definitive Guide to Migrating to BambooHR

BambooHR is a small-and-mid-market HRIS whose import model rewards teams that pre-define employment statuses, list field values, and access levels before a single employee row is uploaded.

22 min read 9 sections Updated May 27, 2026
BambooHR
Employees
Compensation
Benefits
Time Off
Org Structure
Performance

Inside this guide

What you'll learn, section by section

  1. 01

    Why teams migrate to BambooHR

    The four shapes a BambooHR migration takes, and what makes the platform easier — or harder — than the category average.

  2. 02

    The BambooHR data model you need to map into

    Employees, tables, custom fields and access levels — the destination schema decoded.

  3. 03

    Pre-migration prep — the work before you touch BambooHR

    What must be true on the source, the destination, and across the team before the first row hits the Import Tool.

  4. 04

    Import mechanisms: UI wizard, CSV, and programmatic loads

    Multiple paths in, each with different limits and shapes. Picking the wrong one is how mid-migrations stall at scale.

  5. 05

    Mapping your data into BambooHR

    The longest section — because field mapping is where almost every migration that fails actually breaks.

  6. 06

    The pitfalls that derail BambooHR migrations

    Eight specific failure modes — ranked by impact, each tied to the exact BambooHR mechanism that breaks.

  7. 07

    Validation and cutover

    What to verify after the import job, in what order — and how to fail safely when something is wrong.

  8. 08

    Migration partners and tools

    Implementation specialists, iPaaS vendors, in-house onboarding — what each is good for and how to choose.

  9. 09

    Frequently asked questions

    The eight questions every BambooHR migration team works through before they sign the scope.

Section 01

Why teams migrate to BambooHR

The four shapes a BambooHR migration takes, and what makes the platform easier — or harder — than the category average.

BambooHR LLC was founded by Ben Peterson and Ryan Sanders in 2008 and is headquartered in Lindon, Utah 1. The platform began as a small-business HRIS and has since added an applicant tracking system, performance management, time tracking, benefits administration, and a US-focused payroll product, all sitting on top of a single employee record.

The typical BambooHR customer is a US-based company between 25 and 1,500 employees that wants a single source of truth for employee data without standing up a Workday-class implementation team. Pricing shifts from a flat $250/month under 25 employees to a per-employee-per-month model above that, with payroll, time tracking, performance, and benefits administration each priced as add-ons.

The shapes of migration that actually land on BambooHR tend to fall into four patterns. First, spreadsheet exits: a growing company replacing Google Sheets, Excel and a Dropbox folder of signed PDFs with a real employee system of record. Second, legacy HRIS replacements — Paychex Flex, ADP Workforce Now, Paylocity, UKG Ready, Zenefits, Gusto-only setups — driven by total cost of ownership or admin overhead.

Third, upmarket-tool downgrades — a company that bought Workday, UKG Pro or SAP SuccessFactors for a future it never reached, scaling back to a system its HR team of two can actually operate. Fourth, M&A integration, where an acquired entity runs on a different HRIS. A spreadsheet exit usually has clean scope but no historical audit trail; a Workday exit has rich history that does not move across.

What makes migrating *to* BambooHR easier than the category average is the CSV importer itself — a single Import Tool sits inside the product, accepts Excel and CSV files, and lets HR admins map columns against the BambooHR field dictionary without code 4. Custom Dashboards on the Elite tier can ingest CSV uploads up to 500,000 rows per dataset 5.

What makes it harder than the average is the lack of any undo button on the Import Tool — every official BambooHR training begins with that warning 46 — and the fact that historical tables for compensation, job info and employment status are effective-dated, so loading a single current row erases the timeline you might have spent two weeks reconstructing in Excel.

Time Off accruals, performance review cycles, document templates and workflow automations do not import — they are rebuilt inside the product after the employee data lands. Teams that scope for that work up front finish on time; teams that assume parity do not.

Teams that scope for the rebuild work up front finish on time; teams that assume parity do not.

Section 02

The BambooHR data model you need to map into

Employees, tables, custom fields and access levels — the destination schema decoded.

BambooHR platform Contacts Companies Deals Tickets Tasks Notes
Standard objects orbit the platform; every association can be many-to-many with optional labels.

BambooHR is built around a single root object — the Employee — with a set of tabular sub-tables hanging off it for data that changes over time. Most other concepts in the platform are either fields on the employee, rows on one of those tables, or related objects (time off, files, goals) keyed by employee ID.

Before you can map a field on the source side, you need to know exactly which destination table the row belongs on, what fields it requires, and which value will serve as the matching key. The table below summarises the objects you will touch in a typical migration.

Object Stores Required on import Tier
Employees The root record — personal info, employment status, contact details First name, last name, employee number or work email All tiers
Job Info table Effective-dated rows for job title, department, division, location, supervisor Effective date, job title (one row per change) All tiers
Compensation table Effective-dated salary, pay rate, pay schedule, change reason Effective date, pay rate, pay type (Salary/Hourly) All tiers
Employment Status table Effective-dated rows for Active, Leave, Terminated and custom statuses Effective date, employment status All tiers
Time Off categories + balances PTO, sick, vacation, parental — policies, accruals, requests, balances Category name, policy, accrual settings (set per company) Core (advanced policies on Advantage+)
Performance (Goals, Assessments) Goals, self/manager/peer assessments, 360 feedback Employee ID; review cycle defined first Performance Management add-on
Employee Files Per-employee documents organised by file section/category Employee ID, file section ID, file binary All tiers; 1 GB / employee storage allowance
Hiring (ATS) Jobs, candidates, applications, hiring stages, feedback Defined separately; not part of core employee import Hiring add-on
Custom Tables Per-employee multi-row data (Education, Certifications, Licenses) Effective or table date, defined columns All tiers; per-account custom-table count varies by plan

The Employee record is the canonical primary key for the whole system — BambooHR assigns a numeric Employee ID on creation, and every file upload and table row is keyed by it 7. The Import Tool can also match on a custom Employee # field, work email, or SSN if you flag the column as the unique identifier during mapping — rows with the same value collapse into one record 4.

Effective-dated tables — Job Info, Compensation, Employment Status, plus any Custom Tables — are the most consequential modelling decision in a BambooHR migration. Each row carries an effective date and BambooHR uses the most recent row as the *current* value while preserving the timeline behind it 7. Load one row and you lose the history; load every dated row and the profile reconstructs every promotion, raise and leave on day one.

Custom fields are added in Settings → Account → Customize → Tabs/Fields, with a fixed set of supported types: text, multi-line text, number, currency, percentage, date, single-select list, checkbox, employee, email, EIN, country, state 8. List-type fields store internal values that must exist in the field's option set before import — adding a value via the Import Tool fails, so you pre-create options through the Customize UI 89.

Field type Limits Notes
Text / multi-line text Free-form string Use sparingly — text fields cannot be reported on as enums
Number / currency / percentage Numeric, period decimal Currency uses period as decimal point; no thousands separators 8
Date yyyy-mm-dd ISO format required for programmatic loads; UI rewrites locale-specific values 8
List (single-select) Option set defined first Import fails if the value isn't in the option list 8
Checkbox / bool yes / no / true / false Case-insensitive on import; everything else defaults to unchecked
Country / state Must match BambooHR country list Use full country name ("United States"), not ISO codes 8
Employee (lookup) References another employee Used for supervisor / manager fields; resolves to Employee ID
Custom Tables Per-account cap; rows per employee unlimited Education, Certifications, Licenses, custom multi-row data

Relationships in BambooHR are modelled implicitly. The org chart is derived from the Supervisor (Reports To) field on each employee, which must resolve verbatim to another employee's record — name-based matching is the default, but Supervisor Email or a Supervisor ID calculated field is more reliable for hierarchy builds 10. Every employee needs a supervisor except the top-level leader, whose Reports To is left blank to mark the tree's root 10.

Access Levels — Account Owner, Full Admin, HR Admin, Manager, Employee and optional Custom Access Levels — control which fields and tables each user can view and edit, and are configured under Settings → Access Levels 11. Access Levels must exist before the user accounts they will be assigned to; otherwise newly imported employees default to the standard Employee access level with no way to see compensation, performance or document data even on their own profile.

Section 03

Pre-migration prep — the work before you touch BambooHR

What must be true on the source, the destination, and across the team before the first row hits the Import Tool.

The single best predictor of a clean BambooHR migration is how much work you do on the source side before the first import button is pressed. BambooHR's own Import Tool training warns explicitly that the tool has no undo button 4, and the fix is almost always pre-processing rather than post-cleanup.

The Import Tool has no "undo" button — you must watch the training and go through the Import Tool Tutorial before using it.

— BambooHR Partner Import Tool Training

Treat the source export as raw material that needs to be shaped to BambooHR's expected formats — dates rewritten to yyyy-mm-dd, currency stripped of thousands separators, country names spelled out, list-field values aligned to BambooHR's option sets, and every supervisor pointer resolved to an actual person in the file.

Source-side prep

  • Audit and dedup the source database before export. Two employee rows with the same work email or SSN collapse into one record on import and the wrong row may win — sort by hire date and termination date and pick a single source of truth per person.
  • Normalise dates to yyyy-mm-dd for every column the importer will touch — date of birth, hire date, termination date, every Job Info / Compensation / Employment Status row 8. The Import Tool tolerates a few formats; programmatic loads require strict ISO.
  • Convert list values for every dropdown field — Employment Status, Department, Division, Location, Job Title (if you keep it as a list), EEO Job Category, marital status, custom lists. Each value must already exist in the BambooHR option set or the row is rejected 89.
  • Stamp a stable Employee # on every record in the source export — a UUID, source primary key, or the existing HRIS employee ID — so re-runs match deterministically and the original audit trail is reachable post-cutover.
  • Decide what is in scope for historical compensation, job info and employment status. Each effective-dated row counts as one row in the import file, and re-creating ten years of raise history for 500 employees is a 50,000-row Compensation file even before you touch demographics.

Destination-side prep

  • Customise the schema first. Walk every Tab and every Field under Settings → Account → Customize → Tabs/Fields and add the custom fields, custom tables, and list option values you intend to map to — the Import Tool maps to fields that already exist 4.
  • Pre-create Employment Statuses that match your real workforce — Active, Inactive, Leave of Absence, Terminated, plus any custom status (Contractor, Intern, Seasonal). Statuses tie to ACA Status Category calculation and to whether the employee shows up in directory / payroll 8.
  • Build Time Off categories and policies before importing balances — category name (Vacation, Sick, PTO, Parental Leave), accrual policy, carryover rules, holiday calendar. Balances are imported as a separate file once the categories and policies are in place.
  • Provision Access Levels before users — Account Owner, Full Admin, HR Admin, Manager, plus any Custom Access Levels with field-level permissions. SSO via Okta or Microsoft Entra ID can be staged ahead of cutover but enabled at go-live 12.
  • Define Custom Tables that mirror your source data shape — Education, Certifications, Licenses, Visa Information — with the columns and field types each will hold. Custom Tables cannot be re-typed retroactively after data is loaded.

People prep

Cutover only works if humans cooperate. Lock a source-system freeze window — typically a payroll-period boundary — and communicate it to HR, Payroll, IT and every people manager. BambooHR's own switch-software guide recommends assembling an internal team with a senior project lead who has change-management experience 13. A 50-employee company often finishes in two to four weeks; a 500-employee project with payroll, performance and benefits add-ons runs two to three months. Build the human runway accordingly.

Section 04

Import mechanisms: UI wizard, CSV, and programmatic loads

Multiple paths in, each with different limits and shapes. Picking the wrong one is how mid-migrations stall at scale.

BambooHR exposes several load paths and the right one depends on dataset size, table mix, and whether you need to re-run idempotently. The native Import Tool covers most one-shot migrations under a few thousand employees. Programmatic loads handle repeatable, and large loads — especially anything that touches effective-dated tables. Third-party tools sit on top of both and add staging, transformation and dedup layers.

Native Import Tool

The native import lives at a unique per-account URL (visible inside the Import Tool Tutorial in the product) and opens from the BambooHR partner / training portal 4. It accepts Excel (.xls, .xlsx) and CSV (.csv) files, walks the admin through column mapping against the BambooHR field dictionary, and previews the first rows before commit 4. The Hours Importer and Custom Dashboards each have their own dedicated upload flows 145.

Two operational constraints define how teams actually use it. First, there is no undo — every BambooHR training begins with a single-row test import 46. Second, the Import Tool maps to fields that already exist in your account; if a source column has no destination field, the importer will not silently create one — add the field through Customize first.

The right call: the Import Tool for one-shot employee loads under a few thousand records, for Hours imports, for any per-employee field refresh, and as the primary handoff format for BambooHR Onboarding Specialists during paid implementation.

Programmatic loads

Programmatic loads are the path for repeatable, large, or history-heavy datasets. They let you create employees, post effective-dated table rows for Job Info and Compensation, upload documents, and manage list-field options without touching the Import Tool UI 97. Official PHP and Python client libraries ship from BambooHR with fluent client builders and typed models 16. Throughput ceilings are not published as a fixed number; BambooHR returns Retry-After headers when you exceed the per-account ceiling and the documented pattern is to back off on the header value 18.

Effective-dated tables are the programmatic path's strength relative to the UI importer. A dated-row write takes a single row and adds it to the history without disturbing existing rows, and an update is keyed off the row ID 20. Deletions return a conflict response if the row has pending approval changes or is tied to an active pay schedule 20 — both conditions you need to handle when re-running history loads.

Third-party staging tools

Tools like Fivetran, Airbyte, Portable, Skyvia and Workato all ship BambooHR connectors. Their role in a migration is rarely the migration itself — it is the staging layer that lands source HRIS data into a warehouse, the transformation layer that converts list values and date formats, and the ongoing-sync layer that takes over once the one-time migration is complete. Workato in particular ships dedicated Time Off action recipes that the Import Tool cannot replicate.

For one-time migrations, the value is in repeatability under failure; for ongoing syncs to a data warehouse or a downstream payroll provider (Gusto, ADP, Paylocity), they become the system of integration.

Rule

Under 500 employees on standard fields → native Import Tool. 500–5,000 with history → Import Tool for employees + programmatic loads for effective-dated tables. Over 5,000, complex history, or any re-runnable load → programmatic loads with the official PHP or Python client library.

Section 05

Mapping your data into BambooHR

The longest section — because field mapping is where almost every migration that fails actually breaks.

SOURCE BAMBOOHR FirstName, LastName firstname, lastname AccountName company AnnualRevenue annualrevenue Owner.Email hubspot_owner_id CreatedDate createdate
Field-mapping flow — every source field resolves to a destination property or an explicit drop.

Mapping is where every migration earns its scars. The schema decisions you make in your mapping spreadsheet determine whether the org chart renders on day two, whether PTO accrues correctly on day five, and whether your managers trust the data on day thirty.

Work top to bottom of the import order: Employees first (root record), then effective-dated tables (Job Info, Compensation, Employment Status), then Time Off categories and balances, then performance + compensation history, then documents, then Custom Tables and Hiring data.

Employee records and demographics

Common source → BambooHR Employee mapping

Source Destination
  • employee_id / payroll_id
    Employee # (custom or default)

    Flag this column as the unique identifier during import mapping

  • first_name / last_name
    firstName / lastName

    Preferred name maps to preferredName separately

  • work_email
    workEmail

    Used as the SSO match key in most Okta / Entra setups

  • date_of_birth
    dateOfBirth

    yyyy-mm-dd format; drives age and birthday fields 8

  • gender
    gender

    Single-select list — pre-create options if you carry non-binary or X categories

  • ethnicity / EEO category
    ethnicity, eeo (job category)

    US EEO-1 compliance fields — must match BambooHR's option set verbatim

  • veteran_status / disability_status
    veteranStatus, disabilityStatus

    VEVRAA / Section 503 compliance — separate single-select lists

  • supervisor / manager
    Supervisor (Reports To)

    Use Supervisor Email or Supervisor ID, not name — name matching breaks on duplicates 10

  • hire_date / termination_date
    hireDate, terminationDate

    Drives tenure calculations and ACA status — load both even for active employees

PTO balance accruals, carryover and holiday calendars

Time Off is the most platform-specific subsection of any HRIS migration. In BambooHR you must create the categories (PTO, Sick, Vacation, Parental, Bereavement) and the policies that accrue into them before you import any balances 26. Each policy carries an accrual schedule (monthly, per-pay-period, lump-sum, anniversary), a carryover cap, a negative-balance allowance, and a tenure-based accrual rate table.

Balances are imported as adjustments through the Adjust Balance flow per employee per category, in the UI or programmatically. The number you import is the *current balance as of the import date* — it is not historical accrual, it is a starting line. The accrual engine then ticks forward from that balance using the policy. Freeze accruals in the source, export balances on the freeze date, and import as same-day adjustments 27.

Holiday calendars are per-location and configured at Settings → Time Off → Holidays before any time-off requests are created. Custom carryover rules — for example California sick leave caps — are encoded in the policy itself, not in the imported data.

Effective-dated history — Job Info, Compensation, Employment Status

These three tables are the audit trail of every employee's career. The Job Info table holds dated rows for job title, department, division, location, employment type and supervisor. The Compensation table holds dated rows for pay rate, pay type (Salary/Hourly), pay schedule, overtime status and change reason. The Employment Status table holds dated rows for Active, Leave of Absence, Terminated and any custom statuses you defined.

Common source → BambooHR effective-dated row mapping

Source Destination
  • promotion / title-change event
    jobInfo row

    One row per change with effectiveDate, jobTitle, department, supervisor

  • raise / merit increase
    compensation row

    Effective date, rate, payType, paySchedule, changeReason

  • leave start / return
    employmentStatus row

    Two rows: one dated leave-start (Leave), one dated return (Active)

  • termination
    employmentStatus row + employee.terminationDate

    Set status to Terminated on the term date; populate terminationDate on the root

By default programmatic reads return only currently effective values; pass onlyCurrent=false on the employee read to include future-dated and historical values 7. This matters for reconciliation — if you compare a freshly imported employee against the source export using the default response, you will think 12 years of compensation history vanished when in fact it is sitting in the historical table, just hidden behind the default flag.

Compensation history — bonuses, equity, raises

Beyond the Compensation table, BambooHR captures one-off compensation events as fields on the employee — bonusAmount, bonusDate, bonusReason, bonusComment for the *most recent* bonus only 28. For full bonus and equity history you have three options: (1) load each bonus as a Compensation row with a "Bonus" change reason if it changes base rate, (2) create a Custom Table called "Bonus History" or "Equity Grants", or (3) import only the most recent bonus and archive the rest.

Compensation reports are tier-gated — the standard Compensation report is available on Advantage and above, and field-level access to the Compensation table is gated by Access Level 11. Build your Custom Access Levels before importing compensation history or managers will land in a system where they cannot see the data they need to make pay decisions.

Performance history — goals, assessments, 360s

Performance Management is an add-on module with its own data model. Goals are objects keyed by employee with title, status (status-inProgress, status-completed, status-closed), due date, completion percentage and attachments, with reads capped at 50 results per page 2930. Assessments — self, manager, peer and 360 — are bound to a review cycle and template that you configure inside the product before any review can be loaded.

Historical performance reviews from another HRIS rarely round-trip cleanly. The common pattern is: load only the current active goals programmatically, or attach a per-employee PDF "Performance Archive" document containing prior review summaries to the Employee Files section. Pure inline migration of free-text reviews into BambooHR's structured templates is a manual exercise that consumes weeks of HR time and is usually scoped out.

Document storage per employee

Signed offers, NDAs, performance docs, I-9s, W-4s, visa paperwork all live in Employee Files, organised into per-employee folders and sub-sections (categories) you define under Settings → Files 31. Upload is via the Documents tab in the UI or programmatically with the file binary, a fileName, a category ID and an optional share flag determining whether the employee sees the file on their own profile 19.

Hard limits to plan around: individual files cap at 20 MB on upload 19, and the per-employee storage allowance is published as 1 GB by BambooHR support. For larger document estates (scanned legal files, large performance archives), the pattern most teams adopt is: keep originals in S3 or Google Drive, store a deep link in a custom URL field on the employee record, and only inline-upload the most recent or most-referenced subset.

Org chart, reporting lines and divisions

The org chart in BambooHR is computed dynamically from the Supervisor field on each employee — there is no separate Org Chart object to import 10. Every employee must have a supervisor assigned except the top-level leader, whose Reports To field is left blank to mark the root. The most reliable mapping uses Supervisor Email rather than supervisor name, because name matching breaks on duplicate names and the importer cannot resolve which Sarah Chen is meant 10.

Department and Division are independent list fields on the employee, not hierarchical objects — you can have a Sales department in the Americas division and a Sales department in the EMEA division, but the platform sees four list values, not a two-level hierarchy. Location is similarly a flat list. Plan to import supervisors *after* the root employee load so the lookup resolves to existing employee records.

Audit trail, ownership and original timestamps

Standard createdDate, lastChanged and the per-table id values are BambooHR-managed system properties — they are stamped on insert and cannot be overwritten during import 7. If you need to preserve the original audit trail, the pattern is to create two custom fields on the Employee, *Legacy Hire System* and *Legacy Employee ID*, and populate them from the source export, plus a custom Notes field per effective-dated row for change-reason narratives that the source carried.

Ownership during import works only if Access Levels and user accounts exist at the moment of import — managers referenced in the Supervisor field must already exist as employees, and Custom Access Level grants must already be defined or the imported employee defaults to the standard Employee level with no visibility into their own compensation, performance or document history 11.

Section 06

The pitfalls that derail BambooHR migrations

Eight specific failure modes — ranked by impact, each tied to the exact BambooHR mechanism that breaks.

High impact

Import Tool has no undo button

Every BambooHR Import Tool training opens with the explicit warning that the tool has no undo. A 5,000-employee import with a malformed Supervisor column or a misnamed Department list value cannot be rolled back via a single click — the only recourse is bulk-deletion of the imported employees (which orphans any time-off requests, files or goals already created) or a row-by-row corrective re-import. Run a single-employee test through the tutorial sandbox first, then a 10-row pilot, then the full file 46. 4

High impact

Single current row collapses effective-dated history

Job Info, Compensation and Employment Status are effective-dated tables — BambooHR shows the most recent dated row as the current value and preserves prior rows as history 7. A migration that loads only the current job title and current pay rate erases every promotion, raise and leave-of-absence event from the timeline. Manager reports filtered by tenure or pay-change date will return empty. Build the import file with one row per historical change, dated correctly, and accept the row-count expansion this implies. 7

High impact

List-field values rejected when not pre-defined

Single-select list fields — Department, Division, Location, Employment Status, EEO categories, custom dropdowns — store values from a fixed option set. The Import Tool will not silently create a new option when it encounters a value it doesn't recognise; the row is rejected and you spend the afternoon spotting which 18 rows had a typo or a casing mismatch 89. Pre-create every list value through Customize before the import runs, and lowercase-trim the source export against the destination option set. 9

High impact

Supervisor field resolved by name fails on duplicates

The Supervisor (Reports To) field is the only thing that builds the org chart, and the default name-based match breaks the moment two employees share a name. Culture Amp's BambooHR sync guide is explicit: hierarchy cannot be built reliably using Manager Names — you need Supervisor Email or a calculated Supervisor ID field, and every employee except the top leader must have a manager assigned 10. Switch the source export to email-based supervisor references before the first import touches a real account. 10

High impact

Access Levels not pre-built leaves managers blind

Access Levels — Account Owner, Full Admin, HR Admin, Manager, Employee, plus Custom — control which fields and tables each user sees and edits. Import a manager into BambooHR before their Custom Access Level exists and they land at the default Employee level with no visibility into their team's compensation or performance, even though they own the org chart 11. Build Custom Access Levels before users get accounts, and grant them in the import file via the Access Level column or a follow-up bulk assignment. 11

Medium impact

PTO balances loaded as snapshots, not historical accrual

Time Off balances are imported as starting-line adjustments on the import date — they are not retroactive accruals, and they do not back-fill a request history. If HR expects to see "used 5 days in March, accrued 1.25 days in April" on day one, they will be disappointed: the platform shows only the current balance forward from the import 2627. Freeze accruals in the source on the cutover date, import balances same-day, and accept that the request log starts fresh on go-live. 27

Medium impact

File upload capped at 20 MB and 1 GB per employee

Employee file uploads reject files over 20 MB and the per-employee storage allowance is 1 GB 19. Teams migrating 15 years of scanned HR files — old performance reviews as multi-page PDFs, immigration paperwork, signed handbooks — hit the per-employee cap before they finish a single profile. The fix is to deep-link to S3 / Google Drive for the long-tail archive and only inline-upload the most recent or most-referenced documents on each profile. 19

Medium impact

Payroll and benefits are US-only add-ons, not core

BambooHR Payroll is a separately priced add-on, available only for US-based companies, and BambooHR Benefits Administration is similarly bolted on rather than part of the core HRIS. A migration scoped against "BambooHR" that quietly assumed payroll history would land in the same product runs into a per-pay-stub historical-payroll import that only exists once the Payroll add-on is contracted, and even then only for US payroll. Global teams will keep payroll in Gusto, ADP, Paylocity or a local provider integrated separately.

Low impact

Okta provisioning cannot create new BambooHR employees

The Okta integration for BambooHR is explicit about a one-way direction: you cannot create new users in BambooHR from Okta — assigning an Okta user to BambooHR with provisioning enabled returns an error, and the documented workaround is to import existing users from BambooHR first 33. Plan SSO provisioning as a post-migration step: load employees through the Import Tool or a programmatic load, then enable Okta or Entra ID provisioning for ongoing identity sync after go-live. 33

Section 07

Validation and cutover

What to verify after the import job, in what order — and how to fail safely when something is wrong.

1 Read-only Source goes write-frozen 2 Final delta Export incremental changes 3 Import Load into BambooHR 4 Validate Reconcile + spot-check 5 Cut over Users on new system
Cutover sequencing — five gated phases between source read-only and full user access.

Validation is the bridge between the import finishing and managers being allowed in. Most BambooHR implementations follow a three-stage validation: a pilot load of 10 to 20 employees with stakeholder spot-checks, the full load with real-time monitoring of record counts and supervisor-chain integrity, and a 30-day post-migration data-quality audit. The most reliable signal is having department heads verify their own teams — they know what right looks like better than any reconciliation script.

Build a reconciliation queries spreadsheet that compares source and destination on each of these counts. Anything outside a 0.5 percent variance gets investigated before users get login access.

  • Total active employees imported vs source — minus deliberately excluded terminated rows older than your retention scope.
  • Employees per department / division / location vs source — a non-trivial variance usually signals a list-value mismatch or a typo in the source data.
  • Total Job Info / Compensation / Employment Status rows per employee vs source effective-dated history — confirm the history did not collapse to a single current row.
  • Sum of base salary across active employees vs the source payroll register — a dollar variance signals a currency-precision drop or a missed Compensation row.
  • Org chart depth and width — count employees per level and confirm the top-level leader is the only employee with a blank Reports To field.
  • PTO balances by category vs the source freeze-date export — confirm starting balances landed correctly per employee per category.
  • Employee Files count and total bytes per employee — confirm large attachments did not silently fail against the 20 MB / 1 GB caps 19.
  • Access Level distributionGROUP BY accessLevel and confirm no manager landed at the default Employee level.

On top of reconciliation, run a manual spot-check protocol: pick 30 random employees across departments and verify each field against the source UI. Pick five executives, five managers and five individual contributors, and trace the full profile — compensation history, job info history, supervisor, direct reports, PTO balances, document folder. If a non-trivial discrepancy shows up in three or more of the 30, halt the load, fix the root cause, and re-import the affected employees by Employee #.

Rollback is the hardest part. BambooHR does not ship a bulk-undo for the Import Tool 46, and the closest equivalent is per-table delete — row-by-row, and it returns a conflict response if the row has pending approvals or is tied to an active pay schedule 20.

The practical rollback strategy: export everything to S3 before the import starts, stamp every imported employee with a *Legacy Hire System* and *Migration Batch ID* custom field, and if catastrophe strikes, bulk-deactivate by that batch ID and re-import from the cleaned source.

Cutover sequencing: (1) source goes read-only on a payroll-period boundary and HR is notified; (2) final delta export captures everything that changed during the test-import window; (3) delta is imported; (4) reconciliation runs against the source freeze-date snapshot; (5) Access Levels and SSO are enabled; (6) managers get login access and a 48-hour hyper-care window with the migration lead on call; (7) source decommission is scheduled for 30 to 90 days out, never the same day.

Section 08

Migration partners and tools

Implementation specialists, iPaaS vendors, in-house onboarding — what each is good for and how to choose.

The BambooHR Partner Program runs a Marketplace of certified implementation partners, payroll-integration partners and reseller partners reachable through the BambooHR Partners portal. Partners with explicit HRIS-migration practices — Paychex-to-BambooHR, ADP-to-BambooHR, Zenefits-to-BambooHR, spreadsheet-to-BambooHR — tend to ship cleaner than generalist HR consultancies, because the failure modes are platform-specific.

BambooHR also runs an in-house Onboarding service that ships with a one-time implementation fee on every new contract, covering initial setup, the first employee data migration, and custom configuration. Third-party implementation partners typically add a further $2,000 to $8,000 in one-time costs on top of the BambooHR onboarding fee for larger or more complex projects.

On the ETL and iPaaS side, Fivetran, Airbyte, Portable, Skyvia and Workato all have BambooHR connectors. Their role in a migration is rarely the migration itself — it is the staging layer that lands source HRIS data into a warehouse, the transformation layer that converts list values and date formats, and the ongoing-sync layer that takes over once the one-time migration is complete.

Workato is common where the migration is bundled with Slack-driven Time Off workflows; Airbyte and Fivetran are common picks for warehouse-first analytics teams.

Managed-migration cost ranges vary widely. A clean spreadsheet-to-BambooHR move of under 100 employees with no historical effective-dated rows and standard fields often lands inside the BambooHR onboarding fee with no third-party partner needed. A 500-to-2,000-employee project with multi-year compensation history, custom tables, document migration and Hiring (ATS) module rebuild typically runs $8,000–$40,000, with the upper end driven by employee count, custom-field complexity, historical-data depth and the number of downstream integrations that need rebuilding rather than re-pointed.

For teams that want to outsource the migration end-to-end, FlitStack specialises in BambooHR migrations and handles the field mapping, effective-dated history preservation, PTO balance reconciliation, document migration and Access Level configuration described in Sections 5 and 7 of this guide. Pricing is fixed-fee, based on employee count and source HRIS, with separate line items for Custom Tables and historical Compensation depth so the scope is transparent before signature.

This is one of several legitimate paths — the right choice for any given team depends on whether they want a BambooHR-certified implementation partner, the in-house Onboarding service, an iPaaS-first approach, or a specialist migration vendor. Explore FlitStack →

Section 09

Frequently asked questions

The eight questions every BambooHR migration team works through before they sign the scope.

References

Sources

  1. 1 BambooHR — Wikipedia
  2. 4 Import Tool Training — BambooHR Partners
  3. 5 Custom Dashboards: Import CSV Data — BambooHR Product Updates
  4. 6 Importing Data into BambooHR — BambooHR Support
  5. 7 Get Employee — BambooHR Documentation
  6. 8 Field Types — BambooHR Documentation
  7. 9 Add or Update Values for List Fields — BambooHR Documentation
  8. 10 Sync HRIS Data from BambooHR — Culture Amp Support
  9. 11 Customize Your BambooHR Account — BambooHR Help Center
  10. 12 BambooHR integration known issues — Okta Documentation
  11. 13 How to Switch HR Software the Easy Way — BambooHR
  12. 14 Hours Importer Updates — BambooHR Product Updates
  13. 16 Official client libraries — BambooHR Documentation
  14. 18 Programmatic load throughput guidance — BambooHR Documentation
  15. 19 Upload Employee File — BambooHR Documentation
  16. 20 Delete Employee Table Row — BambooHR Documentation
  17. 26 PTO Tracking & Time Off Management Software — BambooHR
  18. 27 Calculate Future Time Off Balances — BambooHR Help Center
  19. 28 Field Names — BambooHR Documentation
  20. 29 List Goals — BambooHR Documentation
  21. 30 Performance Management Systems for HR — BambooHR
  22. 31 Employee Document Upload — BambooHR Help Center
  23. 33 BambooHR integration known issues — Okta Documentation

Need help running this migration?

FlitStack AI runs BambooHR migrations end-to-end.

Fixed-fee pricing, a hands-on migration engineer, full field mapping and validation. The work described in this guide — done for you.