Time Tracking
Track billable hours with built-in timer, then convert entries to invoices automatically.
Overview
Time tracking features:
- Built-in timer with start/stop
- Manual time entry
- Link to tasks and projects
- Billable vs non-billable tracking
- Convert to invoice line items
- Detailed reports
Using the Timer
Start Tracking
- Navigate to Agency OS → Time Tracking
- Select a Project and Task
- Add optional description
- Click Start Timer
Stop Tracking
- Click Stop Timer
- Review the time entry
- Edit if needed:
- Adjust start/end time
- Add notes
- Mark as billable
- Click Save Entry
Manual Time Entry
Add past work that wasn't tracked in real-time:
- Click Add Manual Entry
- Select Project and Task
- Enter:
- Date - When work was done
- Hours - Duration
- Description - What was accomplished
- Billable - Toggle billable status
- Click Save Entry
POST /wp-json/agency-os-ai/v1/time-entries
{
"project_id": 5,
"task_id": 23,
"user_id": 3,
"start_time": "2026-03-31T09:00:00",
"end_time": "2026-03-31T12:30:00",
"description": "Homepage design mockups",
"billable": true,
"hourly_rate": 150.00
}
Time Entry Fields
| Field | Type | Description |
|---|---|---|
| project_id | integer | Associated project |
| task_id | integer | Associated task |
| user_id | integer | Team member who tracked time |
| start_time | datetime | When tracking began |
| end_time | datetime | When tracking ended |
| duration | integer | Duration in seconds |
| description | string | Work description |
| billable | boolean | Can be invoiced |
| hourly_rate | decimal | Rate for this entry |
| invoiced | boolean | Has been invoiced |
| invoice_id | integer | Linked invoice |
Getting Unbilled Entries
View all time entries ready for invoicing:
GET /wp-json/agency-os-ai/v1/time-entries/unbilled?client_id=15
Response:
{
"entries": [
{
"id": 12,
"project_name": "Website Redesign",
"task_name": "Design mockups",
"date": "2026-03-28",
"hours": 4.5,
"description": "Created homepage concepts",
"amount": 675.00
}
],
"total_hours": 4.5,
"total_amount": 675.00
}
Billable vs Non-Billable
| Type | Description | Invoicable |
|---|---|---|
| Billable | Client-facing work | Yes |
| Non-Billable | Internal work, admin | No |
Reports
Generate time reports by:
- Project - Hours per project
- Team Member - Hours per user
- Date Range - Custom time periods
- Client - Hours per client
API Endpoints
GET
/wp-json/agency-os-ai/v1/time-entries
List time entries. Params: project_id, task_id, user_id, billable, from_date, to_date
GET
/wp-json/agency-os-ai/v1/time-entries/unbilled
Get unbilled entries for invoicing. Params: client_id, project_id
POST
/wp-json/agency-os-ai/v1/time-entries
Create time entry.
PUT
/wp-json/agency-os-ai/v1/time-entries/{id}/mark-invoiced
Mark entry as invoiced.