TimeTrackr Integration
1. What? — Definition and context
Section titled “1. What? — Definition and context”TimeTrackr is a desktop time-tracking application. When you start a timer on a project and stop it, the time entry has to land in Odoo as a timesheet. Two N8N webhooks bridge the gap: one provides the project and task list for the desktop client’s drop-down menus, the other receives time entries and turns them into Odoo analytic lines.
Two workflows
Section titled “Two workflows”| Workflow | Nodes | Endpoint | Role |
|---|---|---|---|
| TimeTrackr Projects | 5 | GET /webhook/timetrackr-projects | Project + task list for dropdown |
| TimeTrackr Entries | 12 | POST /webhook/timetrackr-entries | Odoo timesheet creation |
Data flow
Section titled “Data flow”2. Why? — Stakes and motivations
Section titled “2. Why? — Stakes and motivations”Problems solved
Section titled “Problems solved”| Problem | Without integration | With integration |
|---|---|---|
| Double entry | Timer + manual entry inside Odoo | Automatic |
| Out-of-sync projects | Different lists in each app | Dropdown fed by Odoo |
| Attribution errors | Wrong project or wrong task | ID-based mapping |
3. How? — Technical implementation
Section titled “3. How? — Technical implementation”Authentication
Section titled “Authentication”Both endpoints rely on a token in the HTTP header:
| Header | Usage |
|---|---|
X-TimeTrackr-Token | Token shared between the desktop client and N8N |
The webhooks are exposed through Caddy (external access allowed, unlike the internal webhooks).
Projects endpoint
Section titled “Projects endpoint”The workflow fetches Odoo projects where x_github_sync_enabled = true, then the active tasks (excluding Done/Cancelled) grouped per project. The reply is JSON ready for the client’s drop-downs.
Entries endpoint
Section titled “Entries endpoint”The payload arrives as a batch:
{ "version": 1, "entries": [ { "project_id": 5, "task_id": 42, "description": "Fix login bug", "duration": 1.5, "date": "2026-03-28", "username": "guillaume" } ]}For every entry, the workflow:
- Looks up the employee ID in the
timetrackr_user_mappingData Table (guillaume→ employee 1) - Creates an
account.analytic.linerow in Odoo - Keeps going even if one entry fails (
continueOnFail)
4. What if? — Outlook and limits
Section titled “4. What if? — Outlook and limits”Current limits
Section titled “Current limits”| Limit | Impact | Mitigation |
|---|---|---|
| No reverse sync | Odoo timesheets not visible in TimeTrackr | TimeTrackr has its own view |
| Manual mapping | Add each user to the Data Table | Single user today |
Evolution scenarios
Section titled “Evolution scenarios”If multi-user:
- Auto-discovery of Odoo employees
- Mapping by email instead of username
Related pages
Section titled “Related pages”Infrastructure
Section titled “Infrastructure”- Odoo 18 on Docker — Timesheets and projects
Workflows
Section titled “Workflows”- Claude Code Telemetry — Another source of automatic timesheets