HRMS migration
Field-level mapping, validation, and rollback between Occupop and Bullhorn ATS & CRM. We move data and schema; workflows are rebuilt natively in Bullhorn ATS & CRM.
Occupop
Source
Bullhorn ATS & CRM
Destination
Compatibility
9 of 12
objects map 1:1 between Occupop and Bullhorn ATS & CRM.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from Occupop to Bullhorn is a shift from an SMB-focused ATS with unlimited user seats and 1-click job distribution to an enterprise staffing platform with a CRM layer, configurable pipeline stages, and a REST API built for high-volume data movement. Occupop organizes hiring around Jobs, Candidates, and Workflow Stages; Bullhorn adds a separate Lead object, Client Corporations, and Placements. We resolve the Occupop Workflow Stage sequence by mapping it to Bullhorn JobOrder custom fields and Note records, and we preserve AI screening scores from Occupop as a custom numeric field on the Candidate. Job board distribution history (Indeed, LinkedIn, Reed, and others) is exported as a structured list per Job and handed off as a CSV so the customer's admin can re-create distributions in Bullhorn. Occupop's offer and onboarding data is excluded from migration scope because it now lives in Cezanne HR's broader suite post-acquisition. Bullhorn's Custom Object limits vary by edition (2 for Bullhorn ATS, 10 for Front Office Growth/Enterprise), which constrains how many Occupop custom field groups can land as native Bullhorn Custom Objects versus structured Note fields.
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 Occupop 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.
Occupop
Candidate
Bullhorn ATS & CRM
Candidate
1:1Occupop Candidate records map directly to Bullhorn Candidate. We extract name, email, phone, CV file reference, stage history, AI screening score, and any custom field key-value pairs. The Occupop custom field schema is tenant-specific with no fixed definition; we inspect the export during scoping, build a per-field map, and land values as Bullhorn custom fields on the Candidate record. Bullhorn's entity-level custom field limits apply: Bullhorn ATS allows 2 Custom Objects, ATS Growth allows none, and Front Office Growth/Enterprise allow 10. We pre-create the required Bullhorn Custom Objects (with Bullhorn Support for the initial setup) before migration and fall back to structured Note records when Custom Object capacity is exhausted.
Occupop
Job (Position)
Bullhorn ATS & CRM
JobOrder
1:1Occupop Jobs map to Bullhorn JobOrder. We export job title, description, department, location, status (active/closed), and original Occupop job ID preserved as a custom field. The Bullhorn jobPublished flag is set based on the Occupop active/closed state. JobOrder is created before the Candidate import so that the Candidate-to-Job reference (candidateSubmissions in Bullhorn) is satisfied at import time.
Occupop
Workflow Stage
Bullhorn ATS & CRM
JobOrder Custom Fields + Note
lossyOccupop tracks an ordered sequence of stages per Job (Applied, Screening, Interview, Offer, etc.). Bullhorn JobOrder does not have a native stage sequence object. We map each Occupop stage name to a Bullhorn custom field on JobOrder and preserve the full stage list as a structured Note attached to the JobOrder. Interview stage definitions and stage-specific feedback are stored as separate Note records with a category tag so the customer's Bullhorn admin can re-create the pipeline view using Bullhorn's built-in pipeline kanban.
Occupop
User (Hiring Team Member)
Bullhorn ATS & CRM
User
1:1Occupop Users (Admin, Hiring Manager, Recruiter, Viewer roles) map to Bullhorn User records by email match. We export all users with their role assignments and flag any Occupop role that has no direct Bullhorn equivalent. Bullhorn's role model (Admin, Standard, Limited) is applied as a mapping during scoping, and the customer's Bullhorn admin confirms the final role assignment before migration.
Occupop
CV and Attachment
Bullhorn ATS & CRM
Candidate Document (ContentDocument)
1:1CV files are exported as raw binary files from Occupop and re-attached to the Bullhorn Candidate record via Bullhorn's ContentDocument and ContentDocumentLink objects. We preserve the original filename and the linkedCandidate relationship. Bullhorn's resume parsing is triggered post-import if the Bullhorn edition includes that feature.
Occupop
Interview Feedback and Notes
Bullhorn ATS & CRM
Note + Task
1:1Occupop interview notes and scorecard responses are stored per Candidate per stage. Bullhorn does not have a native interview-feedback object; we export the full text and scores and land them as Note records with a category tag (e.g., Interview Feedback) linked to the Candidate. If the customer requires a structured scorecard format, we use Bullhorn Custom Objects with a Bullhorn Support ticket to pre-create the schema.
Occupop
Score and Ranking Data
Bullhorn ATS & CRM
Candidate Custom Numeric Field
1:1Occupop's AI screening score (0-100 or similar scale depending on tenant configuration) and the Candidate's rank within the Job's candidate pool are exported as numeric fields. We create a custom numeric field on the Bullhorn Candidate object (occupop_ai_score__c) and populate it during import. The rank is stored as occupop_rank_in_job__c. These fields are available for Bullhorn reporting and sorting post-migration.
Occupop
Job Posting Distribution History
Bullhorn ATS & CRM
Note (structured list, no native equivalent)
1:1Occupop tracks which job boards a Job was distributed to (Indeed, LinkedIn, Reed, Glassdoor, niche boards) and the posting date. Bullhorn has no standard field for board-distribution history. We export this as a structured CSV per Job (job_title, board, posting_date, status) and attach it as a Note to the Bullhorn JobOrder. The customer's Bullhorn admin uses this inventory to re-create distributions through Bullhorn's job board integrations or manually post to the relevant boards post-migration.
Occupop
Custom Fields
Bullhorn ATS & CRM
Custom Fields + Custom Objects
lossyOccupop Custom Fields are arbitrary tenant-defined key-value pairs on Candidate records. During scoping we inspect the source tenant's full custom field definitions, classify each as a scalar value (maps to a Bullhorn custom field) or structured data (maps to a Bull Object), and build a per-field type map. Bullhorn entity-level custom field limits (2-10 Custom Objects depending on edition) are verified with the customer before migration. Values that cannot fit within Bullhorn's Custom Object capacity are stored as structured text in Note records with a field-label prefix.
Occupop
Lead (from Bullhorn side)
Bullhorn ATS & CRM
Lead
lossyBullhorn includes a separate Lead object for unqualified prospects. Occupop has no Lead concept—all applicants are Candidates. We do not create Bullhorn Lead records from the Occupop migration unless the customer specifically requests it as part of their Bullhorn onboarding process. If Lead creation is requested, unqualified Candidates (e.g., applicants who never reached an interview stage) are segmented into Lead records with the original Occupop source tagged in a custom field.
Occupop
Client Corporation (Bullhorn CRM layer)
Bullhorn ATS & CRM
ClientCorporation
1:1Bullhorn's CRM layer includes ClientCorporation records that represent staffing firms' client companies. Occupop does not have a client CRM object. If the customer uses Bullhorn's CRM features, we assist in scoping whether ClientCorporation records need to be created (as new records in Bullhorn, not migrated from Occupop) or whether the staffing firm's client relationships are tracked differently.
Occupop
Placement
Bullhorn ATS & CRM
Placement
1:1Bullhorn Placement records track hired candidates and are a core object in the staffing use case. Occupop does not have a Placement object (offer and onboarding data moved to Cezanne HR post-acquisition). Placement records are not migrated from Occupop. The customer creates Bullhorn Placement records as they make placements post-migration, using the migrated Candidate and JobOrder records as the basis.
| Occupop | Bullhorn ATS & CRM | Compatibility | |
|---|---|---|---|
| Candidate | Candidate1:1 | Fully supported | |
| Job (Position) | JobOrder1:1 | Fully supported | |
| Workflow Stage | JobOrder Custom Fields + Notelossy | Fully supported | |
| User (Hiring Team Member) | User1:1 | Fully supported | |
| CV and Attachment | Candidate Document (ContentDocument)1:1 | Fully supported | |
| Interview Feedback and Notes | Note + Task1:1 | Mapping required | |
| Score and Ranking Data | Candidate Custom Numeric Field1:1 | Fully supported | |
| Job Posting Distribution History | Note (structured list, no native equivalent)1:1 | Mapping required | |
| Custom Fields | Custom Fields + Custom Objectslossy | Mapping required | |
| Lead (from Bullhorn side) | Leadlossy | Fully supported | |
| Client Corporation (Bullhorn CRM layer) | ClientCorporation1:1 | Fully supported | |
| Placement | Placement1: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.
Occupop gotchas
Cezanne HR acquisition may change data residency and contract terms
Offer and onboarding data lives outside Occupop's ATS scope
Custom Fields schema varies by tenant and may require mapping
Job posting board-distribution history does not map to standard ATS fields
Bullhorn ATS & CRM gotchas
ATS Growth edition has no API access
Attachments excluded from CSV bulk exports
Custom Object limits vary sharply by edition
Opportunity pipeline stages are recruitment-specific
Resume parse quality varies by document format
Pair-specific challenges
Migration approach
Discovery and Bullhorn edition selection
We audit the source Occupop tenant across custom field definitions, Job count, Candidate volume, stage sequences per Job, User count with role assignments, CV and attachment file counts, interview feedback volume, and any AI screening score data. We pair this with a Bullhorn edition assessment: Bullhorn ATS ($99/user/mo base) covers basic candidate and job management; Bullhorn Front Office Growth ($199/user/mo) unlocks up to 10 Custom Objects and API access; Enterprise adds advanced reporting and unlimited storage. The discovery output is a written migration scope, a Custom Object requirement list for Bullhorn Support tickets, and a Bullhorn edition recommendation.
Custom Object creation via Bullhorn Support
We submit Bullhorn Support tickets to create any Custom Objects required for Occupop custom field groups that cannot fit into Bullhorn's entity-level custom fields. Bullhorn Support must provision Custom Objects initially; they cannot be self-created by the admin. We track ticket status, confirm Custom Object names and field structures with the customer, and validate that the Bullhorn edition supports the required count before proceeding to the export phase.
Occupop data export and field mapping
We extract all Occupop records via the platform's export capabilities, including Candidates with custom fields, Jobs with stage sequences, Users with roles, CV file references, interview feedback, AI screening scores, and board distribution history. We build a field mapping table for each object class, classifying Occupop custom field key-value pairs as scalar (Bullhorn custom field), structured (Bullhorn Custom Object), or overflow (Note with prefix). Bullhorn field character limits and type constraints are validated against the export data during this phase.
Sandbox migration and reconciliation
We run a full migration into a Bullhorn Sandbox using production-like data volume. The customer's Bullhorn admin reconciles record counts (Candidates in, Jobs in, Users in, Notes in), spot-checks 25-50 random Candidate records against the Occupop source for field-level accuracy, confirms custom field values are populated, and signs off the mapping before production migration begins. Any Custom Object schema corrections and field mapping adjustments happen here, not in production.
Production migration in dependency order
We run production migration in record-dependency order: JobOrder (Jobs) first, then Candidate records with the Occupop AI score and rank populated in Bullhorn custom fields, then User records with role assignments, then CV files attached via ContentDocumentLink, then interview feedback as Note records, then board distribution history as structured Notes. Each phase emits a row-count reconciliation report before the next phase begins. Bullhorn's REST API is used with rate-limit handling and batch chunking for large candidate sets.
Cutover, validation, and manual-rebuild handoff
We freeze Occupop 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 board-distribution inventory CSV, the active stage-sequence mapping table, and the Bullhorn Workflow rebuild inventory (for any pipeline automations the customer wants to document for their admin). We support a one-week hypercare window for reconciliation issues. We do not rebuild Bullhorn workflows, job board integrations, or Bullhorn Onboarding configurations inside the migration scope; these are separate engagements or admin tasks.
Platform deep dives
Occupop
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 Occupop 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
Occupop: Not publicly documented.
Data volume sensitivity
Occupop 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 Occupop to Bullhorn ATS & CRM migration scoping. Not seeing yours? Book a call.
Walk through your Occupop 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 Occupop
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.