| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Attendances (hr_attendance)
• Employees (hr) • Discuss (mail) • Time Off (hr_holidays) • Calendar (calendar) • Invoicing (account) • Project (project) |
| Community Apps Dependencies |
Show
•
Employment Hero Attendance
• Employment Hero Australia • Employment Hero Canada • Employment Hero Connector • Employment Hero Country Base • Employment Hero Documents • Employment Hero HR • Employment Hero Leave • Employment Hero Malaysia • Employment Hero New Zealand • Employment Hero Onboarding • Employment Hero Payroll Bridge • Employment Hero Queue • Employment Hero Singapore • Employment Hero Sync Engine • Employment Hero Timesheet • Employment Hero UK • Employment Hero Webhook |
| Lines of code | 7797 |
| Technical Name |
eh_hero |
| License | OPL-1 |
| Website | https://www.erpheritage.com.au/ |
| Versions | 16.0 17.0 18.0 19.0 |
Employment Hero Suite
One install brings in the whole Employment Hero connector: dual auth transport, idempotent two-way sync, signed webhooks, a retrying queue and country packs.
Store price is USD 427 all-in: installing this also pulls the 18 paid ERP Heritage modules it depends on.
Why this module
Employment Hero Suite
Install once, get the entire integration
This module depends on every component in the Community suite and resolves them in the correct order. You install one thing and the connector, sync engine, queue, webhooks, HR apps and country packs all come in together, instead of wiring a dozen modules by hand.
Idempotent two-way sync that does not duplicate
Jobs run pull, push or both. Records are keyed by external id and hashed, so a re run never duplicates and an unchanged record is skipped. Conflict policies are explicit, and a webhook is forced to newest wins so an out of order delivery cannot overwrite newer data.
Retry, isolate and dead letter, not silent loss
Webhooks are verified with a constant time HMAC check and protected against replay. Work runs on an in database queue that retries with backoff and parks poison jobs in a dead letter state with an alert. One bad record is isolated on a savepoint so a run finishes partial, not aborted.
Day in the life
A normal day on the connector
A new hire is added in Employment Hero. The HR platform fires a webhook to your Odoo endpoint. The receiver verifies the HMAC signature in constant time, checks it is not a replay, records the event and queues it, then answers 200 in milliseconds so delivery never hangs. The queue drains the job, which does a targeted pull of just that one employee by external id rather than re paginating the whole list. The mapper applies your field mapping, the orchestrator finds no existing cross reference, creates the employee and registers the external id link. Meanwhile a scheduled delta sync pulls only records changed since the last run, and overnight the payroll bridge imports the latest finalised pay run as a balanced, posted journal entry. Every API call and every sync run is logged for audit. If a delivery fails, it retries with backoff; if it keeps failing, it dead letters and raises an activity on the connection so someone sees it.
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.
A webhook redelivered with the same external event id is caught by a database unique constraint and a pre check, and answered 200 as a duplicate, so a retried delivery never creates a second event or a second record.
Transient 5xx, timeouts and 429 responses are retried with exponential backoff plus jitter. A server Retry-After header is honoured but clamped, so a hostile or buggy header cannot park a worker for hours.
Each record syncs inside its own savepoint. A single bad record is logged as an error line and the run continues, ending in the partial state instead of rolling back every record after it.
Every record is keyed through a cross reference table unique on model, connection and external id, and hashed, so running a job twice is a no op for unchanged records and never duplicates.
Webhook triggered updates are forced to newest wins. A delivery with no usable timestamp, or older than the stored record, is skipped rather than allowed to overwrite newer data, and same entity deliveries run on an ordered channel.
The client paginates by odata, page number or cursor and stops on a short page. If a hard page cap is hit, results are flagged as truncated in the log rather than silently dropped.
OAuth2 refresh is single flight: the token row is locked for update in an autonomous transaction so concurrent workers do not each spend the rotating refresh token and overwrite a good token with a dead one.
A job that fails every retry is parked in a dead letter state, and for webhook dispatch it posts a message and raises a to do activity on the connection so a poison delivery is never silently lost.
The payroll bridge refuses to post a pay run that does not balance, absorbs sub cent rounding on a configured account, and isolates each pay run so one bad run is skipped rather than aborting the import.
Tokens are tagged with a key fingerprint. A decrypt under the wrong key fails with an actionable message, and a rotation helper re encrypts tokens from a previous key to the current one.
What is inside
Built to do the job, end to end.
- Connector core and transport. A single client for every Employment Hero call with three auth strategies (API key Basic, OAuth2 Bearer, header token for ATS), retry with exponential backoff and jitter on transient and 429 responses, odata, page and cursor pagination driven by data, an idempotency key on writes, token bucket rate limiting that can meter one shared budget across workers, and a full API call log.
- Sync engine. Pull, push or both per job. Fetch, map, resolve by external id cross reference, apply conflict policy, create or update, record a per record line and advance a delta cursor that never moves past a failed record. Dry run preview, mapping fingerprint so a mapping change forces a rewrite, and per record savepoint isolation ending in a partial state.
- Webhooks and queue. A public endpoint that verifies HMAC SHA-256 in constant time, caps body size, rejects before writing, dedupes by external event id and queues for async dispatch. The queue claims jobs with row locks (SELECT FOR UPDATE SKIP LOCKED), retries with backoff, dead letters poison jobs, reaps jobs left running by a crashed worker, and serialises same entity work on ordered channels.
- HR coverage and payroll bridge. Employees, departments, bank accounts, leave categories and requests, attendance with kiosk and geofence metadata, timesheets, certifications, documents, onboarding and goals sync into the matching Odoo apps. The payroll bridge imports finalised pay runs into accounting as balanced, posted journal entries, idempotent by pay run id, with multi currency and rounding handling.
- Country packs. Localised identifier fields for Australia (TFN, ABN, super fund), New Zealand (IRD number), the United Kingdom (National Insurance number), Singapore (NRIC or FIN and CPF), Malaysia (EPF, SOCSO and MyKad) and Canada (Social Insurance Number), with sensitive identifiers encrypted at rest where the field carries them.
- Security and audit. OAuth2 tokens encrypted at rest with Fernet, with the key able to live outside the database and a rotation helper. Credentials are restricted to system administrators and never written to logs. Sync runs and API calls are recorded as an append only trail that reads cleanly into a compliance audit without preparing exports.
Honest about the edges
What this does not do, so nothing surprises you.
- This module is a convenience bundle. It carries no models or views of its own; it depends on the component modules, which hold all the logic, and each of those installs on its own if you want a lighter footprint.
- Sync runs on the jobs and mappings you configure. The engine, endpoints and mappings ship as data, but you decide which jobs to enable, their direction and their conflict policy before anything moves.
- Scheduled sync runs on Odoo cron, so its cadence is bounded by your cron interval. Webhooks give near immediate updates for the events Employment Hero is configured to send.
- The in database queue is sized for light to medium volume without an external broker. Very high throughput deployments should plan worker capacity accordingly.
- The payroll bridge imports finalised pay runs as accounting journals on Community. It is a one way import of pay run journals, not a full payroll calculation engine.
- Country packs add the localised identifier fields and mappings named in the listing. They are not a full statutory payroll or filing localisation.
- OAuth2 token storage requires the cryptography package. By design the suite refuses to store a token unencrypted rather than downgrading to plaintext.
- This is the Community suite and needs no Enterprise. Separate Enterprise overlay modules exist for Documents, Planning and payroll work entries; a module requires Enterprise only when its name says so.
Employment Hero Odoo integration, Employment Hero connector Odoo 16, Employment Hero sync Odoo Community, KeyPay Odoo integration, Employment Hero payroll journal Odoo, Employment Hero webhook Odoo, Employment Hero HR sync Odoo, OAuth2 connector Odoo, two way sync Odoo Employment Hero, Employment Hero API Odoo, Odoo HR integration suite, Employment Hero leave attendance timesheet sync, Odoo 16 Community HR connector, Employment Hero country packs Odoo
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.
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 16
Connect Odoo partner records to the Saudi SPL National Address service and the Wathq commercial registry
Sync Employment Hero ATS recruitment job openings into the standard Odoo Recruitment app, mapping each opening on...
The New Zealand country pack for the ERP Heritage Employment Hero integration
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Attendances (hr_attendance)
• Employees (hr) • Discuss (mail) • Time Off (hr_holidays) • Calendar (calendar) • Invoicing (account) • Project (project) |
| Community Apps Dependencies |
Show
•
Employment Hero Attendance
• Employment Hero Australia • Employment Hero Canada • Employment Hero Connector • Employment Hero Country Base • Employment Hero Documents • Employment Hero HR • Employment Hero Leave • Employment Hero Malaysia • Employment Hero New Zealand • Employment Hero Onboarding • Employment Hero Payroll Bridge • Employment Hero Queue • Employment Hero Singapore • Employment Hero Sync Engine • Employment Hero Timesheet • Employment Hero UK • Employment Hero Webhook |
| Lines of code | 7797 |
| Technical Name |
eh_hero |
| 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