Name your columns. Keep one language underneath.
Seven fixed stages beneath whatever you call things — which is how one board pulls work across every customer, and how each client reads your board in their own words.
One board for the work, one timer for the hours, one portal your clients actually log into. They request, you estimate, they approve, you track — and nobody writes another status email.
Your columns can be named anything. Underneath they all map to one of seven.
Each one checked automatically, before anything we ship goes live.
Server-side, and one per person by design. A reload, a crash or a second device can't lose it.
Charging for client logins would defeat the product. You pay for your own team.
Columns differ per project — “Requested”, “Ideas”, “Inbox” all sit under Backlog. The stage is what they have in common, and what lets one board hold three customers at once.
Not two tools bolted together. Your team sees internal estimates, time notes and internal tickets. Your client sees their own request in their own words — same item, same hour, same moment.
Sandbox keys took 3 h — worth quoting higher next time.
Jonas is on it. You’ll get it for review before it ships.
Internal estimates, time notes, internal tickets and your margins are absent from what their browser receives — not hidden in the interface.
How it's enforced →Not a suite. The handful of jobs an agency does every day, and nothing else competing for the screen.
All six →Seven fixed stages beneath whatever you call things — which is how one board pulls work across every customer, and how each client reads your board in their own words.
Your client raises the work. It lands in the column you nominated, carrying who asked, when they need it and any file they attached.
You quote hours; they see what it does to their month and press approve. Nothing starts before that, and the approval carries a name and a timestamp — so scope arguments end.
One per person, running server-side. Or type 1.5, 90m, 9–11:30. Raw minutes stored; rounding happens on the invoice, never on the record.
They watch the month accumulate as it happens. Internal work on their project is excluded on purpose — the number they see is the number they’re billed for.
Summaries, decisions and questions next to the work they’re about. Turn a summary into work items in one step. Everything else batches into one daily email — no notification per card.
Checkout first. Anna sends the mandate wording by Friday.
So it’s the part we built first. Isolation is a rule in the database itself, on every record, deny-by-default — and nothing new goes live without one.
The access model →| No client ever receives | Why it stays inside |
|---|---|
| Your time notes | Why an hour took as long as it did |
| Your internal estimate | What you thought it would take |
| Your rates and your margin | What the work costs you, and what you make on it |
| Internal work items | Not merely hidden — nothing confirms they exist at all |
| Anything of another customer’s | Every list they open contains none of it |
You don’t roll this out. You put one customer in it on a Monday, and by Friday the three habits that cost you most have quietly stopped.
The board is the status. What’s in progress, what’s waiting on them, how many hours it has taken — visible without anyone composing a summary on a Friday afternoon.
Every estimate was approved by a named person at a known time, and every hour sits on the item it was spent on. The conversation gets shorter and less expensive.
Hours were logged against items as the work happened, so the total is already right. Nobody reconstructs a week from calendar entries and memory.
Put one real client in AgencyOS this month and see whether the status emails stop. Free through the billing release for the first ten agencies, migration done by us.