A timer that survives everything
It runs server-side, so a reload, a crash or a second device can’t lose it. One per person, and that is enforced rather than agreed: starting a second stops the first and banks the time as a draft.
Six areas. Each one is here because an agency does it every week and because doing it in two disconnected tools is where the hours and the trust get lost.
Every project gets its own columns — add, rename, reorder, archive. Each one maps to exactly one of seven fixed stages, and that mapping is what makes the rest possible: one board across all customers, a client-facing label per column, and reporting that doesn’t care what you called things.
| Your label | Stage | Client sees |
|---|---|---|
| Requested | Backlog | Requested |
| Estimated | Planned | Quote ready |
| In progress | In progress | We’re on it |
| In review | Review | Awaiting your feedback |
| Done · billable | Done | Delivered |
| Blockedyou added this | Blocked | same as internal |
The seventh stage, Billed, exists for invoicing to move work into. This project doesn’t map a column to it yet.
Your client raises the work themselves. It lands in the column you nominated as the intake target, carrying who asked, when they need it, which project it belongs to and any file they attached.
Nothing is lost in a thread, nobody re-types a request into a ticket, and the person who wanted it is on the record — which matters later, when someone asks why you built it.
You record what you think it will take and what you’re quoting. The first is yours — it’s how you learn what you underprice. The second is what the client approves, with a name and a timestamp against it.
An item belongs to a project, a project belongs to a customer — so choosing the item is the whole of the decision. Two ways to get time in, one storage format, three states.
It runs server-side, so a reload, a crash or a second device can’t lose it. One per person, and that is enforced rather than agreed: starting a second stops the first and banks the time as a draft.
For the call you didn’t time and the hour you forgot. The duration field parses whatever you write, because everyone writes it differently and none of them are wrong.
A contract that bills in 15-minute increments changes an invoice, never the record of what happened. Rounding is never applied on write.
A grid of items by day. Click a cell to add time, see the billable share, and see the gap — the only nagging the product does.
“Sandbox keys took 3 h — quote higher next time.” The note is the one moment anyone remembers why an hour cost what it did, and no client can reach it, under any role.
Draft while it’s yours to edit, invoiceable once you approve the month, frozen once it’s invoiced. Correcting an invoiced hour is a counter-entry, not an edit — both sides stay in the record.
Your client watches the month accumulate as it happens — hours by project, open items, what’s waiting on them. When the invoice arrives it confirms a number they already knew.
Internal work on their project is excluded on purpose. Your utilisation and their invoice will never match, and that’s the point: the number they see is the number they’re billed for.
| Portal Relaunch | 6 items | 21.0 |
| Infrastructure | 3 items | 6.5 |
| Total | 9 items | 27.5 |
Meeting summaries, decisions, questions and files live next to the work they’re about — per customer, optionally scoped to a project. Turn a summary into work items in one step.
And because some clients will never log in: everything batches into one readable daily email they can reply to. Only invites, approvals and sign-in links send immediately. Nobody gets a notification per card.
Checkout flow first. Anna sends the SEPA mandate wording by Friday. Open question on invoice numbering.
PDF or the original InDesign files for the old invoice templates?
Your name, logo, accent colour and domain. The structure — ink, lines, spacing, the seven stages — stays fixed, which is why a tenant theme is a values swap rather than a redesign.
On the client side the only mention of AgencyOS is one line in the footer. On your own domain there isn’t one.
We’ll set up your workspace and migrate your current projects before the first call ends.