HRMS migration
Field-level mapping, validation, and rollback between SignalHire and Bullhorn ATS & CRM. We move data and schema; workflows are rebuilt natively in Bullhorn ATS & CRM.
SignalHire
Source
Bullhorn ATS & CRM
Destination
Compatibility
7 of 12
objects map 1:1 between SignalHire and Bullhorn ATS & CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
SignalHire and Bullhorn serve fundamentally different functions in a recruiting stack. SignalHire is a B2B contact database and enrichment platform optimized for outbound prospecting at scale, while Bullhorn is a full ATS and recruitment CRM designed to manage the candidate lifecycle from lead through placement. Migrating from SignalHire to Bullhorn means extracting professional profile records and contact details from SignalHire's database and loading them as Bullhorn Candidates and ClientCorporations with enriched contact data preserved in custom fields. The migration does not recreate SignalHire's live-prospect enrichment workflow inside Bullhorn; it delivers a one-time import of the customer's existing SignalHire-sourced contact records into Bullhorn's persistent candidate database. We flag the absence of a native SignalHire export feature upfront and work from CSV enrichment exports and API lookups to reconstruct the record set. Workflows, automations, credit balances, and integration configurations do not migrate because SignalHire's credit-consumption model and Bullhorn's workflow engine are structurally incompatible.
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 SignalHire 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.
SignalHire
People Profile
Bullhorn ATS & CRM
Candidate
1:1SignalHire People Profiles map directly to Bullhorn Candidate records. The person's name maps to firstName and lastName; current job title maps to Candidate.occupation; current employer maps to Candidate.companyName; location maps to Candidate.address. SignalHire's verification status (Valid / Risky / Unknown) is preserved in a custom field sh_email_verification__c. The SignalHire UID is stored in a custom field sh_profile_id__c as an audit reference. If the SignalHire profile contains work history beyond the current position, employment records migrate as Bullhorn CandidateEmployment records via the employmentHistory sub-entity or as a structured note if the destination Bullhorn instance does not have the employment sub-entity enabled.
SignalHire
Company Profile
Bullhorn ATS & CRM
ClientCorporation
1:1SignalHire Company Profiles map to Bullhorn ClientCorporation records. Company name maps to ClientCorporation.name; domain maps to ClientCorporation.website; industry maps to ClientCorporation.industry; size range maps to ClientCorporation.numberOfEmployees or a custom size-tier field. SignalHire's company records are scraped derivatives from professional profile pages rather than authoritative company data, so we flag this provenance in a custom field sh_company_provenance__c. If the staffing agency already uses Bullhorn's ClientCorporation structure for real clients, SignalHire company profiles are imported as separate records with a type flag to distinguish sourced prospects from active client accounts.
SignalHire
Email Address (verified)
Bullhorn ATS & CRM
Candidate.email
1:1The primary verified email address from SignalHire maps to Candidate.email. Additional emails on the profile map to Candidate.email2 and Candidate.email3. The SignalHire deliverability status (Valid / Risky / Unknown) is preserved per address in custom fields sh_email1_status__c, sh_email2_status__c, and sh_email3_status__c. Risky-flagged emails are flagged in Bullhorn but not excluded from import; the customer's admin decides whether to suppress outreach to those addresses.
SignalHire
Phone Number
Bullhorn ATS & CRM
Candidate.phone
1:1SignalHire phone numbers with country code and line type (mobile/landline) map to Candidate.phone, Candidate.phone2, and Candidate.phone3. The SignalHire verification confidence score is preserved in custom fields sh_phone1_confidence__c and sh_phone2_confidence__c. Mobile numbers are flagged with a sh_phone1_type__c custom field set to Mobile or Landline. If SignalHire returns no phone for a profile, no phone field is populated in Bullhorn.
SignalHire
Social Profile (LinkedIn)
Bullhorn ATS & CRM
Candidate.customText34 (LinkedIn URL field)
1:1SignalHire's LinkedIn URL maps to Bullhorn's standard Candidate.customText34 field, which is the designated LinkedIn URL field in Bullhorn's Candidate Search! configuration. Any additional social profiles (Twitter, GitHub, etc.) are stored in a custom text area sh_social_links__c as a semicolon-delimited URL list. The LinkedIn UID from SignalHire is preserved in sh_linkedin_uid__c for reference.
SignalHire
Lead List / Talent Pool
Bullhorn ATS & CRM
Custom Object (list membership) or Candidate custom field
lossySignalHire talent pools and lead lists represent a many-to-many membership relationship between profiles and named lists. Bullhorn has no native equivalent for named prospect lists as a standalone object type. We resolve this by either creating a Bullhorn CustomObject (CustomObject1) to store list membership as records with a lookup to Candidate plus a listName field, or by using a Candidate custom picklist field (sh_talent_pool__c) with multi-select values for list membership. The choice depends on the number of lists and the expected query patterns. During import, we reconstruct each list by resolving the SignalHire profile UIDs to Bullhorn Candidate IDs and writing the membership records. If CustomObject is chosen, Bullhorn Support ticket is required to provision the custom object before migration begins.
SignalHire
Email Verification Status
Bullhorn ATS & CRM
Candidate custom fields
lossySignalHire's per-email deliverability scoring (Valid, Risky, Unknown) has no native Bullhorn equivalent. We create custom fields sh_email1_status__c, sh_email2_status__c, and sh_email3_status__c on the Candidate entity as picklist fields with those three values. This allows Bullhorn admins to filter candidates by email quality for outreach prioritization or suppression. The custom fields are deployed via Bullhorn metadata API or Admin Field Mappings before the Candidate import begins.
SignalHire
Phone Confidence Score
Bullhorn ATS & CRM
Candidate custom fields
lossySignalHire's phone verification confidence (high/medium/low or numeric score) is preserved in custom fields sh_phone1_confidence__c and sh_phone2_confidence__c on the Candidate entity. Bullhorn does not have a native confidence scoring model for phone numbers, so this is a custom field configuration. The confidence value is stored as text to accommodate both numeric scores and label-based confidence tiers depending on what SignalHire returned for each record.
SignalHire
Company Size Range
Bullhorn ATS & CRM
ClientCorporation custom field
lossySignalHire company profiles include a size range (e.g., 51-200 employees) rather than a precise headcount. Bullhorn's ClientCorporation.numberOfEmployees field is an integer field. We map SignalHire's size range to a custom picklist field sh_company_size_range__c on ClientCorporation to preserve the original granularity, and we optionally populate numberOfEmployees with the midpoint of the range as an approximate integer for reporting purposes. The custom field is created before the company import phase.
SignalHire
Employment History (extended)
Bullhorn ATS & CRM
CandidateEmployment sub-entity
1:manyIf the SignalHire profile includes multiple employment periods (past job titles and employers), these map to Bullhorn's CandidateEmployment sub-entity on the Candidate record. Each employment period maps: title to CandidateEmployment.title, companyName to CandidateEmployment.companyName, startDate and endDate to CandidateEmployment.dateAdded and endDate, and location to CandidateEmployment.location. Employment history is loaded after the parent Candidate record is created to satisfy the entity dependency.
SignalHire
SignalHire UID
Bullhorn ATS & CRM
Candidate custom field
1:1The SignalHire-generated profile UID is stored in a custom field sh_profile_id__c on the Candidate record. This field is non-editable by recruiters and serves as an audit reference linking Bullhorn records back to the original SignalHire source data. It is critical for reconciliation if the customer needs to cross-reference migrated records against a future SignalHire export or if a data dispute arises post-migration.
SignalHire
Team Member (SignalHire account users)
Bullhorn ATS & CRM
Bullhorn User
1:1SignalHire team member records (name, email, role) are extracted for documentation purposes only. Bullhorn User records must be provisioned through Bullhorn's own user management, not imported. We provide a team roster reconciliation document listing every SignalHire team member with their email and role so the Bullhorn admin can provision matching Users before migration begins. User-level permission structures are not exposed via SignalHire API and must be manually reconfigured in Bullhorn by the admin.
| SignalHire | Bullhorn ATS & CRM | Compatibility | |
|---|---|---|---|
| People Profile | Candidate1:1 | Fully supported | |
| Company Profile | ClientCorporation1:1 | Fully supported | |
| Email Address (verified) | Candidate.email1:1 | Fully supported | |
| Phone Number | Candidate.phone1:1 | Fully supported | |
| Social Profile (LinkedIn) | Candidate.customText34 (LinkedIn URL field)1:1 | Fully supported | |
| Lead List / Talent Pool | Custom Object (list membership) or Candidate custom fieldlossy | Fully supported | |
| Email Verification Status | Candidate custom fieldslossy | Fully supported | |
| Phone Confidence Score | Candidate custom fieldslossy | Fully supported | |
| Company Size Range | ClientCorporation custom fieldlossy | Fully supported | |
| Employment History (extended) | CandidateEmployment sub-entity1:many | Fully supported | |
| SignalHire UID | Candidate custom field1:1 | Fully supported | |
| Team Member (SignalHire account users) | Bullhorn User1: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.
SignalHire gotchas
Unlimited plan credit cap is hidden in tooltip text
Credit consumed per lookup, not per successful result
API async mode requires a publicly accessible callback URL
Company profiles are scraped derivatives, not authoritative records
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 SignalHire data reconstruction
We audit the SignalHire account for profile volume, company profile volume, email and phone counts, talent pool names and membership sizes, and team roster. Because SignalHire lacks a bulk export feature, we determine the reconstruction method: if the customer has prior enrichment CSV exports, we use those; if not, we run SignalHire API lookups by profile UID or by name-and-company combinations to reconstruct the dataset. We calculate the expected credit consumption for API reconstruction and advise the customer before any lookups are performed. We also document the existing talent pool structure and list names to inform the Bullhorn custom object or tagging strategy.
Bullhorn schema design and custom field creation
We design the Bullhorn destination schema before any data moves. This includes creating custom fields on Candidate (sh_profile_id__c, sh_email_status__c, sh_phone_confidence__c, sh_linkedin_url__c, sh_talent_pool__c) and on ClientCorporation (sh_company_size_range__c, sh_company_provenance__c). If the talent pool membership requires a CustomObject, we open a Bullhorn Support ticket to provision CustomObject1 and define its schema (listName as a string field, candidateId as a reference to Candidate). We also configure Bullhorn Field Mappings to expose these custom fields in the appropriate Page Layouts. Schema is deployed into a Bullhorn sandbox or staging environment first for validation.
Sandbox migration and reconciliation
We run a full migration into the Bullhorn sandbox using a representative data volume sample (typically 10-20% of total records). The customer's recruiting operations lead reconciles record counts in Bullhorn against the SignalHire source data, spot-checks 25-50 randomly selected Candidates for field-level accuracy (name, email, phone, LinkedIn URL, verification status), and validates that talent pool membership is correctly reconstructed. Any mapping corrections, custom field type adjustments, or list reconstruction issues are identified here and fixed before production migration begins.
SignalHire profile enrichment run (if needed)
If the customer does not have sufficient CSV export history and the API reconstruction will consume significant credits, we coordinate a structured enrichment run against the SignalHire profile UIDs before production migration. This is sequenced after sandbox sign-off so that the final dataset is known. We apply a conservative rate-limit strategy against the SignalHire API to avoid credit overruns and generate a run log for cost tracking. The enrichment output is a normalized CSV that feeds the production Bullhorn import.
Production migration in dependency order
We run production migration into Bullhorn in record-dependency order: ClientCorporation records first (from SignalHire Company Profiles), then Candidate records (from SignalHire People Profiles) with ClientCorporationId resolved for company affiliation, then phone and email fields with verification custom fields populated, then LinkedIn and social links, then CandidateEmployment sub-records for any extended work history, then CustomObject1 records for talent pool membership reconstruction. Each phase emits a row-count reconciliation report before the next phase begins. SignalHire writes are not frozen during migration because SignalHire is read-only for the migration use case; any new records added during migration are caught in a delta pass after sandbox sign-off.
Cutover, validation, and rebuild handoff
We perform a final delta pass to capture any SignalHire records created or modified after the main extraction. We deliver a migration summary report with record counts per object, a list of any records that failed validation and were held in a retry queue, and a talent pool reconstruction summary. We provide a written SignalHire integration inventory documenting any active SignalHire-to-Bullhorn integrations, API keys, and webhook configurations that the customer's admin must rebuild inside Bullhorn's integration framework. We support a one-week post-migration window for reconciliation issues. We do not rebuild SignalHire's enrichment workflow inside Bullhorn; that is a separate consulting engagement focused on Bullhorn Automation and Bullhorn AI configuration.
Platform deep dives
SignalHire
Source
Strengths
Weaknesses
Bullhorn ATS & CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard HRMS migration. All 7 core objects map 1:1 between SignalHire and Bullhorn ATS & CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across SignalHire and Bullhorn ATS & CRM.
Object compatibility
All 7 core objects map 1:1 between SignalHire 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
SignalHire: Not publicly documented; credits serve as the primary usage gate rather than explicit request-rate limits.
Data volume sensitivity
SignalHire exposes a bulk API — large-volume migrations stream efficiently.
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 SignalHire to Bullhorn ATS & CRM migration scoping. Not seeing yours? Book a call.
Walk through your SignalHire 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 SignalHire
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.