Bullhorn logoDeel logo

Recruitment to HR

Bullhorn to Deel integration: first placement as a direct employee with a contract in Deel

With an integration between Bullhorn and Deel, the first approved placement of an employee at your own entity becomes a direct employee in Deel, with contract, full-time or part-time, start date, end date and salary from the placement. Contractors from Bullhorn and next placements of the same person do not create a new employee in Deel.

What the integration does

Organisations that place people through Bullhorn and use Deel as the HR system for their own employees enter the person in Deel by hand after every first placement. Deel then asks for team, seniority and nationality, which are not recorded in Bullhorn or recorded differently.

  1. The recruiter approves the Placement in Bullhorn.
  2. KoppelHet reads the placement and leaves contractors and existing employees aside.
  3. Team and seniority are looked up in Deel; nationality comes from a custom field in Bullhorn.
  4. KoppelHet creates the direct employee with contract, without an invitation.
  5. The Deel ID goes into the link table; errors go to HR as an alert.
Bullhorn → KoppelHet → DeelSOURCEBullhornTARGETDeelKoppelHetmapping · logging · monitoringBullhorn → KoppelHet → DeelSOURCEBullhornTARGETDeelKoppelHetmapping · logging · monitoring
Out: Placement with dates, hours per day, salary and unit · Candidate with name, email, country and nationality · Direct employee with contract in Deel · Link table from Bullhorn candidate to Deel ID

What to watch for with Bullhorn and Deel

  • We did not find a Deel integration for Bullhorn. According to Deel's current guide, you create an employee of the own entity, paid through your own payroll, with one call that creates person and contract together. KoppelHet uses that route for placements in employment.
  • Deel requires nationality for a direct employee, and Bullhorn has no standard nationality field for a candidate. We set up a custom field for it; if it is empty, KoppelHet creates nothing and the recruiter gets an alert.
  • For a direct employee Deel knows full-time and part-time, and part-time requires a percentage. Bullhorn records hours per day. KoppelHet converts the hours with the number of working days to a percentage of the entity's full week and chooses full-time or part-time with it.
  • The salary on a placement has a unit, such as per hour or per year. Deel assumes a salary is annual if you give no period. KoppelHet always passes the unit from Bullhorn, so an hourly wage does not end up in the contract as an annual salary.
  • A permanent placement has no end date in Bullhorn, and a contract without an end date is open-ended in Deel. For a temporary placement KoppelHet carries the end date over into the contract in Deel.
  • If you leave out the invitation, Deel sends the new employee an invitation at once. KoppelHet switches it off, because a placement is often approved weeks before the start date; HR invites when it suits.
  • Because Deel creates person and contract together with every call, a second placement of the same candidate would produce a second employee. KoppelHet sets the Bullhorn candidate number as external ID in Deel, keeps a link table and sends a next placement to HR as an alert.
  • Contractors and 1099 workers from Bullhorn do not belong to the own entity and do not go through this route. The employee type on the placement decides that; only Employee and W2 become a direct employee.

How we build and run it

  • The integration runs on the KoppelHet platform, hosted in a data centre in the EU.
  • Every sync and every error is visible in the functional log; on an error your administrator is notified.
  • A change that cannot go through is not half-applied but queued for another attempt.
  • KoppelHet is ISO 27001 certified. Data travels encrypted and stays on the platform no longer than needed.
  • After go-live we manage the integration and adjust it when your process changes.
  • The integration fits next to your existing integration layer. Only the fields in the design are transferred; the platform keeps no register of its own.

Implementation, architecture and compliance

Implementation and price

This is not an app you switch on. We build the integration for your organisation on our platform, with building blocks we reuse on every project. So it is custom work that does not start from scratch.

A consultant prepares the intake and analyses both systems. We then record the mapping and exceptions field by field, test in the test or acceptance environment and go live at a moment you choose. Costs are a one-off amount for the setup and a monthly amount for platform, monitoring and support.

Price indication · Basic

Leave your work email and you see the price indication right away.

We only use your address to follow up on your question about this integration.

Frequently asked questions

Does Deel then run payroll?

No. According to Deel a direct employee is paid through your own payroll; Deel is the HR system.

Can contractors go to Deel too?

Not in the first version. A contractor contract in Deel can be added later as an extension.

What if a placement is extended?

HR then gets an alert with the new end date and adjusts the contract in Deel.

Technical details for IT

For those who want to know how it works under the hood: APIs, fields and sources used.

  • Bullhorn through the REST API after OAuth 2.0 and a REST login with BhRestToken. Event subscription on Placement (INSERTED and UPDATED) with GET event/subscription. Placement employeeType, employmentStartDate, dateEnd, hoursPerDay, salary and salaryUnit; Candidate firstName, lastName, email, address.countryID and a custom field for nationality.
  • To Deel through POST /rest/people (version 2026-01-01, scope people:write): data.client with team.id and legal_entity.id; data.employee with email, country, first_name, last_name, nationality and external_id; data.employment with type FULL_TIME or PART_TIME, job_title, seniority, start_date, end_date and part_time_percentage; data.compensation_details with salary, currency and scale (ANNUAL by default, also MONTHLY and HOURLY); data.invitation.action DISABLE. Seniority from GET /lookups/seniorities, team from GET /teams.

Which fields are transferred

The key fields. The full mapping is agreed per customer.

Field in BullhornField in DeelNotes
Candidate firstName en lastNameemployee.first_name en employee.last_name
Candidate emailemployee.email
Candidate address.countryIDemployee.countryBullhorn number translated to country code
Eigen kandidaatveld nationaliteitemployee.nationality
Placement employmentStartDate en dateEndemployment.start_date en end_dateEmpty for permanent, so open-ended
JobOrder title (via de plaatsing)employment.job_title
Placement hoursPerDayemployment.type en part_time_percentage
Placement salary en salaryUnitcompensation_details.salary en scalePer hour becomes HOURLY, yearly ANNUAL
Candidate idemployee.external_id

Related

Which systems do you want to connect?

Tell us which systems you use and what should happen automatically. Together we define the smallest working solution, with a clear design and a quote before building.