Skip to content

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.

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.

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.

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.

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.

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.

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.

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.

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.

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 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.

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.

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.

  • 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.