HRMS migration
Field-level mapping, validation, and rollback between OpenCATS and Bullhorn ATS & CRM. We move data and schema; workflows are rebuilt natively in Bullhorn ATS & CRM.
OpenCATS
Source
Bullhorn ATS & CRM
Destination
Compatibility
11 of 12
objects map 1:1 between OpenCATS and Bullhorn ATS & CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Moving from OpenCATS to Bullhorn is a platform upgrade from a self-hosted, community-supported ATS to a cloud-native ATS and CRM purpose-built for staffing agencies. OpenCATS has no REST API, so we connect directly to its MariaDB schema to extract all candidate, job order, company, and activity records. Bullhorn receives that data through its REST API with standard field mapping for core objects, while resume files stored as filesystem paths on the OpenCATS server are flagged for separate SFTP transfer and re-linked post-migration. Saved Lists, Cold Call Lists, and any community-built custom fields in OpenCATS require manual reconstruction in Bullhorn's Field Maps and list tools. OpenCATS Workflows and Reports do not migrate as artifacts; we deliver a written inventory of every OpenCATS automation and report definition so your admin can rebuild them in Bullhorn.
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 OpenCATS 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.
OpenCATS
Candidate
Bullhorn ATS & CRM
Candidate
1:1OpenCATS Candidate records map to Bullhorn Candidate records via the Bullhorn REST API. We extract firstName, lastName, email, phone, mobile, address fields, and the Skills comma-separated tag string which migrates as a Bullhorn SkillTextEntries multi-select text field. The resume file path stored in the candidate.resume field is flagged for separate SFTP transfer; we do not embed resume BLOBs but do re-link the file path as a Candidate Attachment after Bullhorn's file ingestion. OpenCATS candidate.website, LinkedIn URL, and social media fields map to Candidate.externalID and Candidate.webUrl fields where present.
OpenCATS
Job Order
Bullhorn ATS & CRM
JobOrder
1:1OpenCATS Job Orders map directly to Bullhorn JobOrder records. Title, description (stored as HTML in opencats.joborder.description), status, city, state, employmentType, salary, and billRate/salaryUnit map to Bullhorn JobOrder.title, description, status, address.city, address.state, employmentType, salary, and payRate. The assigned Recruiter (open_cats_recruiter_id) resolves to the Bullhorn User ownerId. JobOrder.duplicatesForLead maps to Bullhorn JobOrder.isOpen. OpenCATS job-category and industry fields map to custom picklist fields that we create in Bullhorn's Field Maps before migration.
OpenCATS
Company
Bullhorn ATS & CRM
ClientCorporation
1:1OpenCATS Companies map to Bullhorn ClientCorporation. name, address fields, phone, fax, website, and notes map to Bullhorn ClientCorporation.name, address fields, phone, fax, url, and description. OpenCATS supports multiple departments and locations per company record; Bullhorn represents these as separate ClientCorporation branches with a parentClientCorporationId lookup. We flag multi-location companies during scoping and configure the parent-child hierarchy in Bullhorn before import.
OpenCATS
Contact
Bullhorn ATS & CRM
ClientContact
1:1OpenCATS Contacts (hiring managers, client contacts, Cold Call List entries) map to Bullhorn ClientContact. name, title, email, phone, department, and notes map to ClientContact.name, title, email, phone, department, and description. The parent ClientCorporationId is resolved at migration time using company name matching against the ClientCorporation import. Cold Call List membership in OpenCATS maps to Bullhorn ClientContact.customDate3 or a custom list-status picklist field.
OpenCATS
Activity
Bullhorn ATS & CRM
Note and Task
1:1OpenCATS Activity records (call logs, emails, meetings, notes tied to Candidates and Job Orders) map to Bullhorn Note and Task records. opencats_activity.type ('call', 'email', 'note', 'interview') determines whether the record becomes a Bullhorn Note or a Task with the appropriate TaskSubtype. The activity date becomes Task.dateAdded or Note.dateAdded. opencats_activity.submitter maps to Bullhorn OwnerId. Activity notes content migrates as Task.description or Note.description. We preserve the parent record association using Candidate and JobOrder ID lookups resolved at migration time.
OpenCATS
Saved List
Bullhorn ATS & CRM
Candidate List (manual rebuild)
1:1OpenCATS Saved Lists store candidate membership as a join table (candidate_list_membership). We export the list name and candidate ID associations and generate a Bullhorn Candidate List definition for each Saved List, but list membership cannot be restored via the Bullhorn REST API as a bulk operation. We provide a CSV of list-to-candidate memberships for the Bullhorn admin to import via Bullhorn's native List tool or to use as a reference for rebuilding filters. List ordering and ranking do not transfer.
OpenCATS
Calendar Event
Bullhorn ATS & CRM
Placement Calendar Event
1:1OpenCATS Calendar Events map to Bullhorn Event records for interview and meeting scheduling. Title, start time, end time, location, and associated Candidate or Job Order IDs migrate. Bullhorn Event records are tied to the Candidate and JobOrder via EventRelation. We do not migrate recurrence rules or reminder settings; these are not portable across ATS platforms. Events without a valid parent Candidate or JobOrder are logged as standalone Notes.
OpenCATS
User / Recruiter
Bullhorn ATS & CRM
User
1:1OpenCATS User accounts map to Bullhorn User records by email address. First name, last name, email, role, and active status migrate. OpenCATS role permissions (admin, full, limited, read-only, disabled) are documented as a role-mapping reference for the Bullhorn admin to configure Field Level Security and Page Layout assignments post-migration. Bullhorn User provisioning (login creation, permission sets) is done by the Bullhorn admin in the Bullhorn admin console before record migration begins.
OpenCATS
Attachment
Bullhorn ATS & CRM
Candidate Attachment
1:1OpenCATS stores resume files as filesystem paths (e.g., /var/opencats/resumes/123.pdf) in the candidate.resume column, not as database BLOBs. We extract all resume file paths, generate an SFTP manifest for the customer's IT team to copy the files to a Bullhorn-accessible location or upload directly to Bullhorn's document management, and then re-link each file to the corresponding Candidate record using Bullhorn's Attachment REST API. The customer must ensure file path structure is preserved during transfer.
OpenCATS
Custom Fields
Bullhorn ATS & CRM
Custom Fields and Custom Objects
lossyOpenCATS community-built custom fields (stored as additional columns in the MariaDB schema, often added by individual deployments) map to Bullhorn custom fields. For straightforward scalar fields (text, date, number), we create Bullhorn custom fields via Field Maps before migration. For community extensions that define lookup relationships or multi-value fields, we map to Bullhorn Custom Objects available on Bullhorn ATS Growth (2 objects) and Enterprise (10 objects with 55 fields each). The OpenCATS custom field inventory is extracted during discovery and mapped per deployment-specific schema.
OpenCATS
Cold Call List
Bullhorn ATS & CRM
ClientContact + List
1:1OpenCATS Cold Call Lists are a specialized Contact list type used for outreach tracking. We extract Cold Call List membership and map it to a custom status field on ClientContact (e.g., coldCallStatus or outreachStage). List-level cold call tracking notes migrate as Note records on the ClientContact. The Cold Call List name becomes a Bullhorn Candidate List for reference by the Bullhorn admin.
OpenCATS
Report
Bullhorn ATS & CRM
Report (manual rebuild)
1:1OpenCATS generates reports from live data using its own report engine; report definitions are not exportable artifacts. We extract the report list (report name, associated objects, filter criteria, column selections) from the MariaDB schema as a written inventory. Bullhorn's reporting suite (standard reports, advanced reporting dashboards on Enterprise) is documented as the replacement, and we provide a mapping table pairing each OpenCATS report with its nearest Bullhorn report builder equivalent for the Bullhorn admin to configure.
| OpenCATS | Bullhorn ATS & CRM | Compatibility | |
|---|---|---|---|
| Candidate | Candidate1:1 | Fully supported | |
| Job Order | JobOrder1:1 | Fully supported | |
| Company | ClientCorporation1:1 | Fully supported | |
| Contact | ClientContact1:1 | Fully supported | |
| Activity | Note and Task1:1 | Fully supported | |
| Saved List | Candidate List (manual rebuild)1:1 | Fully supported | |
| Calendar Event | Placement Calendar Event1:1 | Fully supported | |
| User / Recruiter | User1:1 | Fully supported | |
| Attachment | Candidate Attachment1:1 | Fully supported | |
| Custom Fields | Custom Fields and Custom Objectslossy | Fully supported | |
| Cold Call List | ClientContact + List1:1 | Fully supported | |
| Report | Report (manual rebuild)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.
OpenCATS gotchas
No REST API forces database-direct migration
Resume files are filesystem references, not embedded blobs
One-week import review delay in OpenCATS native imports
MySQL is unsupported — MariaDB is required
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 database accessibility verification
We audit the source OpenCATS MariaDB installation: schema version, active tables, record counts across Candidates, Job Orders, Companies, Contacts, Activities, Saved Lists, Calendar Events, and Users. We identify any community-added columns or custom tables. We verify database connectivity by confirming port accessibility, testing a read-only connection query, and identifying the MariaDB version (flagging any MySQL-only syntax in use). We also document the OpenCATS server filesystem structure to map resume file paths to a transfer plan. The discovery output is a written migration scope, a record-count estimate, and a list of any OpenCATS custom fields and community modules requiring Bullhorn schema work.
Bullhorn schema configuration and Custom Object provisioning
We review the destination Bullhorn tenant and identify the edition tier (Team, Corporate, or Enterprise) to confirm available custom field limits and Custom Object availability. For scalar custom fields, we configure Bullhorn Field Maps before migration to add any OpenCATS custom fields. For custom objects required by the source schema, we document the Custom Object Setup Sheet (object name, display label, field names and types) and submit it to Bullhorn Support for provisioning. Bullhorn Support typically takes five to ten business days to create Custom Objects. We cannot ingest custom object data until the objects exist in Bullhorn.
Staging migration and record reconciliation
We run a full migration into a Bullhorn Sandbox or a clean production org using representative data volume. We migrate Accounts (from OpenCATS Companies), ClientContacts (from OpenCATS Contacts), Candidates (from OpenCATS Candidates), JobOrders (from OpenCATS Job Orders), and Activities (via REST API for Notes and Tasks). The customer's Bullhorn admin reviews a sample of records for accuracy and flags any field mapping corrections. Any schema adjustments (missing picklist values, incorrect field types, required fields) are resolved in Bullhorn Field Maps before the production migration begins.
Owner and User provisioning coordination
OpenCATS Users and Recruiters map to Bullhorn User records by email address. Before production migration, the customer's Bullhorn admin provisions all active OpenCATS users as Bullhorn Users and assigns them to the appropriate Bullhorn department and role. We extract the full list of Owner IDs from OpenCATS and match them against the provisioned Bullhorn User list. Any unmatched Owner records are held in a reconciliation queue; migration cannot proceed past User-dependent records until ownership is resolved. This step is a manual gate requiring the customer's Bullhorn admin to complete User provisioning.
Production migration in dependency order
We run production migration in record-dependency order: ClientCorporation (first, as it is the parent of ClientContact), ClientContact (with parentClientCorporationId resolved), User provisioning (validated), Candidate (with resume file path recorded for later re-link), JobOrder (with ownerId resolved to Bullhorn User), Activity history (Notes and Tasks via Bullhorn REST API with parent record resolution), Saved List membership (CSV export for Bullhorn List manual rebuild), and Custom Object records (last, after Bullhorn Support has provisioned them). Each phase emits a row-count reconciliation report. During the migration window, we request that the customer freeze new OpenCATS writes to avoid a delta at cutover.
Resume file transfer, re-link, and automation rebuild handoff
We hand off the resume file manifest (Candidate ID to file path mapping) to the customer's IT team for SFTP transfer to Bullhorn's document management. We verify the file count against the manifest and re-link each file to the corresponding Bullhorn Candidate record using the Attachment REST API. We deliver the OpenCATS Workflow, community module, and Report inventory document to the Bullhorn admin team with Bullhorn equivalents documented for each item. We support a five-business-day hypercare window for reconciliation issues. We do not rebuild OpenCATS Workflows as Bullhorn Automation or community modules as Bullhorn Marketplace apps; that work is outside the migration scope and requires a separate Bullhorn implementation engagement.
Platform deep dives
OpenCATS
Source
Strengths
Weaknesses
Bullhorn ATS & CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard HRMS migration. All 7 core objects map 1:1 between OpenCATS and Bullhorn ATS & CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across OpenCATS and Bullhorn ATS & CRM.
Object compatibility
All 7 core objects map 1:1 between OpenCATS and Bullhorn ATS & CRM.
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
OpenCATS: Not applicable — no public API.
Data volume sensitivity
OpenCATS 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 OpenCATS to Bullhorn ATS & CRM migration scoping. Not seeing yours? Book a call.
Walk through your OpenCATS 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 OpenCATS
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.