Projects & time
A project does two jobs in Accounts. It is an accounting dimension — a tag that rides onto ledger lines so a slice of the business can be reported on its own — and it is the container billable hours accumulate in until someone turns them into an invoice. The second job is the one an agency, a consultancy or a law firm comes here for: log the hours, see what is unbilled, bill it.
The time recorded here is billable project time. It is not attendance, leave or payroll — nothing in Accounts computes pay from an entry.
Where it lives
Section titled “Where it lives”| Screen | Where | What it is for |
|---|---|---|
| Projects | Settings → Projects | the master list — create, edit, search, activate/deactivate |
| Project detail | click a project row | the unbilled position, recent hours, and the two time actions |
| Time Tracking | main navigation | the timesheet across every project, with filters |
The dimension half of a project is described with the other three dimensions on the general ledger page: journal lines and expenses can carry a project, and the trial balance and P&L can be filtered to one.
Setting up a project
Section titled “Setting up a project”| Field | What it does |
|---|---|
| Name | required; what the project is called everywhere |
| Code | optional, but unique across live projects — a second project with the same code is refused |
| Customer | the contact the project’s time is billed to. Optional on the form, but see below |
| Billing type | fixed cost, project hours, staff hours, task hours or non-billable |
| Hourly rate | the default rate this project’s hours are billed at |
| Budget amount, Budget hours | recorded on the project and shown on its detail page |
| Status | active, on hold, completed or cancelled |
| Start / end date | an end date must be on or after the start date |
| Active | inactive projects drop out of the pickers; existing entries keep their tag |
Only the hourly rate affects money. The billing type and the two budget figures are recorded and displayed, and nothing measures logged hours or billed value against them — a project that has burned through its budget hours looks exactly like one that has not, and time invoicing always bills hours × rate whatever the billing type says.
Logging time
Section titled “Logging time”Log time on the Time Tracking page opens the form with a project picker; the same button on a project’s detail page opens it with that project already fixed.
- Hours — more than 0 and no more than 24. A single entry over 24 hours is a typo, and it is rejected rather than billed.
- Date — defaults to today.
- Who — defaults to whoever is logging, so recording your own time is one less field. Pick someone else to enter time on their behalf.
- Description — what was done, up to 1000 characters. It is for the timesheet; it is not carried onto the invoice line.
- Billable — on by default. Non-billable time (internal work, training, admin) is still recorded, and the invoice run never touches it.
- Rate override — leave it blank and the hour bills at the project’s hourly rate. Fill it in only when this particular time is worth something different. Because the rate is resolved when the invoice is raised rather than frozen when the hour is logged, raising a project’s rate lifts its unbilled hours with it.
The timesheet
Section titled “The timesheet”Time Tracking lists every entry with its project, who worked, hours, the rate (or “project” where the entry has no override of its own), whether it is billable and whether it has been billed. Filter by project, person, date range, billable-or-not and billed-or-not; the project filter also arrives in the URL, so View all on a project detail page lands here already scoped to it.
An entry that has been billed is locked. Its row shows the invoice number and clicks through to the invoice, and it offers no edit or delete — changing hours that a customer has already been billed for would leave the invoice and the timesheet saying different things. To change billed time, void the invoice (which releases the hours) and bill it again. Unbilled entries can be edited or deleted freely.
The unbilled position
Section titled “The unbilled position”A project’s detail page opens on four numbers:
| Number | What it counts |
|---|---|
| Total hours | everything logged against the project |
| Billable hours | the chargeable subset |
| Unbilled hours | billable hours not yet on an invoice — the working set |
| Unbilled amount | what those hours are worth at the rate each would be billed at |
The unbilled amount is computed with the same rate resolution the invoice run uses — the entry’s own rate, else the project’s — so the figure on screen is the invoice’s line total, before any tax code you apply in the dialog.
With one exception, which the page calls out: a billable hour that has no rate at all (no override, and no project hourly rate) cannot be priced, so it is excluded from the unbilled amount. A warning above the table names how many hours those are. Set a rate before invoicing, or the run will refuse.
Invoicing a project’s time
Section titled “Invoicing a project’s time”Invoice unbilled time on the project detail page opens a dialog that restates the position — unbilled hours and what they are worth — and asks for:
- Invoice date (required; tax is derived as of this date),
- Due date, optional,
- Bill up to, optional — bill only hours dated on or before this day, which is how month-end billing works. Leave it blank to bill everything unbilled.
- Payment term, optional — sets the due date when you have not typed one,
- Tax code, optional — one code applied to every line, which suits services billed at a single rate.
The dialog previews the narrowed figure when a cut-off is set, and refuses to submit when there is nothing to bill or when some billable hour has no rate.
What you get
Section titled “What you get”An ordinary invoice, created through the same engine as every other invoice, so it takes its number, tax derivation and totals the usual way. Specifically:
- The customer is the project’s customer.
- Entries at the same resolved rate combine into one line reading Professional services — Project name (N hrs @ rate); entries at different rates cannot share a line, so each rate gets its own.
- The project name is carried across as the invoice’s reference, so the customer can tie the bill to the work.
- It arrives as a draft. Nothing posts to the general ledger until you issue it — see receivables & payables for the invoice lifecycle from there.
The app then opens the new invoice. Give the Invoices list a few minutes to pick it up: the invoice exists from the moment it is created and the billed hours link straight to it, but the list itself can lag a little behind.
What happens to the hours
Section titled “What happens to the hours”Every entry that went onto the invoice is stamped with it, in the same transaction that created the invoice. From that moment the entry is billed and locked: it disappears from the unbilled position, a second run finds nothing to bill, and the same hours cannot reach a customer twice. Voiding or cancelling the invoice releases them — the hours become unbilled and billable again, and can be re-invoiced.
When it refuses
Section titled “When it refuses”| What you see | Why, and what to do |
|---|---|
| There is no unbilled billable time to invoice on this project | everything billable has already been billed, or the cut-off date excludes it all. Widen or clear the cut-off, or log billable hours |
| Some billable time has no rate | at least one billable hour has neither an override nor a project rate. Nothing is billed — the whole run is refused rather than giving that hour away at zero. Set a rate on the entry or the project and try again |
Both are refusals of the entire run, not partial results: if the invoice was not created, no hour was marked billed.
One thing to check before sending: the invoice is raised in your base currency. The unbilled amount on the project is labelled in the customer’s own currency, so for a customer you bill in a foreign currency the two read differently even though the number is the same.
Deleting a project
Section titled “Deleting a project”Deleting a project removes it from the pickers and from the list; ledger movement already tagged with it keeps its tag. Time already logged against it stays in the timesheet — but it can no longer be edited or invoiced, because every one of those actions has to resolve the project first. Invoice or clear a project’s unbilled hours before deleting it.
Who can see and do what
Section titled “Who can see and do what”Projects and the hours logged against them are gated separately, and
projects:read does not reach the time entries:
| Permission | Grants |
|---|---|
projects:read / projects:write |
the Projects list and a project’s detail page, including its unbilled position |
time-entries:read |
the Time Tracking page, and the entries listed on a project |
time-entries:write |
logging, editing and deleting time, and invoicing a project’s time |
That separation had a visible consequence: the roles seeded before time tracking
existed carried projects:read but no time permission at all, so an Accountant could
open a project and get an error where its entries should be. The standard roles
now carry the grant — Accountant reads and writes time, Tester reads it,
Administrator has everything — but a custom role built before that change may
still be missing it.
What a role without time-entries:read sees today: no Time Tracking entry in the
navigation, and on a project detail page the four summary numbers (those come
from the project itself) above a panel saying there is no access to the time
entries, rather than an empty table implying no time was logged. Without
time-entries:write, Log time and Invoice unbilled time are not offered.
The server enforces the same rules regardless of what the screen shows — see
roles & permissions.
On the phone
Section titled “On the phone”The Android app has a Time screen, gated on the same read permission. It is a single timesheet with a project filter at the top and billed / unbilled / all chips beneath it. Scope it to a project and the screen adds that project’s summary tiles and an Invoice unbilled time action; leave it unscoped and it is a cross-project list. The + button logs time — project, hours, date, description, a billable switch and a rate override, with the project’s default rate shown as a hint and a warning the moment an entry is billable with no rate to bill it at. The invoice sheet takes an invoice date, an optional cut-off and an optional tax code, and opens the invoice it creates.
There is no separate project master screen on the phone; projects are created and edited on the web. Amounts on the Time screen are shown as bare numbers without a currency symbol. See mobile for the rest of the app.
Connects to
Section titled “Connects to”- Receivables & payables — what happens to the invoice your hours become, from draft through issue to payment, and what voiding it does.
- General ledger — the project as a dimension on journal lines, and the trial balance and P&L filtered to one project.
- Reports — where those statements sit among the rest.
- Mobile — the Time screen and the rest of the Android app.