More Features
Time tracking
Track billable hours with a timer or manual entries, per client, and turn unbilled time into a draft invoice in one step.
Coming April 2027
This feature ships in April 2027. This page describes how it will work; details can change before release.
Time tracking is for anyone who bills by the hour. Start a timer when you begin work, or add an entry afterwards, and each entry is saved against a client with its rate. When it is time to bill, Invoice unbilled time turns everything not yet invoiced into a draft invoice, one line per project or per day. Billed entries are then locked and linked to the invoice, so no hour is billed twice and none is forgotten.
How it works
A time entry records:
| Field | Meaning |
|---|---|
| Client | Who the work was for. Required. |
| Member | Who did the work. |
| Project tag | An optional free-text tag, for example "Website redesign", used to group lines on the invoice. |
| Description | What you did. |
| Start and end, or duration | A timer fills start and end; a manual entry can give just a duration. |
| Rate | The hourly rate, resolved when the entry is created and stored on it. |
| Billable | Whether the time should be invoiced. Entries are billable by default. |
Hourly rates
You can set an hourly rate at three levels:
- Member: this person's rate.
- Client: what you charge this client.
- Business: the default for the business.
When an entry is created, the most specific rate that applies is used and stored on the entry. Changing a rate later does not change entries you already logged, so the amount you see today is the amount that will be invoiced.
The timer
Start the timer from the app or ask your AI assistant. Each member can have one running timer at a time; starting a new one is refused until the running one is stopped. Stopping it saves the entry with its start and end time.
Projects are tags
There is no separate projects module. The project tag is enough to group time on invoices and in lists. Mileage and payroll are not tracked.
Track time in the web app
Open Time
Time is in the app sidebar, under Work.
Start the timer or add an entry
Pick the client, add a project tag and description if you like, then start the timer. For past work, add a manual entry with the date and duration instead.
Stop the timer
The entry is saved with its rate and billable flag. You can still edit it until it is billed.
Invoice unbilled time
Choose Invoice unbilled time
Pick the client. You see every billable entry not yet on an invoice.
Choose how to group
Group by project (one line per project tag) or by day (one line per day). The business default is set in settings.
Review the draft invoice
A draft invoice is created. Each line's amount is time multiplied by rate, computed exactly in integer minor units. Billable expenses for the same client are added as lines too, with their markup.
Send it
Send the invoice as usual. The entries are now locked and linked to the invoice.
Invoicing unbilled time always creates a draft. Nothing is sent to your client until a person confirms the send, unless an automation you set up is allowed to send automatically.
Through the API and MCP
| Action | Endpoint | MCP tool |
|---|---|---|
| Log a finished entry | Log time | log_time |
| Start or stop the timer | Start a timer, Stop the timer | via log_time |
| List entries | List time entries | |
| Edit or delete an entry | Update a time entry, Delete a time entry | |
| See what is not billed | List unbilled time | list_unbilled_time |
| Make the draft invoice | Invoice unbilled time | invoice_unbilled |
curl -X POST "https://api.freeinvoiceautomation.com/v1/time-entries" \
-H "Authorization: Bearer $FIA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: time-2027-04-12-design" \
-d '{
"client_id": "0193f2a1-0c11-7d2e-9a40-1b2c3d4e5f60",
"project_tag": "Website redesign",
"description": "Homepage layout",
"started_at": "2027-04-12T09:00:00Z",
"ended_at": "2027-04-12T11:30:00Z",
"billable": true
}'With MCP or the AI agent you can simply say what you want:
Log 2.5 hours for Acme today on the website redesign.
Invoice Acme for last week's time.An automation such as "every Monday, invoice Client X for last week's time entries" uses exactly these capabilities, and creates a draft each week.
Webhooks send time_entry.created when an entry is saved.
Rules and edge cases
- Billed entries are locked. Once an entry is on an invoice, it cannot be edited (API error
time_entry_locked). To correct billed time, change the invoice by revision or issue a credit note. - One running timer per member.
- Rates are frozen per entry. The rate stored on an entry is the one used when it is invoiced.
- Non-billable time is kept for your records and never added to an invoice.
- Your own entries and others'. With
time.logyou log and edit your own entries; editing or deleting other members' entries needstime.manage.
Errors
| Code | When |
|---|---|
time_entry_locked | The entry is billed and linked to an invoice. |
conflict | A timer is already running for you. |
validation_failed | Missing client, or neither a start and end nor a duration. |
permission_denied | Your role lacks the key for the action. |
business_out_of_scope | The client belongs to a business you cannot reach. |
Permissions
| Action | Permission key | Default roles |
|---|---|---|
| View time entries and unbilled time | time.view | Owner, Admin, Editor, Viewer, Accountant |
| Log time, run the timer, edit your own entries | time.log | Owner, Admin, Editor |
| Edit or delete other members' entries | time.manage | Owner, Admin |
| Invoice unbilled time | documents.create | Owner, Admin, Editor |