Integrations
Matrix of every system TimeTracking connects to, with honest status (Live, Recipe, Planned), mechanism and data direction.
Last updated: · Markdown version
TimeTracking does not ship native connectors for third-party systems, apart from the export presets listed as Live below. Every other integration is built on the same public building blocks:
- REST API:
https://app.timetracking.tech/api/v1, authenticated with an organisation API key (Authorization: Bearer tt_live_…). See Authentication and the API reference. - Webhooks: signed
POSTrequests when something happens (hours submitted, approved, exported, period locked, …). See Webhooks overview. - Export mappings: approved hours, leave and expenses rendered as a payroll file (CSV/TXT). See Export mappings.
- Inbound email: clients mail timesheets (CSV, XLSX, PDF, photo, plain text) to the organisation's inbox address. See Inbound email.
- Tools: the
ttCLI, the MCP server and the Claude Skill.
Status definitions
| Status | Meaning |
|---|---|
| Live | Shipped as a feature in TimeTracking. You configure it; no code needed. |
| Recipe | Works today without changes to TimeTracking, by combining the REST API, webhooks, an export mapping and/or an iPaaS tool (Zapier, Make, n8n). The guide gives the exact steps. You (or your integrator) own the glue code or scenario. |
| Planned | Not achievable today without unreasonable effort, or a native feature that is on the roadmap. No date is promised. |
All per-system guides below are Recipes, except SD Worx, which has a Live concept preset. Native app listings (Zapier/Make marketplace apps), OAuth2 marketplace apps, native calendar sync and a bulk export feed for BI are Planned.
API v1.1 (live) added what two-way syncs need: upsert by external ID (PUT /{people|clients|placements}/by-external/{source}/{ref}), GET/PATCH/DELETE by id, batch endpoints, cursor pagination with updated_since, GET /days and GET /claims range reads, export runs and files via the API, more webhook events with delivery logs, test, replay and secret rotation, and the Idempotency-Key header. See the changelog.
Still Planned: OAuth2 for marketplace apps, native iPaaS apps, a BI bulk feed, export-mapping CRUD via the API (mappings are editable by admins in the dashboard), a sandbox with test keys, and SDKs.
Building blocks (Live)
| System | Category | Status | Mechanism | Direction | Guide |
|---|---|---|---|---|---|
| REST API | Platform | Live | HTTPS + JSON, API key | In and out | API reference |
| Webhooks | Platform | Live | Signed POST, 21 events, delivery log, test, replay, secret rotation |
Out | Webhooks |
tt CLI |
Tool | Live | Node CLI over the REST API | In and out | CLI |
| MCP server | Tool | Live | stdio MCP server over the REST API | In and out | MCP |
| Claude Skill | Tool | Live | Agent Skill (uses CLI or MCP) | In and out | Claude Skill |
| Inbound email | Data in | Live | Client mails timesheet to org inbox | In | Inbound email |
| Master data CSV import | Data in | Live | POST /import or dashboard upload |
In | CSV import |
| Generic CSV export (+ XLSX/JSON download) | Data out | Live | Preset preset-generic; committed files via GET /exports/runs/{id}/file; XLSX/JSON download in the dashboard |
Out | Presets |
| SD Worx concept preset | Payroll | Live (concept) | Preset preset-sdworx; wage codes are placeholders |
Out | SD Worx |
System matrix
| System | Category | Status | Mechanism | Direction | Guide |
|---|---|---|---|---|---|
| SD Worx | Payroll | Live (concept preset) | Export preset preset-sdworx (placeholder wage codes) |
TimeTracking to SD Worx | SD Worx |
| Loket | Payroll | Recipe | Export file (generic preset or custom mapping) | TimeTracking to Loket | Loket |
| Nmbrs | Payroll | Recipe | Export file, or API script / iPaaS | TimeTracking to Nmbrs | Nmbrs |
| AFAS | Payroll / HR | Recipe | Export file, or API script (AFAS UpdateConnector) | TimeTracking to AFAS | AFAS |
| Visma Raet (Youforce) | Payroll / HR | Recipe | Export file (variable wage data import) | TimeTracking to Visma Raet | Visma Raet |
| Easyflex | Staffing payroll | Recipe | Export file (hours import) | TimeTracking to Easyflex | Easyflex |
| Mysolution | Staffing ERP | Recipe | Upsert by external ID + GET /days, or export file |
Both | Mysolution |
| Planbition | Planning | Recipe | Upsert by external ID, batch claims, GET /days |
Both | Planbition |
| DATEV | Payroll (DE) | Recipe | Export file (ASCII import) | TimeTracking to DATEV | DATEV |
| Personio | HR | Recipe | Upsert by external ID, GET /days, leave webhooks |
Both | Personio |
| Exact Online | Accounting / payroll | Recipe | API script / iPaaS, export file | TimeTracking to Exact | Exact Online |
| Bullhorn | ATS / CRM | Recipe | PUT …/by-external/bullhorn/{id} + batch; hours back via GET /days |
Bullhorn to TimeTracking (master data); hours back optional | Bullhorn |
| Carerix | ATS / CRM | Recipe | PUT …/by-external/carerix/{id} + batch; hours back via GET /days |
Carerix to TimeTracking; hours back optional | Carerix |
| Recruitee | ATS | Recipe | Recruitee webhook + PUT …/by-external/recruitee/{id} |
Recruitee to TimeTracking | Recruitee |
| OTYS | ATS / CRM | Recipe | PUT …/by-external/otys/{uid} + batch |
OTYS to TimeTracking | OTYS |
| HubSpot | CRM | Recipe | HubSpot workflow webhook + upsert by external ID; totals via GET /days |
HubSpot to TimeTracking; status back | HubSpot |
| Salesforce | CRM | Recipe | Flow / Apex callouts to PUT …/by-external/salesforce/{id}; hours via GET /days |
Salesforce to TimeTracking; hours back | Salesforce |
| Pipedrive | CRM | Recipe | Pipedrive webhook + upsert by external ID | Pipedrive to TimeTracking | Pipedrive |
| Google Calendar | Calendar | Recipe (native sync Planned) | shift.published webhook + iPaaS + Calendar API |
TimeTracking to Google | Google Calendar |
| Microsoft 365 / Outlook | Calendar | Recipe (native sync Planned) | shift.published webhook + iPaaS + Microsoft Graph |
TimeTracking to Outlook | Microsoft 365 |
| Slack | Chat | Recipe | Webhooks + relay + Slack incoming webhook | TimeTracking to Slack | Slack |
| Microsoft Teams | Chat | Recipe | Webhooks + relay + Teams Workflows webhook | TimeTracking to Teams | Teams |
| Zapier | iPaaS | Recipe (native app Planned) | Webhooks by Zapier + Code by Zapier | Both | Zapier |
| Make | iPaaS | Recipe (native app Planned) | Custom webhook + HTTP module | Both | Make |
| n8n | iPaaS | Recipe (native node Planned) | Webhook node + Crypto node + HTTP Request | Both | n8n |
| Power BI | BI | Recipe (bulk feed Planned) | Power Query over GET /days, /leave, /expenses, /exports/runs (read-only key, cursor pagination) |
TimeTracking to Power BI | Power BI |
| Looker Studio | BI | Recipe (bulk feed Planned) | Apps Script over GET /days into Google Sheets |
TimeTracking to Looker Studio | Looker Studio |
Constraints that apply to every recipe
Facts about the API today. Each guide repeats the ones that matter.
- Keys and scopes.
readkeys act as a read-only accountant: everyGETworks (lists, by id,/days,/claims,/exports/runs,/leave,/expenses,/shifts,/inbox), but no writes, and export preview (POST /exports) returns403"API key is read-only".writekeys act as an office user.adminkeys (implieswrite) also manage webhooks (create, list, delete, deliveries, test, replay, rotate secret), lock periods, manage kiosk devices and list/revoke API keys. No key can create API keys or change office roles (403"Not available with an API key"); write keys get403"Admin role required" on admin endpoints. - External IDs.
PUT /{people|clients|placements}/by-external/{source}/{ref}creates or updates by your system's id (sourcematches[a-z0-9_-]{1,40},ref≤ 120 chars, URL-encoded). The response hascreated: true|false. Placements acceptpersonExternalRef/clientExternalRefof the same source. - Updates are full replaces.
PUT …/by-external/…,PATCH /{resource}/{id}andPOSTwithidreplace the whole record: omitted optional fields becomenull. - Deactivate, not delete.
DELETE /people/{id}andDELETE /placements/{id}setactive: false.DELETE /clients/{id}only works for clients without placements (else409). - Batches.
POST /{people|clients|placements|claims}/batchwith{items:[…]}(1–500). One bad row never aborts the batch; readresults[].ok. - Incremental reads. Lists accept
limit(1–500),cursor,updated_sinceand return{items, next_cursor}. Hours:GET /days?from&to&status&updated_sinceand rawGET /claims. - Retries. Send
Idempotency-Key(8–200 chars) onPOST/PUT/PATCH/DELETE; replays (24 h) return the stored response withidempotent-replayed: true. Honoured on every authenticated write, including export commit, approvals and period lock. See Idempotency. - Webhooks. 21 events, delivered by a job every 5 minutes; 7 attempts in total (first run, then +1m, +5m, +30m, +2h, +6h, +12h). Payloads carry IDs only (for example
person.updated{personId}or{personId, active:false});person.*,placement.*andclient.*fire on every API create/update path. See Retries. - Rate limit. 600 requests per minute per key (fixed calendar-minute window). Above that:
429withRetry-After: 60. See Rate limits.
Build an integration with Claude
Every guide ends with a copy-paste prompt. More prompts: Prompts.