Data migration
Getting candidates, clients and placements out of JobAdder, Vincere or Bullhorn is real work — and it is work we do, not a spreadsheet template we hand you with our best wishes. Documents come across on the JobAdder connection; no spreadsheet export can carry a CV.
Fear keeps more agencies on bad software than price ever does. Not one of the major recruitment systems lets a departing customer take their data cleanly — full exports sit behind signed request forms, paid engagements and 30-day windows, and what you can get yourself is a capped CSV with the notes and documents missing. That is the whole reason switching feels impossible. So we made it our job rather than yours.
What each one lets you take, and what we do about it. No guessing — this is what their own documentation says.

Getting your data out. The API is the good path, and it is the only one of the three where a placement carries both the pay rate and the charge rate. That is the field every CSV export drops, and the one you cannot rebuild from memory.
What we do. Connect JobAdder with OAuth and we read companies, contacts, candidates, jobs, applications, placements with their rates, hotlists, notes and CV attachments — on an hourly sync, not a one-off dump. You can leave that connection running for as long as you want it.
Getting your data out. Self-service export is a list view capped at 5,000 records at a time, with vendor-fixed columns — so custom fields never come out that way. A full export including CV documents is a chargeable professional-services engagement: submit a form, take a quote, wait about ten business days.
What we do. We take whatever you can get out — the capped CSVs, or the paid export if you buy it — and load it through the import workbench, mapping their columns to ours field by field and showing you every row's verdict before anything is written.
Getting your data out. List-view exports cap at 5,000 to 20,000 records depending on the entity, and rich-text fields do not export at all, so formatted notes are lost on that path. A full backup with your attachments needs two of your named contacts to sign a request, is limited to one every 30 days, and only the final one carries every file.
What we do. Same workbench, same mapping and preview step. Get the request in before your contract lapses — assume no export entitlement survives it — and we will tell you which files to ask for.
Whatever comes out of your old system lands in an import workbench, not a black box. Known exports are recognised and pre-mapped. Everything else — and Bullhorn and Vincere exports are deliberately in this group, because their columns change shape per tenant — gets a best-guess mapping from a synonym table that you correct from a dropdown. A CSV is never rejected for having the wrong header names.
Then the whole file is read and classified before a single record is created: new, update, likely duplicate, junk, or error. You look at that, tick rows in or out, and confirm. Only then does anything touch your data.
The second list matters more than the first. You should hear it from us now, not discover it the week after go-live.
Import order does not decide whether a load succeeds. It decides whether your client records arrive whole or as name-only stubs.
We agree what has to come across, and give you the list of exports to request from your current vendor — with their caps and lead times, so nothing is discovered late.
The files go into the workbench and you say which system they came from. Known exports are pre-mapped; everything else — Bullhorn and Vincere included — gets a best-guess mapping you correct from a dropdown. No CSV is bounced for having the wrong header names.
Nothing is written yet. Every row is read and given a verdict first: new, update, likely duplicate, junk or error. Placeholder emails and repeated header rows are caught here rather than quietly imported.
You read the verdicts, tick rows in or out, and confirm. That click is the first moment anything touches your candidates, clients or placements.
Clients load first, then contacts, candidates, job orders and placements — so children attach to full records, not name-only stubs. Failures come back as a file quoting the spreadsheet row number; fix the sheet, re-upload, and it updates rather than duplicates.
Then the landing gets checked before you go live: row counts against the source, clients that arrived hollow, people with no email, and a rate spot-check on real placements. A wrong rate still looks like a plausible number, so it is read by a person.
JobAdder is the one of the three we hold a live connection to, and it runs both ways. Your consultants keep placing in JobAdder; Workhr reads the placements and runs everything after — rostering, site sign-in, timesheets, pay and bill — and sends worker availability and placement rate changes back up. Pushing application stage moves back the other way is built, and it is switched on per tenant rather than by default, so ask for it at setup. It reconciles every hour and reacts to JobAdder’s own events in between.
Because both systems stay live, both can edit the same record. Workhr does not resolve that by taking the vendor’s word for it: where only you moved a field your edit stands, where only JobAdder moved it theirs applies, and a genuine clash is raised for a person to settle rather than overwritten. That is what makes coexistence a real answer instead of a stalling tactic.
Your files, mapped and imported by us, not a template and good luck.
Every row is classified and shown to you before it becomes a record.
A wrong rate still looks like a plausible number, so it gets read, not assumed.
We’ll map it, load it into a sandbox and show you your own book running in Workhr before you commit to anything.