HRMS migration
Field-level mapping, validation, and rollback between TRAFFIT and Bullhorn ATS & CRM. We move data and schema; workflows are rebuilt natively in Bullhorn ATS & CRM.
TRAFFIT
Source
Bullhorn ATS & CRM
Destination
Compatibility
8 of 12
objects map 1:1 between TRAFFIT and Bullhorn ATS & CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from TRAFFIT to Bullhorn is a lateral-record migration with two structural gaps teams must resolve before data moves: TRAFFIT's candidate activity timeline (calls logged, notes, stage-change events, internal comments) does not export via API or XLS, and TRAFFIT's extended API requires a paid add-on that we confirm during scoping. We scope TRAFFIT objects with stable export paths — candidate profiles, applications, jobs, adverts, CRM persons, tags, and GDPR consents — and map each to its Bullhorn equivalent (Candidate, JobOrder, Candidate_Submission__c, ClientCorporation, ClientContact, and compliance custom fields). Bullhorn's entity model treats Clients and Contacts separately from Candidates, so we split TRAFFIT's candidate-centric CRM Persons into ClientCorporation and ClientContact at migration time. Workflows, automations, and webhook triggers do not migrate; we deliver a written inventory of TRAFFIT automation rules for the customer's Bullhorn admin to rebuild. Bullhorn's implementation timelines run two to six weeks, but data migration alone for a structured TRAFFIT export typically lands within that window if extended API access is confirmed before scoping begins.
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 TRAFFIT 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.
TRAFFIT
Candidate
Bullhorn ATS & CRM
Candidate
1:1TRAFFIT Candidate records map directly to Bullhorn Candidate. We extract first name, last name, email, phone, location, tags, talent-pool status, and custom field values from the TRAFFIT API or filtered XLS export. Soft-deleted candidates require an explicit active-record filter; TRAFFIT's default export may include soft-deleted records which we exclude before import. Bullhorn's Candidate entity stores resume content, skills, and availability alongside contact fields.
TRAFFIT
Candidate Application
Bullhorn ATS & CRM
Candidate_Submission__c (custom)
1:1TRAFFIT applications link a candidate to a job with a stage, source attribution, and timestamp. Bullhorn does not have a native application object separate from Candidate and JobOrder; we create a custom Candidate_Submission__c object to preserve the job-to-candidate association, stage history, source label, and application date. Where Bullhorn's Candidate_Submission__c is already provisioned, we map into that existing custom object.
TRAFFIT
Job (Recruitment)
Bullhorn ATS & CRM
JobOrder
1:1TRAFFIT Jobs map to Bullhorn JobOrder. The job title, description, requirements, status, assigned user, and client reference all transfer directly. TRAFFIT's pipeline stages (from application to hire) map to Bullhorn JobOrder status values or a custom status field. Client assignment in TRAFFIT's job record resolves to the corresponding ClientCorporation in Bullhorn at migration time.
TRAFFIT
Advert
Bullhorn ATS & CRM
JobOrder + JobBoardPosting (custom)
1:manyTRAFFIT Adverts are job-listing records with publication dates, board assignments, and status. We split advert data into the Bullhorn JobOrder (core job content and internal status) and a custom JobBoardPosting object or Bullhorn JobBoardPosting if the module is provisioned, capturing board name, publication date, and advert status. Where Bullhorn's job-board module is not included in the subscription, advert status is recorded in a custom field on JobOrder.
TRAFFIT
CRM Person
Bullhorn ATS & CRM
ClientCorporation + ClientContact
many:1TRAFFIT maintains a separate CRM Persons object for contacts outside the recruitment funnel. Bullhorn separates companies (ClientCorporation) and individuals (ClientContact) as two linked records. We merge each TRAFFIT CRM Person into a ClientContact and derive the ClientCorporation from the CRM Person's company association, creating the parent corporation record if it does not exist. Custom fields on TRAFFIT CRM Persons map to custom fields on ClientContact.
TRAFFIT
User
Bullhorn ATS & CRM
BullhornUser
1:1TRAFFIT user records (role, email, active status) map to Bullhorn BullhornUser entities. Hiring Manager accounts (free-tier in TRAFFIT) map to Bullhorn Employee module records with limited permissions. We resolve TRAFFIT owner references on candidate and job records to Bullhorn User IDs by email match during migration. Any TRAFFIT owner without a matching Bullhorn User is placed in a reconciliation queue for the customer's admin to provision before record import resumes.
TRAFFIT
Tag / Talent Pool
Bullhorn ATS & CRM
CandidateTag + custom label fields
lossyTRAFFIT tags serve both candidate categorization and talent-pool segmentation. We preserve tag names and talent-pool membership as Bullhorn CandidateTag records linked to Candidate. Talent-pool status (active, passive, sourced) is stored in a custom field on Bullhorn Candidate. Where the destination Bullhorn instance uses a different tagging taxonomy, we apply a mapping table documented during scoping.
TRAFFIT
Custom Field (Candidate, Job, CRM Person)
Bullhorn ATS & CRM
Custom Field
lossyTRAFFIT custom fields on Candidates, Jobs, and CRM Persons require pre-creation in Bullhorn before any data import. We validate field types from the TRAFFIT API schema against actual record values during the data audit phase, flag any type-mismatch records, and create Bullhorn custom fields with matching types (text, number, picklist, checkbox, date). Required-flag settings and restricted-editing configurations are replicated at the Bullhorn field level. Field type changes made mid-use in TRAFFIT may cause type-incompatible values that we flag for manual review before import.
TRAFFIT
Document / Attachment
Bullhorn ATS & CRM
Candidate Attachment
1:1Resume files, cover letters, and uploaded documents attached to TRAFFIT candidate profiles export with their file associations. We transfer files as Bullhorn Candidate attachments linked by candidate ID. Bullhorn's storage limits and attachment size caps vary by tier; we verify available storage during scoping and flag any records requiring file compression or document-type prioritization. Files without a valid candidate match go to a review queue.
TRAFFIT
GDPR Consent
Bullhorn ATS & CRM
Consent_Custom_Object__c or compliance fields
1:1TRAFFIT consent records track when candidates gave or withdrew permission for data processing, with timestamps per consent type. We export consent timestamps and type labels, then map to a Bullhorn custom consent object or compliance fields on Candidate (HasOptedOutOfEmail, custom consent date fields). If the TRAFFIT GDPR Assistant add-on has automated anonymization scheduled, we check during discovery whether anonymization has already run, which may leave consent records partially redacted. Any gaps are documented in the consent handoff report.
TRAFFIT
Application Source
Bullhorn ATS & CRM
Custom Picklist on Candidate_Submission__c
1:1TRAFFIT tracks the origin of each application (job board, referral, direct, sourcing tool). We export source labels and attribution data and apply them as a custom picklist value on the Candidate_Submission__c record. Bullhorn's standard source taxonomy differs from TRAFFIT's; we create a mapping table during scoping that collapses or renames TRAFFIT source labels to match Bullhorn's allowed values.
TRAFFIT
Candidate Activity (call, note, stage-change, internal comment)
Bullhorn ATS & CRM
Not migrated
1:1TRAFFIT candidate activity records — calls logged, notes added, stage-change events, and internal comments — are stored in TRAFFIT's internal event system and are not exposed via API or XLS export. We do not migrate activity timelines as there is no stable export path. We disclose this limitation explicitly in scoping and scope only objects with confirmed export routes: candidate profiles, applications, jobs, adverts, CRM persons, tags, and GDPR consents. The customer should plan to rebuild candidate interaction notes as Bullhorn Task records or Note attachments post-migration.
| TRAFFIT | Bullhorn ATS & CRM | Compatibility | |
|---|---|---|---|
| Candidate | Candidate1:1 | Fully supported | |
| Candidate Application | Candidate_Submission__c (custom)1:1 | Fully supported | |
| Job (Recruitment) | JobOrder1:1 | Fully supported | |
| Advert | JobOrder + JobBoardPosting (custom)1:many | Fully supported | |
| CRM Person | ClientCorporation + ClientContactmany:1 | Fully supported | |
| User | BullhornUser1:1 | Fully supported | |
| Tag / Talent Pool | CandidateTag + custom label fieldslossy | Fully supported | |
| Custom Field (Candidate, Job, CRM Person) | Custom Fieldlossy | Fully supported | |
| Document / Attachment | Candidate Attachment1:1 | Fully supported | |
| GDPR Consent | Consent_Custom_Object__c or compliance fields1:1 | Fully supported | |
| Application Source | Custom Picklist on Candidate_Submission__c1:1 | Fully supported | |
| Candidate Activity (call, note, stage-change, internal comment) | Not migrated1: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.
TRAFFIT gotchas
Extended API requires a paid add-on
Activity history is not exportable
Soft-deleted candidates may inflate export scope
GDPR Assistant add-on affects consent data handling
Custom field type changes require re-mapping
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 API access confirmation
We audit the TRAFFIT instance across all object types: Candidates, Applications, Jobs, Adverts, CRM Persons, Tags, Custom Fields, Users, and GDPR Consents. We confirm whether the extended API add-on is active and validate which API endpoints are available for bulk retrieval. We check for active GDPR anonymization policies and review any soft-delete records to establish the active-record filter baseline. The discovery output is a written migration scope with object counts, custom-field schema, GDPR consent audit summary, and a Bullhorn edition recommendation.
Bullhorn schema design and pre-creation
We design the Bullhorn destination schema based on the TRAFFIT object map. This includes creating Bullhorn custom fields (with typed field definitions matching TRAFFIT's field types), provisioning a custom Candidate_Submission__c object for application records, designing the ClientCorporation and ClientContact split for TRAFFIT CRM Persons, and configuring custom picklists for application sources and advert status. Bullhorn entity schema is deployed to a Sandbox or staging org first for validation before any data moves.
Data audit and field mapping
We run a TRAFFIT data audit against the exported records, validating field types against actual values to catch mid-use type changes on custom fields. We identify duplicate candidates, mismatched email formats, and orphaned CRM Persons (those without a parent company association). We produce a field-mapping document that pairs every TRAFFIT field to its Bullhorn equivalent, documents transformation logic (date format normalization, picklist value mapping, tag-to-label conversion), and flags any fields that cannot map due to type incompatibility.
Sandbox migration and reconciliation
We execute a full migration into Bullhorn Sandbox using production-equivalent data volume. The customer's recruitment operations lead reviews record counts (candidates in, applications in, jobs in, CRM contacts in), spot-checks 30-50 random records against TRAFFIT source data, and validates custom field values. Owner mapping is reconciled by email match against Bullhorn User list. Any schema corrections, mapping adjustments, or custom-object provisioning changes happen in Sandbox before production migration begins.
Owner reconciliation and user provisioning
We extract every distinct TRAFFIT user referenced on candidate, job, and CRM person records and match by email against the Bullhorn destination org's User table. TRAFFIT Hiring Manager accounts (free-tier) are mapped to Bullhorn Employee module records. Any TRAFFIT owner without a matching Bullhorn User is held in a reconciliation queue; the customer's Bullhorn admin provisions missing users before production migration resumes.
Production migration in dependency order
We run production migration in record-dependency order: ClientCorporation (parent companies for CRM persons), ClientContact (from CRM persons), Bullhorn Users (provisioned and validated), Candidate (profiles, skills, tags, talent-pool status), JobOrder (jobs with client assignment), Candidate_Submission__c (applications linking candidates to jobs with source attribution), Advert status (as custom fields or linked records on JobOrder), Custom Fields (populated after entity import), GDPR Consents (mapped to compliance custom fields), Documents (as Candidate attachments). Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and automation handoff
We freeze TRAFFIT writes during cutover, run a final delta migration for any records modified during the migration window, then enable Bullhorn as the system of record. We deliver a written inventory of TRAFFIT automation rules (workflow triggers, webhook dependencies, Zapier/Zoho Flow flows) with recommended Bullhorn equivalents (Bullhorn Automation, Bullhorn Tasks, or Salesforce Flow for cross-object logic). We support a five-business-day hypercare window for reconciliation issues raised by the recruitment team. We do not rebuild TRAFFIT automations inside the migration scope.
Platform deep dives
TRAFFIT
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 TRAFFIT 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
TRAFFIT: Not publicly documented in available documentation.
Data volume sensitivity
TRAFFIT 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 TRAFFIT to Bullhorn ATS & CRM migration scoping. Not seeing yours? Book a call.
Walk through your TRAFFIT 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 TRAFFIT
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.