HRMS migration

Migrate from JOIN to Bullhorn ATS & CRM

Field-level mapping, validation, and rollback between JOIN and Bullhorn ATS & CRM. We move data and schema; workflows are rebuilt natively in Bullhorn ATS & CRM.

JOIN logo

JOIN

Source

Bullhorn ATS & CRM

Destination

Bullhorn ATS & CRM logo

Compatibility

83%

10 of 12

objects map 1:1 between JOIN and Bullhorn ATS & CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from JOIN to Bullhorn restructures a recruiting database from JOIN's job-centric model into Bullhorn's entity-relationship model. In JOIN, Jobs are the parent container with Candidates as children and Applications as the join table; in Bullhorn, JobOrder is the parent, Candidate and ClientCorporation are separate entities, and JobSubmission links them. We resolve that structural difference during scoping by extracting the per-job stage sequence, building the Bullhorn JobOrder schema with matching custom status values, and sequencing the parent-load before Candidate insert so every foreign-key constraint is satisfied at migration time. Activity history cannot be pulled from JOIN's API, so we ingest it from a dashboard CSV export and attach it to each candidate record in Bullhorn as a Note or custom activity block. Workflows, email sequences, and job board credits do not migrate; we deliver a written inventory for the customer's admin to rebuild.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

JOIN logo

JOIN

What's pushing teams away

  • Users report bugs and account downgrades that cause data loss, disrupting active hiring pipelines and leading recruiting teams to seek more stable alternatives.
  • Employer branding tools and candidate experience features lag behind competitors, causing larger companies with strong employer brand priorities to migrate to platforms with more polished candidate-facing pages.
  • Pricing becomes opaque at higher volumes, with job posting credits and seat limits that generate unexpected overage charges at renewal time.
  • Customer support response times frustrate teams managing active pipelines, especially when urgent issues like posting failures or candidate data errors arise during peak recruiting periods.

Choosing

Bullhorn ATS & CRM logo

Bullhorn ATS & CRM

What's pulling them in

  • Agencies choose Bullhorn because it combines ATS and CRM in one platform, eliminating the need to switch between separate tools for candidate management and client relationship tracking.
  • The resume parser extracts contact details, work history, and skills into structured, searchable candidate profiles automatically without manual data entry, reportedly driving 24% more placements per recruiter.
  • Bullhorn's placement and split-billing model natively supports contract staffing workflows, handling start/end dates, overtime rules, and multi-party pay/charge rates in a single record.
  • The platform offers extensive third-party integrations through its Recruitment Cloud Marketplace, connecting with back-office, onboarding, and payroll systems used by staffing agencies.
  • 72% of Bullhorn customers are teams with fewer than 10 users, and Bullhorn's implementation team handles setup and data migration for small agencies going live within weeks.

Object mapping

How JOIN objects map to Bullhorn ATS & CRM

Each row shows how a JOIN 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.

JOIN

Job

maps to

Bullhorn ATS & CRM

JobOrder

1:1
Fully supported

JOIN Jobs map to Bullhorn JobOrder. We extract the full job record (title, description, department, location, employment type, posting status) and map it to the Bullhorn JobOrder standard fields. The Bullhorn JobOrder must be inserted before any Candidate or JobSubmission records because JobSubmission references JobOrderID as a foreign key. If the JOIN job posting has expired or is closed, we preserve the status and set JobOrder.isDeleted or isClosed accordingly.

JOIN

Candidate

maps to

Bullhorn ATS & CRM

Candidate

1:1
Fully supported

JOIN Candidate records map directly to Bullhorn Candidate with contact info, work history, education, skills tags, and source attribution. The Candidate's current pipeline stage from JOIN migrates as a custom Candidate text field because Bullhorn's standard status values are scoped to JobSubmission rather than Candidate. We resolve Candidate duplicates by email dedupe before insert.

JOIN

Application

maps to

Bullhorn ATS & CRM

JobSubmission

1:1
Fully supported

JOIN Applications (the join table linking a Candidate to a Job) map to Bullhorn JobSubmission. The mapping preserves applied date, referral source, and rejection or offer flags. JobSubmission is inserted after both JobOrder and Candidate are loaded so that JobOrderID and CandidateID foreign keys are satisfied. A rejection or offer on the JOIN Application maps to JobSubmission.status with the corresponding Bullhorn status value.

JOIN

Pipeline Stage (per-job)

maps to

Bullhorn ATS & CRM

JobSubmission Status + Sales Process

lossy
Fully supported

