HRMS migration
Field-level mapping, validation, and rollback between Recruiterflow and Bullhorn ATS & CRM. We move data and schema; workflows are rebuilt natively in Bullhorn ATS & CRM.
Recruiterflow
Source
Bullhorn ATS & CRM
Destination
Compatibility
11 of 12
objects map 1:1 between Recruiterflow and Bullhorn ATS & CRM.
Complexity
CModerate
Timeline
6-8 weeks
Overview
Moving from Recruiterflow to Bullhorn is a migration from a smaller-agency-focused ATS to the staffing industry's most widely deployed platform. Recruiterflow stores recruitment data as Candidates, Jobs, Placements, Companies, Contacts, and Deals across a flat schema with API-key authentication and undocumented rate limits. Bullhorn stores the same logical objects on a Salesforce-backed platform that enforces 50 concurrent sessions, 100,000 API calls per month, and 1,500 calls per minute. We resolve the authentication transition (static RF-Api-Key to OAuth 2.0), source the Recruiterflow custom field schema before extraction, chunk large record sets to stay within Bullhorn's monthly call budget, and preserve Off-Limits records as Bullhorn Tags. We do not migrate Recruiterflow sequences, workflows, or AI agent configurations as code; we deliver a written inventory for your Bullhorn admin to rebuild in Bullhorn Automation Engine or Bullhorn Flow.
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 Recruiterflow 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.
Recruiterflow
Candidate
Bullhorn ATS & CRM
Candidate
1:1Recruiterflow Candidates map directly to Bullhorn Candidate. Standard fields (firstName, lastName, email, phone, status, source) map 1:1. Custom candidate fields from Recruiterflow migrate to Bullhorn custom Candidate fields. We source the Recruiterflow custom field definition from Recruiterflow support before extraction because the API does not return field definitions alongside record data. Off-Limits flags stored as candidate tags or custom fields in Recruiterflow migrate as Bullhorn Tags with a compliance category. ATS Growth (Team Edition) Bullhorn customers cannot use the API for candidate import; we flag this before migration begins.
Recruiterflow
Contact
Bullhorn ATS & CRM
Contact
1:1Recruiterflow Contacts (client-side relationships) map to Bullhorn Contact. The company association links to Bullhorn ClientCorporation via the corporationID lookup. Contact lifecycle stages from Recruiterflow migrate as custom fields or picklist values on Bullhorn Contact depending on the customer's configuration preference during scoping.
Recruiterflow
Job
Bullhorn ATS & CRM
JobOrder
1:1Recruiterflow Jobs map to Bullhorn JobOrder. Job title, description, location, employment type, and owner migrate directly. Recruiterflow job pipeline stages map to Bullhorn JobOrder status and custom status fields. Each JobOrder requires an assigned User (the owner/recruiter) that we resolve via email matching against Bullhorn Users. JobOrder creation must precede any Candidate-to-Job associations (submissions, placements) because those references are foreign keys.
Recruiterflow
Placement
Bullhorn ATS & CRM
Placement
1:1Recruiterflow Placements map to Bullhorn Placement. Placements carry compensation data (fee, startDate, endDate, payRate, billRate) and placement status. Bullhorn Placement requires a valid JobOrder reference and a Candidate reference; we validate both exist in Bullhorn before inserting Placements. If the Recruiterflow Job does not have a corresponding JobOrder in Bullhorn, we hold Placements in a reconciliation queue pending JobOrder creation.
Recruiterflow
Company
Bullhorn ATS & CRM
ClientCorporation
1:1Recruiterflow Companies map to Bullhorn ClientCorporation. Company name, address, industry, size, and associated contacts migrate directly. ClientCorporation is created before any related Contact, JobOrder, or Placement records because those objects reference corporationID as a lookup. Custom company fields migrate as Bullhorn custom fields on ClientCorporation using the schema sourced from Recruiterflow support.
Recruiterflow
Deal
Bullhorn ATS & CRM
Opportunity
1:1Recruiterflow Deals track revenue opportunities tied to Companies. They map to Bullhorn Opportunity with deal value, stage, and owner migrated. Deal-specific fields like custom deal stages and client-specific probability mappings require Bullhorn Opportunity custom fields. Opportunity must have a valid ClientCorporation (Account) reference; we resolve this via company name or domain matching during the transform phase.
Recruiterflow
User / Team Member
Bullhorn ATS & CRM
User
1:1Recruiterflow Users map to Bullhorn User records. Owner assignments on Candidates, Jobs, Placements, Companies, Deals, and Activities all reference a Bullhorn User. We match Recruiterflow Users by email against Bullhorn Users and hold unmatched owners in a reconciliation queue for Bullhorn admin provisioning before migration resumes. ATS Growth edition does not include API access; if the destination Bullhorn is ATS Growth, User provisioning and record assignment require manual Bullhorn admin action.
Recruiterflow
Activity: Calls
Bullhorn ATS & CRM
Task (TaskSubtype = Call)
1:1Recruiterflow call logs migrate to Bullhorn Task records with TaskSubtype=Call. Call disposition, duration, and outcome stored in Recruiterflow's call activity endpoint migrate as Bullhorn custom Task fields. Activity timestamps preserve the original Recruiterflow activity date for timeline continuity. Bullhorn enforces 100,000 API calls per month; large call histories are chunked and scheduled across off-peak hours to avoid exceeding the monthly limit.
Recruiterflow
Activity: Notes
Bullhorn ATS & CRM
Note
1:1Recruiterflow notes migrate to Bullhorn Note records. Notes are associated with the parent record (Candidate, Contact, JobOrder, ClientCorporation, Opportunity, or Placement) via the Bullhorn note's targetID and targetType fields. Rich text content migrates as-is. Bullhorn's Note object does not support file attachments directly; any attached documents migrate separately via Bullhorn's document endpoints.
Recruiterflow
Activity: Custom Activities
Bullhorn ATS & CRM
Custom Activity via Note or Task
lossyRecruiterflow exposes separate API endpoints for each custom activity type. Bullhorn has no generic custom activity object, so we map custom activity types to either Bullhorn Note records (for informational entries) or custom Task records with a custom TaskSubtype or type field that the customer defines during scoping. The choice depends on whether the custom activity represents a timestamped event (Task) or a free-text annotation (Note). We document the mapping per custom activity type in the migration specification.
Recruiterflow
Document
Bullhorn ATS & CRM
Document or ContentDocument
1:1Documents attached to Candidates, Jobs, Companies, or Placements in Recruiterflow (accessible via GET /api/external/document/get) are downloaded and re-uploaded to Bullhorn as attachments on the corresponding record. Bullhorn uses either its native Document object or Salesforce ContentDocument if the Bullhorn instance is on the Salesforce platform. We preserve document names and MIME types; binary content re-uploads as-is.
Recruiterflow
Sequence Enrollment
Bullhorn ATS & CRM
Tag on Candidate
1:1Recruiterflow sequence enrollments (email, SMS, WhatsApp, social) cannot migrate as active campaign memberships because Bullhorn Automation Engine uses a different cadence model. We export sequence membership and step data, then flag each enrolled Candidate with a Bullhorn Tag indicating the original sequence name and enrollment status (active, completed, stopped) so that the Bullhorn admin can re-enroll candidates in equivalent Bullhorn Automation Engine sequences post-migration. We do not migrate sequence step content or cadence logic.
| Recruiterflow | Bullhorn ATS & CRM | Compatibility | |
|---|---|---|---|
| Candidate | Candidate1:1 | Fully supported | |
| Contact | Contact1:1 | Fully supported | |
| Job | JobOrder1:1 | Fully supported | |
| Placement | Placement1:1 | Fully supported | |
| Company | ClientCorporation1:1 | Fully supported | |
| Deal | Opportunity1:1 | Fully supported | |
| User / Team Member | User1:1 | Fully supported | |
| Activity: Calls | Task (TaskSubtype = Call)1:1 | Fully supported | |
| Activity: Notes | Note1:1 | Fully supported | |
| Activity: Custom Activities | Custom Activity via Note or Tasklossy | Fully supported | |
| Document | Document or ContentDocument1:1 | Fully supported | |
| Sequence Enrollment | Tag on Candidate1: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.
Recruiterflow gotchas
API uses static API key with no OAuth 2.0 flow
Email campaign send limits and sender throttling
Off-Limits records enforce compliance but have no export endpoint
No publicly documented bulk export or batch API endpoint
Custom field schema varies by object and is not self-describing via API
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 verification
We audit the source Recruiterflow account for record volumes (Candidates, Contacts, Jobs, Placements, Companies, Deals), custom field definitions (requested from Recruiterflow support), active sequences and enrollments, activity history volume, Off-Limits candidate list, and User/Team Member count. We verify the destination Bullhorn edition: if ATS Growth, we pivot to a structured export deliverable rather than API-based import. We confirm Bullhorn API access is enabled and collect OAuth 2.0 credentials (Bullhorn Client ID and Client Secret) versus Recruiterflow's static RF-Api-Key. The discovery output is a written migration scope, record count by object, and a Bullhorn edition confirmation.
Schema design and custom field provisioning
We design the Bullhorn destination schema. This includes creating Bullhorn custom fields on Candidate, Contact, JobOrder, Placement, ClientCorporation, and Opportunity using the Recruiterflow custom field definitions sourced from Recruiterflow support. Bullhorn custom fields are created via the Bullhorn REST API using the entity-specific field metadata endpoint. We define Bullhorn Tags for Off-Limits compliance boundaries and for sequence enrollment flags. Bullhorn Workflow Rules and Bullhorn Flow configurations that need rebuilding post-migration are inventoried from Recruiterflow's workflow list and documented for the customer.
Sandbox migration and reconciliation
We run a full migration into a Bullhorn sandbox environment (if available) or a parallel Bullhorn instance using production-like data volume. Bullhorn built on Salesforce uses Salesforce REST API for data access; we run REST API calls against the sandbox org to validate authentication, field mappings, and Bullhorn API call consumption. The customer's Bullhorn admin reconciles record counts and spot-checks 25-50 random records against the Recruiterflow source. Any mapping corrections, custom field type adjustments, or Bullhorn tag definitions happen in this phase before production migration begins.
Owner reconciliation and User provisioning
We extract every distinct Recruiterflow User referenced on Candidates, Jobs, Placements, Companies, Deals, and Activities and match by email against Bullhorn Users. Recruiterflow Owners without a matching Bullhorn User go to a reconciliation queue. The customer's Bullhorn admin provisions any missing Bullhorn Users. If Bullhorn ATS Growth is confirmed, User provisioning is manual. Migration cannot proceed past this step because Bullhorn's foreign key references (Candidate ownerID, JobOrder assignedUserID, Placement recruiterID) require valid User records to exist first.
Production migration in dependency order
We run production migration in record-dependency order: ClientCorporation (Companies first because Contacts, JobOrders, and Placements reference it), Contacts, Users (validated), JobOrders, Candidates, Opportunities (Deals), Placements (requires JobOrder and Candidate to exist), Activity history (Tasks, Notes, custom activities via Bulk API with chunking), Documents, and Off-Limits Tags. Each phase emits a row-count reconciliation report before the next phase begins. Bullhorn API call consumption is tracked per phase; large activity migrations are spread across off-peak hours to stay within the 100,000-call monthly budget.
Cutover, validation, and automation rebuild handoff
We freeze Recruiterflow writes during cutover, run a final delta migration of any records created or modified during the migration window, then enable Bullhorn as the system of record. We deliver the workflow and sequence inventory document to the customer's Bullhorn admin for rebuilding in Bullhorn Automation Engine or Bullhorn Flow. We support a one-week hypercare window to resolve any reconciliation issues. We do not rebuild Recruiterflow workflows, AI agent configurations, or sequences as Bullhorn automation code; that is a separate engagement or an internal Bullhorn admin task.
Platform deep dives
Recruiterflow
Source
Strengths
Weaknesses
Bullhorn ATS & CRM
Destination
Strengths
Weaknesses
Complexity grading
Moderate HRMS migration. 1 of 7 objects need a mapping; the rest are 1:1.
Overall complexity
Moderate migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Recruiterflow 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
Recruiterflow: Not publicly documented — we throttle to 60 req/min based on observed behavior and competitor API patterns.
Data volume sensitivity
Recruiterflow 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 Recruiterflow to Bullhorn ATS & CRM migration scoping. Not seeing yours? Book a call.
Walk through your Recruiterflow 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 Recruiterflow
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.