Skip to main content
TimeTracker posts workspace events to your own HTTPS endpoint. This page is the contract: event names, the body, the headers and the delivery rules.

The request

Every delivery is a POST with a JSON body.
data carries ids and immutable values, not full records. Fetch the record if you need its current state – the payload is a fact about a moment, not a snapshot of your database.

Headers

Verifying the signature

Each endpoint has its own signing secret, shown once when you create it and again when you rotate it.
1

Read the header

Split X-TimeTracker-Signature on the comma. You get t=<timestamp> and v1=<hex>.
2

Build the signed string

Join the timestamp and the raw request body with a full stop: <t>.<raw body>. Use the bytes exactly as received – do not re-serialise the JSON, or the signature will not match.
3

Compute the HMAC

HMAC-SHA256 the signed string with your endpoint secret, hex-encoded.
4

Compare

Compare against the v1 value using a constant-time comparison.
Allow a wide timestamp tolerance. A retry reuses the original signature and its original timestamp, so a tolerance of a few seconds rejects every retry. Hours, not seconds.

Deduplicate on deliveryId

Delivery is at least once. The same logical event can arrive twice – after a network timeout, or when someone resends it by hand. deliveryId is stable for a given event and endpoint. Store it and ignore a repeat.

Event names

Names are area.event. Sixty-six events are published today.

Timesheets

Time Clock

Time off

Expenses

Invoices and payments

Tasks

Projects

People and access

Client portal

Reminders and comms

Billing, security and exports

Filtering what you receive

An endpoint with no filters receives every event. Otherwise you pick from these categories, and an event matches if its own name or its category is in your list.

Endpoint rules

Retries and failures

Return a 2xx quickly. Do your own work after you have acknowledged, not before.

Delivery states you see in the app

The endpoint itself shows Active, Failing or Disabled.

When the app is off

Switching the Webhooks & API app off stops deliveries. Events raised while it is off are queued, not dropped, and deliver when you switch it back on. Expect a burst after a long pause.

Permissions

Webhooks also need the Webhooks & API app switched on and a Pro plan.

Common questions

No. The secret is shown once, when you create the endpoint or rotate it. Store it somewhere safe. If you lose it, rotate to get a new one.
Almost always because the body was re-serialised before signing. Sign the raw bytes exactly as received. The second cause is a timestamp tolerance that is too narrow for retries.
Twenty consecutive failed deliveries. Fix the endpoint, then re-enable it in Settings → Webhooks.
No. Private and loopback addresses are refused. Use a public HTTPS tunnel.
Send a test delivery from the endpoint’s row in Settings → Webhooks. It uses the same signing and the same headers as a real event.

Webhooks

Setting one up, step by step.

Webhook settings

The screen itself.

Notification types

The same events as in-app and email notices.

Integrations

Everything TimeTracker connects to.