JOIN exposes no universal stage schema; each job carries its own stage sequence that varies by plan. We extract the full stage list per job during the scan phase and build a customer-specific mapping table. In Bullhorn, we scope stage values to the JobOrder's Sales Process and record type. Where JOIN has more stages than Bullhorn supports, we collapse intermediate stages and preserve the stage-entry date as a custom field on JobSubmission so no timing context is lost.

JOIN

Scorecards and Interview Feedback

maps to

Bullhorn ATS & CRM

Note + Custom Fields

1:1
Mapping required

Structured interview evaluations from JOIN migrate as Bullhorn Note records attached to the JobSubmission or Candidate. Where the evaluation uses a rubric with numeric scores, we map each criterion to a custom Candidate field or JobSubmission custom field. Free-text feedback migrates as Note body text with the interviewer name and interview date in the Note title.

JOIN

Custom Fields (Jobs)

maps to

Bullhorn ATS & CRM

JobOrder Custom Fields

1:1
Fully supported

JOIN employer-defined custom fields on Jobs map to Bullhorn JobOrder custom fields. Bullhorn supports ~55 custom fields per entity. We detect all JOIN Job custom fields during the scan, validate the count against Bullhorn's limit, and flag any overflow to the customer for custom object design. Custom fields are created in Bullhorn via the Field Mappings admin panel before data load.

JOIN

Custom Fields (Candidates)

maps to

Bullhorn ATS & CRM

Candidate Custom Fields

1:1
Fully supported

JOIN Candidate custom fields map to Bullhorn Candidate custom fields. Bullhorn's custom field limit per entity (~55 fields) may require a custom object or a JSON-serialised text block for fields exceeding the limit. We surface the full custom field schema at scoping, confirm the intended mapping with the customer, and create the destination fields before migration. Custom fields that cannot map to typed Bullhorn fields land as free-text custom properties and can be restructured post-migration.

JOIN

Attachments and Resume Files

maps to

Bullhorn ATS & CRM

Candidate Resume + ContentDocument

1:1
Mapping required

Candidate resume files and supporting documents export from JOIN and upload to Bullhorn as Candidate resume files or ContentDocument records linked via ContentDocumentLink. JOIN file naming uses internal IDs that we normalise to CandidateName_JobTitle_Date during export to prevent filename collisions and ensure files are identifiable in Bullhorn. We validate each file uploads successfully before marking the Candidate record as complete.

JOIN

Owner

maps to

Bullhorn ATS & CRM

User

1:1
Fully supported

JOIN Owners map to Bullhorn User records. We match by email address against the Bullhorn destination User table. Any JOIN Owner without a matching Bullhorn User goes to a reconciliation queue for the customer's Bullhorn admin to provision before record import resumes. Migration cannot proceed past User reconciliation because User references are required on JobOrder, Candidate, and JobSubmission.

JOIN

Client / Company

maps to

Bullhorn ATS & CRM

ClientCorporation

1:1
Fully supported

If JOIN stores employer company records separate from Jobs, those map to Bullhorn ClientCorporation. ClientCorporation is created before JobOrder when a client record exists in JOIN, providing the ClientCorporationID for the JobOrder foreign key. JOIN employer-branding data (company description, website, industry) maps to the corresponding ClientCorporation standard fields.

JOIN

Activity and Communication History

maps to

Bullhorn ATS & CRM

Note + CSV Ingest

1:1
Not supported

JOIN does not expose email threads, scheduled events, or interview activity through a documented API endpoint. We require the customer to export this data as a CSV from the JOIN dashboard before cutover. We ingest the CSV alongside the API extract, normalise the activity data (email body, event date, interviewer name), and attach each entry as a Bullhorn Note linked to the Candidate or JobSubmission. Stage-entry timestamps from JOIN also land as custom date fields on JobSubmission, preserving the original pipeline timing context.

JOIN

Job Posting Board Distribution

maps to

Bullhorn ATS & CRM

JobOrder Distribution Settings

lossy
Fully supported

JOIN's 250+ job board distribution network has no direct Bullhorn equivalent as a native feature. Bullhorn distributes job postings through its integrated job board connectors and the Bullhorn Marketplace (350+ partner integrations). We document each active JOIN job board posting as a JobOrder custom field or an external reference note so the customer's Bullhorn admin can re-enable distribution on the equivalent Bullhorn-integrated board at their preferred time.

Gotchas + challenges

What specifically takes care here

Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.

JOIN logo

JOIN gotchas

High

Activity log and communication history are not exported via JOIN API

Medium

Pipeline stage names vary per job and per plan

Medium

Custom fields on Candidates require manual equivalence review

Low

Resume and attachment export format is non-standard

Bullhorn ATS & CRM logo

