← All posts
billable-hoursinvoicingagency-ops

How to bill clients from tracked hours without disputes

A practical billable hours tracking workflow for agencies: what to log, how to round, and how to send invoices clients approve without arguing.

· 6 min read

Most hourly billing disputes are not about the amount. They are about the client not being able to tell what they paid for. If your billable hours tracking produces a single line that says "Development — 46.5 hours — $4,650", you have given the client nothing to agree with and nothing to check. So they push back on the only number they can see: the total.

I run a small team and I bill hourly. Here is the workflow that stopped the arguments. It is not clever. It is mostly about deciding things before the invoice goes out instead of after.

Agree on the billing rules in writing before any work starts

This is the part people skip, and it causes most of the trouble later. Four things need to be written down somewhere the client can find them — the proposal, the contract, or even just an email they replied "yes" to.

1. What counts as billable. Be explicit about the grey areas, because the grey areas are where disputes live:

  • Internal standups and team syncs about the client's project — billable or not?
  • Writing the weekly status update — billable or not?
  • Time spent waiting on the client (blocked on their feedback) — almost always not billable, say so.
  • Fixing your own bug, introduced in work you already invoiced — I don't bill this, and I say that upfront. It buys a lot of trust for not much money.
  • Travel, calls with their vendors, onboarding a new person onto their account.

2. Rounding. Pick one rule and never vary it. I round each task to the nearest 15 minutes and round down at the end of a session. Per-task 6-minute increments (the law firm model) look precise but generate invoices with 80 lines on them, which clients hate more than rounding. Rounding up to the nearest hour per session is where you lose clients — a 10-minute email turns into an hour and looks like padding, because it is.

3. A cap or a checkpoint. Give a monthly ceiling, or a "we stop and ask you at 80% of the estimate" rule. Surprise is the actual enemy. A client who approved 60 hours and gets billed for 95 will dispute it even if all 95 hours were real and useful.

4. When the invoice arrives, and how long they have to query it. Mine goes out on the 1st, covering the previous month, with a 7-day window to raise questions. After that it's accepted. A deadline sounds harsh but it ends the "about that invoice from April" conversation forever.

Make billable hours tracking produce a line item, not a number

The difference between an invoice that gets paid and one that gets questioned is whether each row means something to the person reading it.

For that, the time entries themselves have to be written for the client, not for you. Three habits do most of the work:

Tag time to a task the client already knows about

If the client has a Trello board, a Linear project, a list of agreed deliverables — use those exact names. "Checkout flow — payment error handling" maps to something in their head. "Frontend work" does not. When the names match the thing they asked for, the invoice reads like a progress report, which is a much nicer document to receive than a bill.

Write the note at the end of the session, never at the end of the month

Monday-morning reconstruction is how padding accidentally happens, and it's also why notes end up vague — you genuinely don't remember, so you write "various fixes". Vague notes are what clients challenge. A one-line note takes ten seconds while the work is fresh.

Keep the raw record even though you'll never send it

Automatic tracking — the app logs the time, the apps used, periodic screenshots — gives you something to fall back on when a client questions a specific day. You don't attach it to the invoice. You keep it so that if someone asks "what was the 6 hours on the 14th?", you can answer in two minutes with specifics instead of "let me check with the team" (which sounds like you don't know). I wrote about the tradeoff between automatic capture and manual timers in automatic time tracking vs starting a timer by hand — for billing, automatic wins mostly because it survives the week where everyone forgot to start their timer.

Run a review pass before the invoice goes out

I spend about 20 minutes per client per month on this, and it has saved far more than 20 minutes of argument.

  1. Pull the month's entries grouped by task. Not by person, not by day — by the thing the client cares about.
  2. Find anything over 8 hours on one task and check that the note explains why. Big numbers draw the eye. If a task took three times the estimate, the invoice is the wrong place for the client to learn that; send a note before.
  3. Delete or write off what you can't defend. If you look at an entry and think "I'd struggle to explain this", take it off. Every entry you write off makes the rest of the invoice more credible.
  4. Check for double-billed meetings. Four people in a one-hour call is four billable hours. That's legitimate, but it needs to be visible as "project kickoff call — 4 attendees — 4h", not four separate mystery entries.
  5. Compare to the estimate and say the variance out loud in the invoice email. "Estimated 50, came in at 58, the extra 8 was the Stripe migration you approved on the 12th."

That last one is the single highest-value habit in this list. Nearly every dispute I've had started with a client discovering a variance by themselves.

What the invoice should actually look like

Keep it to one page. Group by deliverable or week, not by individual time entry. Aim for 8 to 15 lines — enough that each line is meaningful, few enough that it's readable.

For each line: the task name the client recognises, the hours, the rate, the amount. Under it, a short summary line — "Checkout flow, 22.5h — payment error handling, retry logic, 3 rounds of review". Then total hours, total amount, and a one-sentence note about variance against the estimate.

Do not attach screenshots or activity logs to an invoice. It looks defensive, and it invites the client to audit your team person-by-person, which is a conversation that ends badly for everyone. Keep that data available on request and nowhere else.

The tradeoffs, honestly

Hourly billing with detailed tracking has a real cost: the overhead is maybe 1-2% of billed time, and some clients will always optimise against detail by nitpicking individual lines. If you have a client who does that, move them to a fixed monthly retainer and stop sending hours entirely. Detailed tracking is also the wrong instinct for very small engagements — under about 10 hours a month, a short email describing what you did is better than a 12-line invoice.

If your team is small and remote and you need the raw hours to come from somewhere reliable, bibotracker is what I built for this: a desktop app that records work time, app and browser activity and periodic screenshots, with a web admin where you can group a month by person or project and export it. It's the record behind my invoices, not the invoice itself.

The real lesson, though, is cheaper than any tool: write down the billing rules first, write the notes the same day, and tell the client about the variance before they find it.

Track time without the per-seat bill

BiBoTracking is free, open source and local-first — for macOS and Windows.

See how it works