
October 30, 2026 · Mitt Patel · 5 min read
You just wrapped a Friday status call with a client who feels easy, pays on time, and never complains. Meanwhile your team quietly logged 38 hours on their account this month, the same client discussed in the example below. You billed them a flat $3,200 for the month. Nobody ran the math on what that actually works out to per hour.
Why this happens
Agencies sell hours, but most of them track revenue by client and hours by project, and never put the two side by side. You know total revenue for the month. You know total payroll. But you don't know that Client A, who feels effortless, is actually your best-paying account, while Client B, who takes constant hand-holding, is quietly costing you money every month.
This matters because owners make decisions based on feel. You give the "easy" client a discount for referrals. You take on more scope for the "nice" client without charging for it. You assume the client who complains the most is the problem, when really they might be fine on an hourly basis and just talkative. Without hours-to-billing by client, you're running a pricing strategy on vibes.
The cost shows up slowly. You keep the wrong clients, you underprice renewals, and you don't know which services actually support your overhead. A few accounts like this, and your "busy" month can still lose money.
A worked example
Say you run a 6-person agency. In March, two clients stand out.
Client A pays you $4,000 a month on a flat retainer. Your team logged 40 hours on their account. That's $100 an hour in billed value.
Client B pays you $3,200 a month, also flat. Your team logged 38 hours. That's about $84.21 an hour.
On the surface, Client A looks like the better account because they pay more. But say your fully loaded staff cost (wages plus payroll tax plus benefits, divided across hours worked) comes out to $70 an hour. Client A is clearing $30 an hour over cost. Client B is clearing about $14 an hour over cost, less than half as much margin per hour, even though the revenue gap between them is only $800.
Now say Client B's hours crept up from 30 last month to 38 this month, with no change in what they pay you. That's the real story: a client whose workload is expanding while their price stays flat. If nobody is comparing hours to billed value every month, that drift goes unnoticed until the account is costing you money outright.
How to set it up
- Track time by client, not just by project. Every team member logs hours against a client name, even on flat-fee accounts. If you use QuickBooks Online, its time tracking feature lets you tag hours to a customer, which keeps this in the same system as your invoicing.
- Pull total hours worked per client each month. Add up everyone's logged time for that client, across all projects and people.
- Pull total billed amount per client each month. This is what you invoiced or recognized as revenue for that client in the same period, whether it's a flat retainer or hourly billing.
- Divide billed amount by hours worked. That gives you a real dollar-per-hour figure for each client, not an estimate.
- Compare that figure to your fully loaded hourly cost. This is total staff cost (wages, payroll tax, benefits) for the period divided by total hours worked across the agency. We can help you calculate this correctly, since it depends on how your payroll and contractor costs are structured.
- Rank clients by dollar-per-hour, not by total revenue. The highest-paying client by total dollars is not always the most profitable one per hour worked.
- Flag any client whose hours moved more than 15 to 20 percent from the prior month. That's often the first sign of scope creep before it shows up in your margins.
Mistakes that undo this
- Only tracking hours on hourly-billed clients. Flat-fee and retainer clients need the same tracking, since that's where scope creep hides.
- Letting time entries lag. If staff log hours weeks later from memory, the numbers are guesses, not data.
- Comparing revenue instead of dollar-per-hour. A client who pays more in total dollars can still be your worst account per hour if their workload is heavier.
- Ignoring small hour increases. A client who creeps from 30 to 38 hours over a few months rarely announces it. The only way you catch it is by checking monthly.
- Not separating owner or senior staff time from junior time. If the owner is quietly doing 10 hours a month on a client at no charge, that cost needs to be counted too, even if it doesn't show up in payroll.
Monthly checklist
- Pull logged hours by client for the month.
- Pull total billed amount by client for the same month.
- Calculate dollar-per-hour for each client.
- Compare against your current fully loaded hourly cost.
- Flag any client whose hours moved significantly from last month.
- Review the three lowest dollar-per-hour clients and decide if scope, price, or staffing needs to change.
Common questions
What if we bill flat retainers, not hourly rates?
Track hours anyway. The dollar-per-hour figure still tells you whether that retainer is profitable, and whether scope is quietly expanding past what the client is paying for.
How do we calculate fully loaded hourly cost accurately?
It depends on how your team is structured, whether you use contractors, employees, or a mix, and how benefits and payroll taxes are set up. We can help you build this calculation correctly for your specific payroll setup.
What counts as a meaningful change in hours month to month?
There's no fixed rule, but many owners find a swing of 15 to 20 percent worth investigating, since it's often large enough to signal real scope creep rather than normal variation.
Should we fire the client with the lowest dollar-per-hour?
Not necessarily. Sometimes the fix is a price conversation, a scope reset, or reassigning the account to someone more efficient. The number tells you where to look, not automatically what to do.
North Hudson Bookkeeping sets up client-level time and billing tracking like this and keeps it current every month, so you always know which accounts are earning their keep. The first call is free.