Bullhorn ATS & CRM gotchas

High

ATS Growth edition has no API access

High

Attachments excluded from CSV bulk exports

Medium

Custom Object limits vary sharply by edition

Medium

Opportunity pipeline stages are recruitment-specific

Low

Resume parse quality varies by document format

Pair-specific challenges

  • Activity history requires a manual JOIN dashboard CSV export before migration

    JOIN does not expose email threads, scheduled interview events, or the candidate activity timeline through a documented API endpoint. We can migrate Candidate profiles, Applications, and Custom Fields via API, but internal activity logs must be exported manually as a CSV from the JOIN dashboard before cutover. We flag this requirement during scoping, provide the customer with export instructions, and ingest the CSV alongside the API extract to produce a complete candidate record in Bullhorn with the full communication history attached as Notes.

  • Bullhorn enforces custom field and custom object limits that constrain JOIN's flexible schema

    Bullhorn caps custom fields at approximately 55 per entity and supports up to 10 custom objects on Front Office Growth and Enterprise editions (2 on Bullhorn ATS, none on ATS Growth). JOIN's custom field schema can be more flexible per tenant. We audit every JOIN custom field during the scan phase and validate against the customer's Bullhorn edition limits. Fields exceeding the limit require a custom object design or must land as free-text. We surface this constraint at scoping before any data moves so the customer can confirm their Bullhorn edition or request a higher-tier environment.

  • JOIN per-job pipeline stages require a custom mapping table that Bullhorn scopes by record type

    JOIN does not enforce a universal stage schema; each job carries its own custom stage sequence. Bullhorn uses a standard stage schema scoped by JobOrder record type and Sales Process. We extract the full stage list per job during discovery and build a customer-specific mapping table. Where JOIN has more stages than Bullhorn's scope allows, we collapse intermediate stages and preserve the stage-entry date as a custom JobSubmission field. Bullhorn's Field Mappings admin panel (Menu > Admin > Field Mappings) controls which stage values are available per record type, and we configure this during the migration schema build.

  • Bullhorn's REST API uses OAuth 2.0 with a separate login call to establish a session token

    Bullhorn's REST API requires OAuth 2.0 authentication followed by a separate login call (loginInfo to resolve the data centre URL, then a login call to get the BhRestToken and restUrl). Each entity has independent rate limits. We handle token refresh, session management, and exponential backoff on rate-limit responses (HTTP 429) during the migration run. JOIN's API is less documented; we use JOIN's documented endpoints for Candidate, Application, and Job extraction with pagination and error handling.

  • JOIN resume and attachment filenames use internal IDs that must be normalised before Bullhorn upload

    Candidate resume files in JOIN are accessible via the platform but may be returned with filenames derived from JOIN's internal IDs rather than candidate names. Bullhorn's candidate record expects identifiable file names for the resume field. We normalise filenames to a consistent convention (CandidateName_JobTitle_Date) during the export phase before uploading to Bullhorn. This prevents filename collisions in bulk downloads and ensures files are recognisable in Bullhorn's candidate record without additional investigation.

Migration approach

Six steps for a successful JOIN to Bullhorn ATS & CRM data migration

  1. Discovery and scoping

    We audit the JOIN portal across Jobs, Candidates, Applications, custom fields (per job and per candidate), per-job pipeline stage sequences, active scorecard templates, and attachment volumes. We pair this with the customer's Bullhorn edition confirmation (Starter, Core, or Pro) to validate custom field and custom object limits. We provide the customer with JOIN dashboard export instructions for activity history CSV and confirm the expected record counts before producing a written migration scope and mapping table.

  2. Schema design and Bullhorn configuration

    We design the Bullhorn destination schema: JobOrder custom fields (mapped from JOIN Job custom fields), Candidate custom fields (mapped from JOIN Candidate custom fields), JobSubmission status values scoped per Sales Process, and any custom objects required for JOIN schema elements that exceed Bullhorn's per-entity field limits. Bullhorn Field Mappings (Admin > Field Mappings) are configured for each entity before any data load. Schema is validated in a Bullhorn sandbox or test environment first.

  3. Sandbox migration and reconciliation

    We run a full migration into the customer's Bullhorn sandbox environment using production-like data volumes. The customer's Bullhorn admin reviews record counts (JobOrders, Candidates, JobSubmissions), spot-checks 25-50 candidate records against the JOIN source, and validates that pipeline stages, custom field values, and resume files appear correctly. Any mapping corrections are made at this stage before production migration begins.

  4. Owner reconciliation and User provisioning

    We extract every distinct JOIN Owner referenced on Job, Candidate, and Application records and match by email against the Bullhorn destination User table. Any Owner without a matching Bullhorn User is held in a reconciliation queue. The customer's Bullhorn admin provisions missing Users (active or inactive depending on whether the original JOIN user is still with the firm) before the production migration begins, because UserID references are required on JobOrder, Candidate, and JobSubmission.

  5. Production migration in dependency order

    We run production migration in the correct foreign-key sequence: ClientCorporation records (if applicable), JobOrders with the per-job stage schema configured, Candidates with dedupe by email, JobSubmissions with JobOrderID and CandidateID resolved, then custom fields, attachments (normalised filenames), and finally the activity history CSV ingested as Notes. Each phase emits a row-count reconciliation report. Bullhorn's REST API rate limits are respected through exponential backoff and batch chunking.

  6. Cutover, validation, and handoff

    We freeze JOIN writes during the cutover window, run a final delta migration of records modified during the migration, then enable Bullhorn as the system of record. We deliver a written inventory of any JOIN workflows, email sequences, or job board distribution settings requiring manual rebuild in Bullhorn (via Bullhorn Automation or the Marketplace integrations). We support a one-week post-cutover window for reconciliation issues. We do not rebuild JOIN automations as Bullhorn automations inside the standard migration scope; that is a separate engagement.

