Employment Hero Timesheet Sync
Pull Employment Hero timesheet entries into the standard Odoo Timesheets app as analytic lines, mapped by configuration, no code.
Store price is USD 117 all-in: installing this also pulls the 2 paid ERP Heritage modules it depends on.
Why this module
Employment Hero Timesheet Sync
Standard Timesheets, not a shadow model
Entries land as account.analytic.line in the stock Odoo Timesheets app, so existing reports, approvals and project hours work unchanged. No custom timesheet object to learn.
Tune the mapping without code
Endpoints, the field mapping and the sync job ship as data. The starter mapping covers note, employee, project, task, date and quantity, and a deployment adjusts source paths from the user interface to match its own Employment Hero payload.
Run it again and nothing duplicates
Every entry is keyed by its Employment Hero id through a durable cross reference, and an unchanged payload is skipped by hash. A failed entry is isolated and re-fetched next run instead of poisoning the batch.
Day in the life
A week of hours, reconciled without re-keying
Approved timesheet entries sit in Employment Hero. The scheduled sync pulls them page by page and writes each as an Odoo analytic line, resolving the employee, project and any task through the external id cross reference. An entry whose project is not yet mapped is flagged on the run and skipped, so the rest of the batch still lands. The next run pulls only what changed since the last cursor, and re-running the same window creates nothing new because each entry is already keyed by its Employment Hero id.
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.
Each entry is keyed by its Employment Hero id through the external id cross reference, so re-running a job never creates a duplicate; an unchanged mapped payload is skipped by hash.
Each entry is processed in its own savepoint. One bad entry is recorded as an error line and the run continues to a partial state rather than aborting the whole batch.
The cursor advances only to the high-water mark of entries that processed cleanly and never past a failed one, so a failed or concurrently changed entry is re-fetched next run instead of being skipped forever.
Odoo requires a project on every analytic line. An entry whose project does not resolve through the cross reference is reported as an error and skipped, not written against no project.
The pull walks pages using the HR platform page index and item-per-page style, stopping on a short or empty page, with a page cap that logs loudly when results would be truncated.
Transient failures, timeouts and 429 responses are retried with exponential backoff and jitter, honouring a clamped Retry-After header; non-retryable errors raise immediately.
Calls draw from a token bucket, cross-worker by default, so a multi-worker deployment stays under one shared budget and avoids 429 storms.
OAuth2 connections refresh the access token lazily when expired, with rotation handled in the connection model, so a long pull does not fail on an expired token.
If a previously linked Odoo line was deleted, the dangling cross reference is cleared and the entry is recreated on the next run rather than silently skipped.
What is inside
Built to do the job, end to end.
- Three endpoints. An organisation-level timesheet list endpoint, a per-employee list endpoint and an organisation-level create endpoint, all shipped as data so a deployment can point them at its own resource paths.
- Starter field mapping. Six mapping lines plus an optional task line: note to description, employee, project, task, date and worked quantity to unit amount, with the relations resolved by the m2o_by_external transformer. Marked noupdate so a tuned mapping survives upgrades.
- One sync job. A two-way timesheet job targeting account.analytic.line, keyed on the entry id with an updated_at delta path and an eh_wins inbound conflict policy. The push leg ships with an empty domain so it stays inert until enabled.
- Runs the standard ways. Manual run, dry-run preview, or the suite's daily scheduled cron, all driven through the same orchestrator with per-record sync lines for an auditable trail of what was created, updated, skipped or errored.
- Built on the suite engine. Depends on eh_hero_sync and hr_timesheet. The cross reference, pagination, retry, rate limiting and OAuth handling live in the shared engine, so this module stays thin and predictable.
Honest about the edges
What this does not do, so nothing surprises you.
- Inbound pull is the supported flow out of the box. The job also ships a push leg, but it is disabled by default with an empty domain and only creates entries upstream; a deployment must narrow the domain and enable it deliberately.
- The push leg maps only a create endpoint, so it creates new entries in Employment Hero rather than updating existing ones.
- Sync runs on the scheduled cron, on a manual run, or via dry-run preview. This module does not ship a live webhook receiver, so updates arrive on the next scheduled run rather than instantly.
- Odoo requires a project on every analytic line. A default project must exist and be mapped through the cross reference, otherwise entries without a resolvable project are skipped.
- Employees, projects and tasks must already exist in Odoo and carry an external id cross reference (typically synced or created first) for the line relations to resolve.
- The shipped mapping is a starter aligned to a common payload shape. A deployment whose Employment Hero organisation exposes different field names adjusts the source paths from the user interface.
- Requires a configured Employment Hero connection from the suite base module, with either an API key or a completed OAuth2 authorisation.
Employment Hero timesheet integration, Employment Hero Odoo timesheet sync, KeyPay timesheet sync Odoo, hr_timesheet connector, account.analytic.line import, Odoo 17 timesheet integration, timesheet entries to analytic lines, employee timesheet sync, project timesheet mapping, external id cross reference sync, delta timesheet pull, idempotent timesheet sync, OAuth2 timesheet API, Odoo Community timesheet connector, no code timesheet field mapping
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.
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 Malaysia country pack for the ERP Heritage Employment Hero integration
A dependency free asynchronous job queue that runs long running and fan out work out of band of the request that...
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Employees (hr) • Project (project) |
| Community Apps Dependencies | Show |
| Lines of code | 3662 |
| Technical Name |
eh_hero_timesheet |
| 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