HRMS migration
Field-level mapping, validation, and rollback between ZippyApp and Bullhorn ATS & CRM. We move data and schema; workflows are rebuilt natively in Bullhorn ATS & CRM.
ZippyApp
Source
Bullhorn ATS & CRM
Destination
Compatibility
10 of 12
objects map 1:1 between ZippyApp and Bullhorn ATS & CRM.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from ZippyApp to Bullhorn is a migration from a QR-code-focused hourly hiring tool to an enterprise ATS and CRM built for staffing agencies. ZippyApp has no documented public API, which means all source data must be extracted manually through account-level screen shares and CSV pulls during scoping. We map Job Seeker records to Bullhorn Candidate objects, employer accounts to ClientCorporation records, open Positions to JobOrder records, and application histories to a Bullhorn Custom Object we pre-configure to preserve the full application lifecycle. Resume and cover letter files migrate as ContentDocument attachments linked to each Candidate record. Bullhorn Custom Objects require Bullhorn Support ticket creation before migration; we handle that request as part of schema design so the destination is ready when data begins moving. Workflows, automations, and hiring notifications do not migrate because ZippyApp stores no persistent workflow definitions and Bullhorn expects its own automation stack to be rebuilt post-migration.
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 ZippyApp 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.
ZippyApp
Job Seeker
Bullhorn ATS & CRM
Candidate
1:1ZippyApp Job Seeker records (name, email, phone, address, work history) map to Bullhorn Candidate. The Job Seeker's application history across multiple employers is preserved by linking each JobSubmission record (see below) to the Candidate. We perform an email-dedupe check at import time: if a Candidate with the same email already exists in Bullhorn, we attach the new application to the existing record rather than creating a duplicate. The original ZippyApp source is stored in a custom text field zippy_source__c for audit.
ZippyApp
Employer
Bullhorn ATS & CRM
ClientCorporation
1:1ZippyApp employer accounts (company profile, branding details, hiring team members) map to Bullhorn ClientCorporation. Industry vertical from the employer profile maps to the ClientCorporation industry field. If the employer operates multiple brands or locations under one account, we create one ClientCorporation per brand and link them via the parentId relationship to preserve the hierarchy. The employer account ID from ZippyApp is stored in a custom field zippy_employer_id__c on the ClientCorporation for reconciliation.
ZippyApp
Position
Bullhorn ATS & CRM
JobOrder
1:1ZippyApp Positions (title, description, location, employment type, QR code reference) map to Bullhorn JobOrder. The Position title maps to JobOrder title; description maps to description; location maps to address or city fields. The ZippyApp QR code reference is stored in a custom text field zippy_qr_code__c on the JobOrder for reference. Employment type (full-time, part-time, seasonal) maps to the JobOrder employmentType field. JobOrder status is set to 'Open' for any Position with status 'Active' in ZippyApp.
ZippyApp
Application
Bullhorn ATS & CRM
JobSubmission
1:1ZippyApp Applications link a Job Seeker to a Position with a status field (submitted, reviewed, dispositioned). We map these to Bullhorn JobSubmission, which links Candidate and JobOrder with its own status field. The original ZippyApp application status is preserved in a custom field zippy_application_status__c on the JobSubmission for audit. If the customer requires employer-specific interview notes, offer terms, or onboarding flags that cannot fit in JobSubmission standard fields, we migrate those to a Custom Object (see below) linked to the JobSubmission.
ZippyApp
Application History
Bullhorn ATS & CRM
Custom Object
1:1ZippyApp stores no persistent engagement history per application, but if the employer has added internal notes or status-change timestamps within the ZippyApp inbox, we migrate these as a Bullhorn Custom Object linked to the JobSubmission. Bullhorn Custom Objects must be requested via Bullhorn Support ticket before migration begins. We file this request during the schema design phase so the Custom Object is provisioned and available when data import starts. The Custom Object name and field schema are defined during scoping based on what internal notes the customer confirms exist in ZippyApp.
ZippyApp
Resume
Bullhorn ATS & CRM
CandidateResume (ContentDocument)
1:1ZippyApp resume files (PDF or DOCX attachments to Job Seeker records) are extracted as binary blobs and uploaded to Bullhorn as CandidateResume file records linked to the Candidate. Bullhorn parses the resume to populate candidate skills, work history, and education fields automatically. We store the original file name and ZippyApp upload timestamp in custom fields on the CandidateResume record. If the resume is a DOCX with embedded formatting that does not parse cleanly, we fall back to attaching it as a ContentDocument with a manual parse flag.
ZippyApp
Cover Letter
Bullhorn ATS & CRM
ContentDocument
1:1ZippyApp cover letters are optional file attachments per application. We attach them to the corresponding Bullhorn Candidate or JobSubmission Custom Object as ContentDocument records via ContentDocumentLink, with the document title set to 'Cover Letter - [Position Title]'. We flag in the migration report whether a cover letter was present for each application so the recruiter sees it at a glance without opening the file.
ZippyApp
Hiring Notifications
Bullhorn ATS & CRM
Not migrated
1:1Push notifications and email alerts generated by ZippyApp during the hiring workflow are transient communication events stored by the notification service, not as persistent records in ZippyApp's database. We do not migrate them because they are not retrievable as structured data and have no Bullhorn equivalent that preserves the same delivery context.
ZippyApp
Custom Employer Branding Assets
Bullhorn ATS & CRM
Not migrated
1:1Employer logos, brand colors, and QR-code graphics tied to ZippyApp employer accounts are media assets that do not map cleanly to any standard Bullhorn object. Bullhorn supports employer branding through its Career Portal configuration and JobOrder branding fields, which the customer's admin rebuilds post-migration based on their brand guidelines.
ZippyApp
ZippyApp User
Bullhorn ATS & CRM
User
1:1ZippyApp employer accounts contain named hiring team members who may have user-level roles. We map these to Bullhorn User records by matching email address. If a ZippyApp user has no corresponding Bullhorn User at migration time, they are placed in a reconciliation queue and the customer's Bullhorn admin provisions the User before the relevant records are assigned. OwnerId references on ClientCorporation and JobOrder records are resolved at this stage.
ZippyApp
Position Source
Bullhorn ATS & CRM
JobOrder sourceTracking
lossyZippyApp does not track candidate sourcing attribution as a first-class field. If the employer used QR codes tied to specific locations or campaigns, we capture this as a custom field zippy_source_channel__c on JobOrder. Bullhorn's standard source tracking fields (source, referredBy) are available on JobOrder for the customer's admin to populate if they implement source attribution post-migration.
ZippyApp
Application Status Values
Bullhorn ATS & CRM
JobSubmission status + custom picklist
lossyZippyApp application statuses (submitted, reviewed, dispositioned, archived by accidental UI action) do not map directly to Bullhorn's JobSubmission status values. We define a status mapping during scoping: submitted maps to 'New', reviewed maps to 'Interview', dispositioned maps to 'Rejected' or 'Offer Extended' based on employer intent, and any archived records are flagged with a custom status value pending admin review. The mapping is validated in sandbox before production migration.
| ZippyApp | Bullhorn ATS & CRM | Compatibility | |
|---|---|---|---|
| Job Seeker | Candidate1:1 | Fully supported | |
| Employer | ClientCorporation1:1 | Fully supported | |
| Position | JobOrder1:1 | Fully supported | |
| Application | JobSubmission1:1 | Fully supported | |
| Application History | Custom Object1:1 | Fully supported | |
| Resume | CandidateResume (ContentDocument)1:1 | Fully supported | |
| Cover Letter | ContentDocument1:1 | Fully supported | |
| Hiring Notifications | Not migrated1:1 | Not supported | |
| Custom Employer Branding Assets | Not migrated1:1 | Not supported | |
| ZippyApp User | User1:1 | Fully supported | |
| Position Source | JobOrder sourceTrackinglossy | Fully supported | |
| Application Status Values | JobSubmission status + custom picklistlossy | 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.
ZippyApp gotchas
No public API requires manual data export scoping
Glitchy UI causes accidental application dispositioning
Enterprise tier pricing is opaque and requires direct inquiry
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 manual export scoping
We schedule a screen-share session with the customer's ZippyApp admin to navigate the employer dashboard, count Job Seekers, Applications, and Positions, and confirm which CSV exports are available. We review any internal notes or status-change history visible in the inbox. We also confirm the employer account structure (single employer vs multiple locations or brands) and identify any hiring team members who need Bullhorn User provisioning. The discovery output is a written scope document with record counts, a gap assessment of any data that cannot be extracted, and a Bullhorn edition recommendation based on the customer's size.
Bullhorn Custom Object ticket and schema design
If the customer requires a Custom Object to preserve application history or employer-specific notes, we complete the Bullhorn Custom Object Setup Sheet and submit it to Bullhorn Support during this step. In parallel, we design the Bullhorn destination schema: custom fields on Candidate, ClientCorporation, and JobOrder; Record Types if the customer manages multiple lines of business; and the field mapping from ZippyApp application status to Bullhorn JobSubmission status. The schema is deployed to a Bullhorn Sandbox first for validation before any production migration begins.
Manual data extraction and transformation
We guide the customer's ZippyApp admin through exporting available CSV data (Job Seeker list, employer list, Position list, Application history) and capturing any data visible only in the UI. Resume and cover letter files are downloaded as binary attachments. All source data is ingested into our staging environment where we apply the transformation logic: email dedupe across Job Seekers, status mapping, custom field population, and file naming conventions. Any records with missing required fields (Candidate without email, JobOrder without title) are flagged in a pre-migration exception report.
Sandbox migration and reconciliation
We run a full migration into a Bullhorn Sandbox using production-like data volume. The customer's hiring manager and Bullhorn admin reconcile record counts (Candidates in, ClientCorporations in, JobOrders in, JobSubmissions in), spot-check 20-30 random records against the ZippyApp source, and verify that resume attachments are linked and readable. The customer signs off on the sandbox migration before we proceed to production. Any mapping corrections happen here.
Production migration in dependency order
We run production migration in record-dependency order: Users (provisioned by Bullhorn admin and validated), ClientCorporations (from ZippyApp employers), Candidates (with email dedupe applied), JobOrders (with ClientCorporationId resolved), JobSubmissions (with CandidateId and JobOrderId resolved), Custom Object records (linked to JobSubmission), and resume/cover letter attachments (linked to Candidate or Custom Object via ContentDocument). Each phase emits a row-count reconciliation report before the next phase begins. We use Bullhorn's REST API with exponential backoff and batch chunking for all standard object inserts.
Cutover, validation, and automation rebuild handoff
We freeze ZippyApp 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 a written inventory of Bullhorn Workflows and Automation Rules that the customer should configure post-migration (ourced from Bullhorn's standard workflow library and the customer's hiring process description). We support a five-business-day hypercare window where we resolve any reconciliation issues raised by the recruiting team. We do not configure Bullhorn Workflows as part of the standard migration scope; that work is documented separately for the customer's Bullhorn admin or implementation partner.
Platform deep dives
ZippyApp
Source
Strengths
Weaknesses
Bullhorn ATS & CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard HRMS migration. All 7 core objects map 1:1 between ZippyApp and Bullhorn ATS & CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across ZippyApp and Bullhorn ATS & CRM.
Object compatibility
All 7 core objects map 1:1 between ZippyApp 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
ZippyApp: Not publicly documented.
Data volume sensitivity
ZippyApp 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 ZippyApp to Bullhorn ATS & CRM migration scoping. Not seeing yours? Book a call.
Walk through your ZippyApp 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 ZippyApp
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.