Platform deep dives

Context on both ends of the pair

JOIN logo

JOIN

Source

Strengths

  • Free Standard tier (up to 2 active job ads on 15+ free boards) lowers the entry bar for small businesses to test the platform with no commitment.
  • One-click distribution to 250+ job boards including German staples like StepStone and Indeed Germany makes it especially efficient for DACH-region hiring.
  • Unlimited team seats on every paid tier removes per-recruiter pricing friction common in enterprise ATSs.
  • Per-job pricing (€20/job Standard, €40/job Advanced) lets teams scale spend with active req count rather than headcount.
  • API access on Advanced tier (and Enterprise) plus custom integrations on Enterprise enables HRIS and downstream tooling synchronisation.

Weaknesses

  • Free tier is capped at 2 active job ads; teams running more than 2 reqs at once must upgrade.
  • API access is gated behind the Advanced tier (€40/job/month) — Standard customers cannot integrate programmatically.
  • Per-job pricing scales linearly with active reqs, so high-volume recruiters can end up paying more than enterprise ATSs with flat licensing.
  • Annual contracts are restricted to Enterprise; monthly billing only for Standard and Advanced.
  • Enterprise pricing not published — companies needing custom integrations must engage sales to benchmark cost.
Bullhorn ATS & CRM logo

Bullhorn ATS & CRM

Destination

Strengths

  • Unified ATS and CRM on one platform purpose-built for staffing agencies, eliminating separate tools for candidates and clients.
  • Automated resume parsing extracts structured candidate data—contact details, work history, skills—into searchable profiles instantly.
  • Native placement and split-billing model handles contract staffing workflows including start/end dates and overtime rules.
  • Bullhorn Recruitment Cloud Marketplace offers 100+ pre-validated third-party integrations spanning the full recruiting lifecycle.
  • 24/7 global support coverage from 350+ support staff with dedicated account management included at all tiers.

Weaknesses

  • Widely regarded as old and bloated with an unintuitive interface and steep learning curve for new recruiters.
  • Slow page loads and performance lag cited in over 200 verified G2 reviews during high-volume recruiting periods.
  • Pricing is opaque—custom-negotiated per organization with significant upfront implementation fees that vary by deal.
  • ATS Growth edition excludes API access entirely, preventing automated data export without upgrading first.

Complexity grading

How hard is this migration?

Standard HRMS migration. 1 of 7 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across JOIN and Bullhorn ATS & CRM.

  • Object compatibility

    B

    1 of 7 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    7-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    JOIN: Not publicly documented.

  • Data volume sensitivity

    B

    JOIN doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your JOIN to Bullhorn ATS & CRM migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about JOIN to Bullhorn ATS & CRM data migrations

Answers to the questions buyers ask most during JOIN to Bullhorn ATS & CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

Walk through your JOIN to Bullhorn ATS & CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Most JOIN to Bullhorn migrations land between three and five weeks for accounts with fewer than 5,000 Candidates and 200 Jobs and no complex custom field schema. Migrations with large per-job pipeline stage customisation, custom field schemas that exceed Bullhorn's per-entity field limits, bulk resume and attachment normalisation, or activity history CSV ingestion move into eight to twelve weeks because of schema design work, file handling, and CSV merge steps.

Adjacent paths

Related migrations to explore

Ready when you are

Move from JOIN.
Land in Bullhorn ATS & CRM, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day