HRMS migration

Migrate from OpenCATS to Bullhorn ATS & CRM

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 logo

OpenCATS

Source

Bullhorn ATS & CRM

Destination

Bullhorn ATS & CRM logo

Compatibility

92%

11 of 12

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

Complexity

BStandard

Timeline

4-6 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

OpenCATS logo

OpenCATS

What's pushing teams away

  • Missing modern ATS essentials — no built-in interview scheduling, candidate assessments, or background-check integrations.
  • Security concerns: MD5 password hashing is a documented vulnerability that fails modern security audits.
  • Steep installation and admin learning curve — non-technical teams struggle to stand it up without IT or DevOps help.
  • No bulk-recruiting features — high-volume teams find the per-record workflow prohibitive at scale.
  • No native calendar integration — OpenCATS cannot sync with Google Calendar, Outlook, or any external calendar system, forcing manual coordination outside the tool.

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 OpenCATS objects map to Bullhorn ATS & CRM

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

maps to

Bullhorn ATS & CRM

Candidate

1:1
Fully supported

OpenCATS 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

maps to

Bullhorn ATS & CRM

JobOrder

1:1
Fully supported

OpenCATS 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

maps to

Bullhorn ATS & CRM

ClientCorporation

1:1
Fully supported

OpenCATS 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

maps to

Bullhorn ATS & CRM

ClientContact

1:1
Fully supported

OpenCATS 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

maps to

Bullhorn ATS & CRM

Note and Task

1:1
Fully supported

OpenCATS 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

maps to

Bullhorn ATS & CRM

Candidate List (manual rebuild)

1:1
Fully supported

OpenCATS 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

maps to

Bullhorn ATS & CRM

Placement Calendar Event

1:1
Fully supported

OpenCATS 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

maps to

Bullhorn ATS & CRM

User

1:1
Fully supported

OpenCATS 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

maps to

Bullhorn ATS & CRM

Candidate Attachment

1:1
Fully supported

OpenCATS 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

maps to

Bullhorn ATS & CRM

Custom Fields and Custom Objects

lossy
Fully supported

OpenCATS 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

maps to

Bullhorn ATS & CRM

ClientContact + List

1:1
Fully supported

OpenCATS 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

maps to

Bullhorn ATS & CRM

Report (manual rebuild)

1:1
Fully supported

OpenCATS 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.

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.

OpenCATS logo

OpenCATS gotchas

High

No REST API forces database-direct migration

Medium

Resume files are filesystem references, not embedded blobs

Low

One-week import review delay in OpenCATS native imports

Medium

MySQL is unsupported — MariaDB is required

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

  • OpenCATS has no REST API — we connect directly to MariaDB

    OpenCATS exposes no documented REST or GraphQL API. All data lives in a MariaDB database on the self-hosted server. We connect directly to that database using customer-provided credentials to extract Candidates, Job Orders, Companies, Contacts, Activities, and Saved List membership. The customer must confirm port 3306 (or the custom port) is accessible from our migration environment, or provide a VPN tunnel and SSH credentials for secure access. If the OpenCATS server is running MySQL instead of MariaDB (older deployments), SQL dialect differences in GROUP_CONCAT, DATE_FORMAT, or ROW_NUMBER syntax may cause export query failures; we detect the database engine during connection and adjust queries accordingly.

  • Resume files are filesystem paths, not embedded blobs

    Candidate resume files (PDF, DOC, RTF) are stored as file paths on the OpenCATS server disk, not as BLOBs in the database. We extract all text fields cleanly through MariaDB, but the actual resume files must be transferred separately via SFTP, file share, or direct upload. We generate a file manifest mapping each resume path to its Candidate record so the customer can transfer files and we re-link them to Bullhorn Candidate records post-ingestion. If the OpenCATS server is decommissioned before file transfer completes, resume files may be lost permanently.

  • Bullhorn Custom Objects require Bullhorn Support to create

    Bullhorn Custom Objects (customObject1s through customObject10s) cannot be created via the REST API by the customer; Bullhorn Support must provision them first using the Custom Object Setup Sheet. We identify which OpenCATS custom fields require Custom Object mapping during discovery, document the required object and field definitions, and submit the setup sheet to Bullhorn Support on the customer's behalf or guide them through submission. This adds one to two weeks to the migration timeline before data migration can begin.

  • Saved Lists and Cold Call List ordering do not migrate

    OpenCATS Saved Lists store candidate IDs in a membership join table. We export the list names and candidate IDs as a CSV for manual import into Bullhorn's List tool. Bullhorn's List membership is defined by saved-search filters, not a static membership table, so list ordering, manual ranking, and weighted candidate ordering from OpenCATS are not preserved. The customer should use the exported CSV to rebuild priority ordering within Bullhorn's list filter criteria.

  • OpenCATS workflows and community-built modules do not migrate

    OpenCATS community extensions (often PHP modules installed from the GitHub repository or third-party contributors) have no Bullhorn equivalent. Any workflow-like automation or custom module added to OpenCATS is outside the scope of our migration. We do not migrate OpenCATS Workflows or community modules as code. We deliver a written inventory of every detected OpenCATS automation, extension, and custom module with a description of what it does and a recommendation for the Bullhorn equivalent (Bullhorn Automation, Bullhorn Workflow, or a third-party Bullhorn Marketplace app). The customer's Bullhorn admin rebuilds these post-migration.

Migration approach

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

Context on both ends of the pair

OpenCATS logo

OpenCATS

Source

Strengths

  • Zero-cost, zero-vendor-commitment ATS for teams validating recruiting workflows
  • Full database schema is self-hosted — you own all data with no extraction fees
  • Customizable branding, modules, and company logo for client-facing job boards
  • Skill tagging and list-building replace the deprecated resume parser for candidate categorization
  • Community forum and GitHub repository for self-service troubleshooting and code customization

Weaknesses

  • No official API — migrations require direct MariaDB access or CSV list exports, not real-time sync
  • MySQL is explicitly unsupported; MariaDB is required, which complicates some hosting environments
  • Resume parsing was removed from the core product; users rely on manual skill tagging instead
  • Self-administered hosting means you own security patching, backups, and server maintenance
  • Community-supported only — no SLA, no dedicated support tier, no guaranteed response times
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. All 7 core objects map 1:1 between OpenCATS and Bullhorn ATS & CRM.

B

Overall complexity

Standard migration

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

  • Object compatibility

    A

    All 7 core objects map 1:1 between OpenCATS and Bullhorn ATS & CRM.

  • 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

    OpenCATS: Not applicable — no public API.

  • Data volume sensitivity

    B

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

Estimator

Estimate your OpenCATS 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 OpenCATS to Bullhorn ATS & CRM data migrations

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

Can't find your answer?

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 consultation

Straightforward migrations under 20,000 Candidates, 5,000 Job Orders, and 2,000 Companies with no custom objects and clean data complete in four to six weeks. Migrations exceeding 50,000 Candidates, large Activity histories, or those requiring Bullhorn Custom Object provisioning (which requires Bullhorn Support to create before data can flow) extend to eight to fourteen weeks. The Bullhorn Custom Object setup alone can add one to two weeks because Bullhorn Support rather than the API provisions the objects. OpenCATS data freeze and delta reconciliation at cutover add a small buffer to the final week.

Adjacent paths

Related migrations to explore

Ready when you are

Move from OpenCATS.
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