# Integrations

> Matrix of every system TimeTracking connects to, with honest status (Live, Recipe, Planned), mechanism and data direction.

URL: https://timetracking.tech/developers/integrations
Last updated: 2026-10-24

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](https://timetracking.tech/developers/api/authentication) and the [API reference](https://timetracking.tech/developers/api/reference).
- **Webhooks**: signed `POST` requests when something happens (hours submitted, approved, exported, period locked, …). See [Webhooks overview](https://timetracking.tech/developers/webhooks/overview).
- **Export mappings**: approved hours, leave and expenses rendered as a payroll file (CSV/TXT). See [Export mappings](https://timetracking.tech/developers/data-out/export-mappings).
- **Inbound email**: clients mail timesheets (CSV, XLSX, PDF, photo, plain text) to the organisation's inbox address. See [Inbound email](https://timetracking.tech/developers/data-in/inbound-email).
- **Tools**: the `tt` [CLI](https://timetracking.tech/developers/tools/cli), the [MCP server](https://timetracking.tech/developers/tools/mcp) and the [Claude Skill](https://timetracking.tech/developers/tools/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](https://timetracking.tech/developers/api/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](https://timetracking.tech/developers/api/reference) |
| Webhooks | Platform | Live | Signed `POST`, 21 events, delivery log, test, replay, secret rotation | Out | [Webhooks](https://timetracking.tech/developers/webhooks/overview) |
| `tt` CLI | Tool | Live | Node CLI over the REST API | In and out | [CLI](https://timetracking.tech/developers/tools/cli) |
| MCP server | Tool | Live | stdio MCP server over the REST API | In and out | [MCP](https://timetracking.tech/developers/tools/mcp) |
| Claude Skill | Tool | Live | Agent Skill (uses CLI or MCP) | In and out | [Claude Skill](https://timetracking.tech/developers/tools/claude-skill) |
| Inbound email | Data in | Live | Client mails timesheet to org inbox | In | [Inbound email](https://timetracking.tech/developers/data-in/inbound-email) |
| Master data CSV import | Data in | Live | `POST /import` or dashboard upload | In | [CSV import](https://timetracking.tech/developers/data-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](https://timetracking.tech/developers/data-out/presets) |
| SD Worx concept preset | Payroll | Live (concept) | Preset `preset-sdworx`; wage codes are placeholders | Out | [SD Worx](https://timetracking.tech/developers/integrations/payroll/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](https://timetracking.tech/developers/integrations/payroll/sd-worx) |
| Loket | Payroll | Recipe | Export file (generic preset or custom mapping) | TimeTracking to Loket | [Loket](https://timetracking.tech/developers/integrations/payroll/loket) |
| Nmbrs | Payroll | Recipe | Export file, or API script / iPaaS | TimeTracking to Nmbrs | [Nmbrs](https://timetracking.tech/developers/integrations/payroll/nmbrs) |
| AFAS | Payroll / HR | Recipe | Export file, or API script (AFAS UpdateConnector) | TimeTracking to AFAS | [AFAS](https://timetracking.tech/developers/integrations/payroll/afas) |
| Visma Raet (Youforce) | Payroll / HR | Recipe | Export file (variable wage data import) | TimeTracking to Visma Raet | [Visma Raet](https://timetracking.tech/developers/integrations/payroll/visma-raet) |
| Easyflex | Staffing payroll | Recipe | Export file (hours import) | TimeTracking to Easyflex | [Easyflex](https://timetracking.tech/developers/integrations/payroll/easyflex) |
| Mysolution | Staffing ERP | Recipe | Upsert by external ID + `GET /days`, or export file | Both | [Mysolution](https://timetracking.tech/developers/integrations/payroll/mysolution) |
| Planbition | Planning | Recipe | Upsert by external ID, batch claims, `GET /days` | Both | [Planbition](https://timetracking.tech/developers/integrations/payroll/planbition) |
| DATEV | Payroll (DE) | Recipe | Export file (ASCII import) | TimeTracking to DATEV | [DATEV](https://timetracking.tech/developers/integrations/payroll/datev) |
| Personio | HR | Recipe | Upsert by external ID, `GET /days`, leave webhooks | Both | [Personio](https://timetracking.tech/developers/integrations/payroll/personio) |
| Exact Online | Accounting / payroll | Recipe | API script / iPaaS, export file | TimeTracking to Exact | [Exact Online](https://timetracking.tech/developers/integrations/payroll/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](https://timetracking.tech/developers/integrations/ats-crm/bullhorn) |
| Carerix | ATS / CRM | Recipe | `PUT …/by-external/carerix/{id}` + batch; hours back via `GET /days` | Carerix to TimeTracking; hours back optional | [Carerix](https://timetracking.tech/developers/integrations/ats-crm/carerix) |
| Recruitee | ATS | Recipe | Recruitee webhook + `PUT …/by-external/recruitee/{id}` | Recruitee to TimeTracking | [Recruitee](https://timetracking.tech/developers/integrations/ats-crm/recruitee) |
| OTYS | ATS / CRM | Recipe | `PUT …/by-external/otys/{uid}` + batch | OTYS to TimeTracking | [OTYS](https://timetracking.tech/developers/integrations/ats-crm/otys) |
| HubSpot | CRM | Recipe | HubSpot workflow webhook + upsert by external ID; totals via `GET /days` | HubSpot to TimeTracking; status back | [HubSpot](https://timetracking.tech/developers/integrations/ats-crm/hubspot) |
| Salesforce | CRM | Recipe | Flow / Apex callouts to `PUT …/by-external/salesforce/{id}`; hours via `GET /days` | Salesforce to TimeTracking; hours back | [Salesforce](https://timetracking.tech/developers/integrations/ats-crm/salesforce) |
| Pipedrive | CRM | Recipe | Pipedrive webhook + upsert by external ID | Pipedrive to TimeTracking | [Pipedrive](https://timetracking.tech/developers/integrations/ats-crm/pipedrive) |
| Google Calendar | Calendar | Recipe (native sync Planned) | `shift.published` webhook + iPaaS + Calendar API | TimeTracking to Google | [Google Calendar](https://timetracking.tech/developers/integrations/calendar/google-calendar) |
| Microsoft 365 / Outlook | Calendar | Recipe (native sync Planned) | `shift.published` webhook + iPaaS + Microsoft Graph | TimeTracking to Outlook | [Microsoft 365](https://timetracking.tech/developers/integrations/calendar/microsoft-365) |
| Slack | Chat | Recipe | Webhooks + relay + Slack incoming webhook | TimeTracking to Slack | [Slack](https://timetracking.tech/developers/integrations/chat/slack) |
| Microsoft Teams | Chat | Recipe | Webhooks + relay + Teams Workflows webhook | TimeTracking to Teams | [Teams](https://timetracking.tech/developers/integrations/chat/teams) |
| Zapier | iPaaS | Recipe (native app Planned) | Webhooks by Zapier + Code by Zapier | Both | [Zapier](https://timetracking.tech/developers/integrations/ipaas/zapier) |
| Make | iPaaS | Recipe (native app Planned) | Custom webhook + HTTP module | Both | [Make](https://timetracking.tech/developers/integrations/ipaas/make) |
| n8n | iPaaS | Recipe (native node Planned) | Webhook node + Crypto node + HTTP Request | Both | [n8n](https://timetracking.tech/developers/integrations/ipaas/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](https://timetracking.tech/developers/integrations/bi/power-bi) |
| Looker Studio | BI | Recipe (bulk feed Planned) | Apps Script over `GET /days` into Google Sheets | TimeTracking to Looker Studio | [Looker Studio](https://timetracking.tech/developers/integrations/bi/looker-studio) |

## Constraints that apply to every recipe

Facts about the API today. Each guide repeats the ones that matter.

- **Keys and scopes.** `read` keys act as a read-only accountant: every `GET` works (lists, by id, `/days`, `/claims`, `/exports/runs`, `/leave`, `/expenses`, `/shifts`, `/inbox`), but no writes, and export preview (`POST /exports`) returns `403` "API key is read-only". `write` keys act as an office user. `admin` keys (implies `write`) 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 get `403` "Admin role required" on admin endpoints.
- **External IDs.** `PUT /{people|clients|placements}/by-external/{source}/{ref}` creates or updates by your system's id (`source` matches `[a-z0-9_-]{1,40}`, `ref` ≤ 120 chars, URL-encoded). The response has `created: true|false`. Placements accept `personExternalRef` / `clientExternalRef` of the same source.
- **Updates are full replaces.** `PUT …/by-external/…`, `PATCH /{resource}/{id}` and `POST` with `id` replace the whole record: omitted optional fields become `null`.
- **Deactivate, not delete.** `DELETE /people/{id}` and `DELETE /placements/{id}` set `active: false`. `DELETE /clients/{id}` only works for clients without placements (else `409`).
- **Batches.** `POST /{people|clients|placements|claims}/batch` with `{items:[…]}` (1–500). One bad row never aborts the batch; read `results[].ok`.
- **Incremental reads.** Lists accept `limit` (1–500), `cursor`, `updated_since` and return `{items, next_cursor}`. Hours: `GET /days?from&to&status&updated_since` and raw `GET /claims`.
- **Retries.** Send `Idempotency-Key` (8–200 chars) on `POST/PUT/PATCH/DELETE`; replays (24 h) return the stored response with `idempotent-replayed: true`. Honoured on every authenticated write, including export commit, approvals and period lock. See [Idempotency](https://timetracking.tech/developers/api/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.*` and `client.*` fire on every API create/update path. See [Retries](https://timetracking.tech/developers/webhooks/retries).
- **Rate limit.** 600 requests per minute per key (fixed calendar-minute window). Above that: `429` with `Retry-After: 60`. See [Rate limits](https://timetracking.tech/developers/api/rate-limits).

## Build an integration with Claude

Every guide ends with a copy-paste prompt. More prompts: [Prompts](https://timetracking.tech/developers/tools/prompts).
