Employment Hero Timesheet
Bring worked hours from the Employment Hero platform into Odoo timesheets, and push Odoo entries back, as data driven configuration you tune without 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
Hours land where Odoo expects them
Entries from the Employment Hero platform arrive as account.analytic.line records, with employee, project, task, date and units resolved onto the right Odoo records. No re keying, no export and import dance.
Run it twice, nothing duplicates
Every entry is keyed by its external id through a cross reference, so a record is created once and updated in place. An unchanged payload is skipped, and one bad entry fails alone while the rest of the run continues.
The mapping is data you can edit
Endpoints, field mappings and the sync job ship as configuration rows. Adjust source paths, transformers and conflict rules from the user interface to match your organisation, no code deployment for a mapping change.
Day in the life
A week of hours, reconciled before payroll
Your team logs hours in the Employment Hero people platform across projects and tasks. The scheduled job pulls the week into Odoo as analytic lines, resolving each employee and project through the cross reference, so project managers see worked hours against the right project without anyone re keying. A correction made upstream is picked up on the next run and updated in place, not duplicated. An entry whose project is not yet mapped is reported on the run so you fix the mapping rather than discovering a silent gap later. When you are ready, you narrow the push domain and let Odoo entries flow back to the platform too, with retries that never create a duplicate.
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 external id through the cross reference, and a payload hash is stored, so re running the job creates a record once and updates it in place. An identical payload is skipped rather than rewritten.
Each entry is processed inside its own savepoint. A failed write rolls back just that record and is logged as an error line; the run continues and finishes in a partial state instead of aborting the whole batch.
Odoo requires a project on every analytic line. An entry with no resolvable project is reported as an error and skipped, rather than written against no project, so a mapping gap is visible and fixable.
The transport retries transient failures and rate limit responses with exponential backoff and jitter, honouring a Retry-After header where present and clamping it so a hostile or buggy value cannot stall the run.
A pushed entry carries a stable idempotency key derived from the Odoo record, so a retried create is deduplicated by the platform instead of producing a second timesheet entry.
When the job runs in delta mode the cursor advances only to the high water mark of records that processed cleanly and never past a failed record, so a failure is re fetched next run instead of being skipped forever.
When a run is triggered by a webhook delivery it is forced to newest wins; a snapshot with no usable timestamp does not overwrite a newer record, so an out of order delivery cannot regress an entry.
Employee, project and task are resolved through the cross reference scoped to the active connection, so two connections holding the same external id never cross bind to each other's records.
The stored hash folds in a fingerprint of the mapping, so editing a source path or transformer changes the hash and existing entries are rewritten on the next run instead of being treated as unchanged.
What is inside
Built to do the job, end to end.
- Shipped endpoints. The organisation level list endpoint and a per employee read endpoint for timesheet entries, plus a create endpoint for the push leg. Page style and page size are set as data and can be adjusted per connection.
- Shipped field mapping. A starter mapping for account.analytic.line covering note, employee, project, optional task, date and worked units, with employee, project and task resolved by external id. It ships with noupdate set so your tuning survives an upgrade.
- Two way sync job. A single job defined as both directions: pull entries into Odoo and push Odoo analytic lines back through the create endpoint. The push domain ships empty so you enable the push leg deliberately after narrowing it.
- Conflict and push policy. Inbound conflict policy and outbound push policy are separate settings, so the platform stays authoritative on pull by default while the push leg still works once enabled. Choose eh wins, odoo wins or newest wins per direction.
- Audited runs. Every run records fetched, created, updated, skipped, deleted and failed counts with a line per record, so a run reads cleanly into an audit without preparing an export.
- Engine underneath. Built on the Employment Hero sync engine and connector: external id cross reference, idempotent upsert, delta cursor, OAuth2 with token refresh, rate limiting and retry with backoff. Depends on eh_hero_sync and hr_timesheet.
Honest about the edges
What this does not do, so nothing surprises you.
- A project is required on every analytic line. A deployment must map a default or per entry project through the external id cross reference before the first run, otherwise entries with no resolvable project are reported and skipped.
- Employees, and any project or task referenced, must already exist in Odoo and be cross referenced (synced or registered) so the analytic line relations resolve.
- The push leg ships with an empty domain and is opt in. A deployment narrows the domain and enables push deliberately; out of the box the job behaves as a pull.
- The shipped mapping assumes the source payload carries the note as comment and the quantity as units. A deployment with a different payload shape adjusts the source paths in the mapping.
- Real time delivery is not part of this module. The scheduled job runs on its cron interval; inbound webhook and async queue handling are provided by separate modules in the suite.
- This is a configuration module on the Employment Hero sync engine. It requires eh_hero_sync and the standard hr_timesheet app, and targets Odoo 16 Community.
employment hero timesheet integration, odoo timesheet sync, employment hero odoo connector, import timesheet entries odoo, analytic line sync, hr_timesheet integration, project hours sync odoo, two way timesheet sync, idempotent sync odoo, delta sync timesheet, odoo 16 timesheet connector, worked hours integration, people platform odoo integration, timesheet field mapping, push timesheet to employment hero
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 | 3623 |
| 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