

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.
- The recruiter approves the Placement in Bullhorn.
- KoppelHet reads the placement and leaves contractors and existing employees aside.
- Team and seniority are looked up in Deel; nationality comes from a custom field in Bullhorn.
- KoppelHet creates the direct employee with contract, without an invitation.
- The Deel ID goes into the link table; errors go to HR as an alert.
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 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.
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 Bullhorn | Field in Deel | Notes |
|---|---|---|
Candidate firstName en lastName | employee.first_name en employee.last_name | |
Candidate email | employee.email | |
Candidate address.countryID | employee.country | Bullhorn number translated to country code |
Eigen kandidaatveld nationaliteit | employee.nationality | |
Placement employmentStartDate en dateEnd | employment.start_date en end_date | Empty for permanent, so open-ended |
JobOrder title (via de plaatsing) | employment.job_title | |
Placement hoursPerDay | employment.type en part_time_percentage | |
Placement salary en salaryUnit | compensation_details.salary en scale | Per hour becomes HOURLY, yearly ANNUAL |
Candidate id | employee.external_id |
Related
Bullhorn → AFAS Profit
Bullhorn to AFAS integration: a consultant's first placement starts onboarding
Bullhorn → BambooHR
Bullhorn to BambooHR integration: first placement as an employee with a status row in BambooHR
Bullhorn → Dayforce
Bullhorn to Dayforce integration: first placement of an employee as an employee in Dayforce
Bullhorn → HiBob
Bullhorn to HiBob integration: an approved placement as a new employee in Bob