| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Recruitment (hr_recruitment)
• Discuss (mail) • Calendar (calendar) • Employees (hr) |
| Community Apps Dependencies | Show |
| Lines of code | 3646 |
| Technical Name |
eh_hero_ats |
| License | OPL-1 |
| Website | https://www.erpheritage.com.au/ |
| Versions | 16.0 17.0 18.0 19.0 |
Employment Hero ATS Job Sync
Pull recruitment job openings from the people platform into standard Odoo Recruitment, keyed by external id so every re-run is safe.
Store price is USD 137 all-in: installing this also pulls the 2 paid ERP Heritage modules it depends on.
Why this module
Employment Hero ATS Job Sync
One read only job, done properly
The published ATS embedded API is read only and exposes job openings, so this module pulls openings into hr.job. No invented two way sync, no candidate or application endpoints that do not exist in the API.
Re-sync without duplicates
Each opening is tracked by its external id in a cross reference table. Re-running the job upserts instead of duplicating, and an unchanged payload is detected by hash and skipped, so a nightly run stays cheap and clean.
Retune the mapping, not the code
The job mapping ships as data you can edit: title to name, description, department by name, number of openings, requirements. Adjust a source path or target field in the UI without a module upgrade overwriting it.
Day in the life
A nightly pull that just keeps the recruitment board current
You create an ATS connection (product ATS, ATS Token auth) and point it at your organisation. The ATS Jobs pull job walks every page of openings, maps each onto an hr.job, and resolves its department by name against your existing hr.department records. A new opening upstream becomes a new Odoo job, an edited title or opening count updates the existing one, and an opening that has not changed since last night is skipped. Each run records what it created, updated and skipped, so a recruiter opens Odoo Recruitment to a board that matches the platform without anyone re-keying a single posting.
Edge cases
The cases most modules quietly ignore.
In the shipped code today, each one a place where a cheaper module silently does the wrong thing.
Every opening is keyed by its ATS id through a cross reference row, so a second run of the same job updates the existing hr.job rather than creating a duplicate.
The mapped values plus a fingerprint of the mapping are hashed. An opening whose payload has not changed is recorded as skipped, not rewritten, so steady state runs are cheap.
Each opening is processed inside its own savepoint. One bad row is logged as an error line and the run continues to completion in a partial state instead of aborting the whole pull.
The transport retries transient failures (5xx, timeout) and 429 with exponential backoff and jitter, honouring and clamping a server Retry-After header so a buggy header cannot park a worker for hours.
The puller walks page_index and item_per_page pages, reading the data.items envelope, and stops on a short or empty page. A page cap is warned loudly so a truncated pull is never silent.
The department is resolved by name against hr.department. An opening with a department name that does not exist yet maps cleanly without it, rather than failing the whole record.
An opening with no id at the configured path is rejected as an error line for that record alone, so a malformed payload cannot silently create an unkeyed, undeduplicatable job.
The connection and the sync job are both scoped to a company, and the job resolves the default connection for its product and company, so two companies pull their own openings independently.
What is inside
Built to do the job, end to end.
- ATS endpoints, registered as data. Three ATS endpoints ship as data: jobs, departments and countries, each under the ats/api/v1/embedded/organisations path with header token auth and page paging. The jobs endpoint is wired to the pull job; departments and countries are available for the department by name resolution and for tuning.
- The ATS Jobs pull job. A single sync job (ATS Jobs, pull direction, full mode by default) drives the import: fetch paginated, map, resolve via the external id cross reference, then create or update the hr.job and record a per record sync line.
- Editable job mapping. The mapping onto hr.job ships with noupdate set so your edits survive upgrades: title to name (required), description, department by name to department_id, number of openings to no_of_recruitment, and requirements.
- ATS token header auth. The ATS API authenticates with a configurable header token (X_ATS_TOKEN by default) rather than Basic or Bearer. You store the token on an ATS connection and the transport carries it on every call.
- Shared sync engine. The add on rides the suite engine: idempotent upsert keyed by external id, per record savepoint isolation, retry with backoff, audited sync runs and lines, dry run preview, and multi company connection resolution.
Honest about the edges
What this does not do, so nothing surprises you.
- Read only. The published ATS embedded API is read only, so this module pulls openings into Odoo and never writes back to the platform. There is no two way sync.
- Job openings only. The ATS API exposes no public candidate or application endpoint, so candidates, applications and pipeline stages are not synced.
- No real time webhook for ATS in this module. Openings refresh when the pull job runs (scheduled or manual), not on an upstream push event.
- Department is resolved by name against existing hr.department records. It does not create departments, so a name that has no match is left unset on the job.
- Inbound only conflict handling. The platform is treated as authoritative on pull (Employment Hero wins). There is no bidirectional conflict resolution because nothing is pushed.
- Optional add on, not in the suite bundle. It depends on the suite connector and sync engine plus Odoo hr_recruitment, and is meant only for sites that use Employment Hero recruitment.
- An Employment Hero ATS subscription and a valid ATS token are required. This module does not provide the platform account or the API access.
Employment Hero ATS Odoo, Employment Hero recruitment integration, ATS job sync Odoo, Employment Hero job openings hr.job, Odoo recruitment connector, Employment Hero Odoo 19, ATS token API integration, people platform recruitment sync, idempotent ATS connector, Odoo Community recruitment integration, Employment Hero suite add on, hr.job import from ATS
Need this fitted to the way you work?
ERP Heritage delivers end to end Odoo work: Odoo Implementation, Customization and Development, Integration, Migration, Consultation, Support and Training. We help teams put this module into production, shape it to their process, and keep it running.
We work with businesses across Australia (Melbourne, Sydney, Brisbane, Perth, Adelaide, Canberra) and the Middle East (Dubai, Abu Dhabi, Riyadh, Jeddah, Doha, Kuwait City, Muscat). Start a conversation at erpheritage.com.au or email info@erpheritage.com.au.
Languages
Available in 19 languages
The interface ships translated out of the box. Switch language in Odoo and the fields, menus, and messages follow.
Modules teams pair with this one.
Premium ERP Heritage modules that extend the same stack, each built to the same engineering bar.
Sync Employment Hero leave categories, leave requests and leave balances into the standard Odoo Time Off app, wit...
Show the Hijri (Umm al-Qura) date alongside Gregorian dates across Odoo 19
Connect Odoo partner records to the Saudi SPL National Address service and the Wathq commercial registry
One click install of the full Employment Hero integration for Odoo Community, covering the connector, two way syn...
The New Zealand country pack for the ERP Heritage Employment Hero integration
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Recruitment (hr_recruitment)
• Discuss (mail) • Calendar (calendar) • Employees (hr) |
| Community Apps Dependencies | Show |
| Lines of code | 3646 |
| Technical Name |
eh_hero_ats |
| License | OPL-1 |
| Website | https://www.erpheritage.com.au/ |
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module