What a webhook is
An HTTPS endpoint you register. When a matching event happens, TimeTracker sends it a signedPOST with a JSON body describing what occurred.
The page describes it as: “Send workspace events to your own systems over HTTPS.
Every delivery is signed with a per-endpoint secret you can verify from the
X-TimeTracker-Signature header.”
When to use one
- Post approved timesheets into your payroll system.
- Tell your accounting tool when an invoice is paid.
- Push new tasks into a build pipeline or a support tool.
- Feed workspace activity into your own dashboard.
Create an endpoint
Open Settings → Webhooks
Click Add endpoint
Enter the endpoint URL
https:// address, for
example https://api.example.com/webhooks/timetracker.Choose event filters
Save
Copy the signing secret
Fields
URL rules
Only public HTTPS addresses are accepted. TimeTracker rejects:2xx directly.
The request
Headers
X-TimeTracker-Delivery-Id is stable across retries of the same delivery.
Deduplicate on it. Delivery is at least once, so the same id can arrive
twice.
Body
data holds the values as they were at the moment the event happened. It is a
snapshot, not a live record, so a later rename does not change an old delivery.
Verifying the signature
The signature header looks like:t is unix seconds. rawBody is the byte-identical JSON that arrived.
Your receiver should:
Read the raw body as text
Split the header
, to get t= and v1=.Check the timestamp
t is more than 300 seconds (5 minutes) away from now. This
stops replay attacks.Recompute the HMAC
t + "." + rawBody with your signing secret, hex-encoded.Compare in constant time
Example verifier
2xx once you have accepted the event. Do the slow work
afterwards.
Delivery and retries
Events are dispatched about once a minute, so a webhook normally lands within a minute of the action that caused it.Auto-disable
An endpoint that fails 20 times in a row is switched off automatically. The endpoint card then shows a red alert: “Endpoint disabled after repeated failures” – “We stopped sending after N consecutive failures. Fix your receiver, then re-enable this endpoint.” Click Re-enable and confirm. The dialog reads “Deliveries resume immediately and the failure count resets. Make sure your receiver is fixed first.” Any success resets the counter to zero, so an endpoint that is merely flaky never gets disabled.The endpoint card
Row actions
The⋯ menu on each endpoint holds:
Sending a test event
Pick Send test event from the⋯ menu. You get a toast – “Test event
sent.” or Test event failed: <reason>.
The test body is:
The delivery log
Each endpoint has a Delivery log button that expands a table. It holds the most recent 100 deliveries, newest first.Redelivering
Click Redeliver on any row. You get “Delivery re-queued.” Redelivery adds a new attempt and never rewrites the old row, so your history stays honest. The new attempt is signed with your current secret.Rotating the secret
Open the endpoint menu
⋯, then Rotate secret.Confirm
Copy the new secret
Update your receiver
Deleting an endpoint
Pick Delete from the⋯ menu.
The confirmation is titled “Delete this endpoint?” – “This permanently
deletes the endpoint and its delivery history. This cannot be undone.”
You must type the endpoint URL to confirm. Then click Delete endpoint.
Event types
There are 66 event keys, and almost all of them can be delivered by webhook. Full detail – trigger, recipients and channels – is in the notification types reference. Timesheetstimesheet.submitted · timesheet.approved · timesheet.changes_requested ·
timesheet.reopened · timesheet.withdrawn · timesheet.reminder ·
timesheet.approval_overdue · timesheet.not_submitted · timesheet.period_closed
Timecards
timecard.submitted · timecard.approved · timecard.changes_requested ·
timecard.correction_approved · timecard.correction_rejected ·
timecard.missing_clock_out
Time off
time_off.requested · time_off.approved · time_off.rejected ·
time_off.withdrawn · time_off.approval_withdrawn ·
time_off.balance_adjusted · time_off.approval_overdue · time_off.upcoming
Expenses
expense.submitted · expense.approved · expense.rejected ·
expense.clarification_requested · expense.approval_overdue
Tasks
task.assigned · task.completed · task.reopened · task.status_changed ·
task.due_soon
Projects
project.member_added · project.member_removed · project.archived ·
project.status_changed · project.budget_threshold_reached
Invoices and payments
invoice.created · invoice.sent · invoice.paid · invoice.voided ·
invoice.overdue · payment.recorded · payment.reminder_sent
Comments and portal
comment.mentioned · portal.comment_posted · portal.deliverable_approved
Members and access
member.invited · member.invitation_accepted · member.invitation_revoked ·
membership.role_changed · membership.removed · workspace.member_deleted
Security
security.email_changed · security.suspicious_login
Billing
billing.trial_ending · billing.trial_expired ·
billing.subscription_activated · billing.payment_action_required
Exports
export.ready
Testing
webhook.test – sent only by Send test event, never by real activity.
Example
Daniel Okafor wants Northwind Studio’s accounting system to record a payment the moment an invoice is marked paid.Add the endpoint
https://api.northwind.example/hooks/timetracker. He leaves the filter
empty.Store the secret
Write the receiver
event.key === "invoice.paid", and ignores
everything else.Test it
webhook.test body and answers 200.Watch the log
Permissions
What happens when the app is off
Turning the Webhooks & API app off under Settings → Apps stops delivery. Events that happen while it is off are queued and delivered when you turn it back on. Your configuration and delivery history are kept.Common questions
Can I see the signing secret again?
Can I see the signing secret again?
How fast is a webhook?
How fast is a webhook?
Can the same event arrive twice?
Can the same event arrive twice?
X-TimeTracker-Delivery-Id,
which stays the same across retries of the same delivery.Can I use an http:// URL for local testing?
Can I use an http:// URL for local testing?
What should my endpoint return?
What should my endpoint return?
2xx, as soon as you have accepted the event. Do the slow work after
responding. A 3xx counts as a failure – redirects are never followed.My endpoint went to Disabled. What now?
My endpoint went to Disabled. What now?
Do webhooks respect a person's notification settings?
Do webhooks respect a person's notification settings?
Troubleshooting
Every delivery fails with a signature mismatch. You are almost certainly re-serialising the body before verifying. Sign the raw bytes exactly as they arrived. Deliveries stop after a while. Check the status badge. Twenty consecutive failures disables an endpoint. Fix the receiver and re-enable it. The URL will not save. It must be public HTTPS. Private, loopback and metadata addresses are blocked, including numeric forms of them. I get nothing at all. Confirm the endpoint is Active, the Webhooks & API app is on, and your plan includes it. Then use Send test event to prove the path end to end. Deliveries arrive but my filter drops them. Clear the filter so the endpoint receives everything, and route onevent.key in your own code.
Related guides
Integrations overview
Notification types
Webhook events reference
Roles and capabilities
webhook.manage.