Employment Hero Sync Engine
The data driven sync core every Employment Hero domain module runs on: cross reference, mapping, idempotent upsert, audited runs.
Store price is USD 98 all-in: installing this also pulls the 1 paid ERP Heritage module it depends on.
Why this module
Employment Hero Sync Engine
Re run safely, every time
Each record is keyed to its Employment Hero id through a cross reference, and an unchanged payload is skipped on its hash. Running a job twice updates in place and never duplicates.
Mapping is data, not code
Dotted source paths map to Odoo fields through a registry of safe transformers for dates, relations, value maps and sub lines. No code is stored or evaluated, and mappings can vary by company and country.
No silent overwrite
Separate inbound conflict and outbound push policies decide who wins, per record failures are isolated so one bad record does not abort the run, and every run records counts and a per record line history.
Day in the life
A scheduled run with one bad record
A delta job wakes on its cron, pulls only records changed since the last cursor, and upserts each one inside its own savepoint. One record arrives with a missing required field and fails: it is logged as an error line, the run continues, and it ends in the partial state. The delta cursor advances only to the last success before that failure, so the bad record is re fetched next run instead of being skipped forever. Every outcome is on the run, line by line.
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 re delivered or re run record is matched by its external id cross reference and, when the mapped payload hash is unchanged, skipped rather than rewritten, so repeated runs converge.
Each record is processed inside its own savepoint, so an IntegrityError or a bad value rolls back only that record and the run ends partial instead of aborting the whole batch.
The cursor advances only to the highest success strictly before the earliest failure, and holds entirely when a failure has no readable timestamp, so a failed or out of order record is re fetched rather than silently lost.
A webhook triggered run is forced to newest wins regardless of the job policy, and a delivery with no source timestamp is not allowed to overwrite a newer record.
When a job declares a detail endpoint, a webhook triggered run fetches just that one record by id and never paginates the list, so a delivery and its retries cost one request.
A delete event archives the linked record when the model supports archiving, otherwise unlinks it; a hard delete blocked by a protected child is recorded as skipped and kept, not left to fail on every future run.
Outbound creates carry a stable idempotency key per Odoo record and updates key on the payload hash, and an unchanged outbound payload is skipped, so a retried push is not duplicated and a steady state does not re send.
Cross references, jobs, runs and mappings are scoped by company record rules, and relational lookups are scoped to the connection so two connections holding the same external id never cross bind.
A display mask such as an all asterisk value or the key unavailable placeholder is never sent on a push, so a masked identifier cannot overwrite the real upstream value.
What is inside
Built to do the job, end to end.
- External id cross reference. A dedicated table ties each Odoo record to its Employment Hero id, source timestamp and payload hash, with unique constraints so one record maps to exactly one external id per connection and the reverse lookup stays deterministic.
- Field mapping with transformers. Mapping and mapping line models drive translation both ways through registered transformers: dates, booleans, numbers, value maps, country and currency codes, relations by field or external id, and one to many sub lines from a nested array.
- Sync jobs. A job binds an endpoint, mapping and target model with policy knobs for direction, full or delta mode, batch size and conflict and push policies. Jobs run manually, on a daily scheduled cron, or from a webhook triggered targeted pull, all through one orchestrator.
- Audited runs and lines. Every run records fetched, created, updated, skipped, deleted and failed counts plus timing, and a per record line history of what happened, surfaced on a last run summary for non technical users.
- Conflict and push policies. Inbound precedence (Employment Hero wins, Odoo wins, most recent wins) is separate from outbound push gating, so a freshly configured push or two way job works without disabling either leg.
- Dry run preview. A dry run reports exactly what a job would create, update or skip without writing any record or cross reference, so a mapping can be proven before it touches live data.
Honest about the edges
What this does not do, so nothing surprises you.
- This is the shared sync engine, not a standalone connector. It depends on the connection layer for authentication, transport, pagination and rate limiting, and on a domain module to ship the actual endpoints, mappings and jobs for a given resource.
- Out of the box it ships no business mappings or jobs of its own; the HR, leave, payroll and other domain modules provide those. On its own it gives you the engine, models and configuration screens.
- Webhook delivery itself, including the HTTP receiver, signature verification, deduplication and dead lettering, lives in the separate webhook companion module. This engine provides the webhook aware execution path: targeted single record pull, forced newest wins ordering and upstream delete handling.
- Rate limiting, exponential backoff, token refresh and the encrypted credential store are provided by the connection layer this engine builds on, not implemented here.
- Conflict resolution is policy based at the record level, choosing which side wins; it is not a field by field three way merge.
- The scheduled cron runs once a day by default and processes jobs in sequence. High volume or sub minute synchronisation is a tuning and deployment exercise, not a default.
Employment Hero Odoo integration, Odoo sync engine, external id cross reference, idempotent upsert Odoo, configurable field mapping Odoo, conflict resolution sync, delta sync Odoo, push and pull synchronisation, dry run sync preview, audited sync runs, Odoo 16 Community HR integration, people platform connector Odoo, two way sync Odoo, webhook triggered sync 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.
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.
A dependency free asynchronous job queue that runs long running and fan out work out of band of the request that...
The Australia country pack for the ERP Heritage Employment Hero integration
Sync certifications, qualifications and employee document metadata from the Employment Hero people platform into...
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
Discuss (mail)
|
| Community Apps Dependencies | Show |
| Lines of code | 3505 |
| Technical Name |
eh_hero_sync |
| 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