Blog, Profitability, Finance

Agency profitability: hours × rate is lying to you

Why the standard profitability report overstates your revenue and buries idle time, and how to work out real margin from contracted revenue and absorbed cost.

Contents
  1. Why does hours times rate overstate revenue?
  2. Why does dividing salary by logged hours hide idle time?
  3. How do you work out real margin?
  4. Where does idle time go?
  5. What changes when the report reconciles to payroll?
Key takeaway
Real margin is what the client actually paid you minus what your team actually cost, with the salary no client absorbed shown as idle on its own line. Multiplying hours by your billing rate books free work as income, and dividing salary by hours logged makes bench time vanish into your client costs.

Hours times billing rate flatters your profitability, because it counts over-servicing as revenue and hides idle time inside client costs. Real margin is contracted revenue minus fully loaded cost, with the salary no client absorbed sitting on its own line as idle.

Why does hours times rate overstate revenue?

If your team logs $22,000 of billable value against a $15,000 retainer, the client paid you $15,000. A report showing $22,000 of revenue has just booked a $7,000 giveaway as income. And it gets worse: the account looks more profitable the more you over-service it, because every extra unpaid hour adds another $150 to the revenue line.

LineHours times rate reportWhat actually happened
Hours logged147147
Billing rate$150$150
Revenue shown$22,000$15,000 invoiced
DifferenceCounted as income$7,000 servicing gap

That $7,000 is not revenue. It is the servicing gap, and it is probably the most useful number in retainer management, which is why it deserves its own line instead of being folded into the top one. Read the hours-times-rate report and you see your best client. Read the contracted-revenue report and you see the account that needs repricing. Same account, same month.

Why does dividing salary by logged hours hide idle time?

Divide a salaried person's monthly cost by the hours they logged and every hour gets more expensive in a slow month. Take an SEO specialist on $10,000 a month who delivers 60 hours to one client. What those 60 hours cost depends entirely on how busy they were elsewhere:

Hours logged in the monthCost per hourCost of 60 hours of SEOWhere the rest of the salary went
90$111.11$6,667Spread across the other 30 hours
140$71.43$4,286Spread across the other 80 hours
173.3 (fixed capacity)$57.70$3,462$4,807 idle at 90 logged, $1,922 at 140

The same 60 hours of the same work cost you $6,667 in one month and $4,286 in another. Your project margin is now swinging on something that has nothing to do with the project. The client did not get less value in the busy month. They just got charged for the bench time from the slow one.

That is the second trap, and it is the quieter of the two: bench time disappears. If that person logged 90 hours, 83 hours of salary went unabsorbed, but divide-by-logged-hours pushes all $10,000 onto clients anyway. Idle time is real money, and the report has tucked it inside client costs where nobody can act on it.

How do you work out real margin?

Recognize contracted revenue per period. Cost salaried people at a fixed monthly capacity so the rate stays still, and report whatever is not absorbed as idle. Do that and every department, client and person table reconciles back to payroll, and idle becomes something you can actually make a decision about.

Three formulas, that is all:

  • Revenue = retainer plus pre-paid overage, straight-lined across the period. What you invoiced, not what the hours were worth.
  • Cost = hours times hourly cost for hourly staff, and hours times (monthly cost ÷ 173.3) for salaried staff.
  • Idle = monthly cost minus absorbed cost, on its own line.

The 173.3 is a 40-hour week times 52 weeks, divided by 12. Some agencies use a lower capacity to allow for holidays and sick leave, which pushes the hourly cost up and reported idle down. Either is defensible. What matters is picking one and keeping it fixed, so a change in margin means something changed in the business.

Run it on the example account and margin only moves when the work or the price moves:

Line100 hours delivered130 hours delivered
Contracted revenue$15,000$15,000
Absorbed cost (at $57.70)$5,770$7,501
Gross margin$9,230 (61.5%)$7,499 (50.0%)
Delivered value at $150$15,000$19,500
Servicing gap$0$4,500

The over-serviced month shows a lower margin, which is exactly right, because you spent more delivering it. Under hours times rate, that same month would have looked better. The agency gross margin entry covers what belongs in fully loaded cost.

Where does idle time go?

Idle belongs to no client and no department. Giving it its own line is what makes the whole thing reconcile: client cost plus idle equals payroll, every month, to the dollar. If those two do not match, a rate is wrong or an entry is missing, and the reconciliation will find it for you.

MonthHours loggedAbsorbed costIdleIdle as share of salary
Slow90$5,193$4,80748%
Busy140$8,078$1,92219%
Full capacity173.3$10,000$00%

Idle at 48% is not a moral failing and it is not a reason to have a word with anyone. It is a capacity signal, and it points at a decision: sell more SEO, move the person to another department, or wear the cost for a quarter while the pipeline fills. Hidden inside client costs, that same 48% shows up as a vague feeling that SEO projects are never profitable, and you end up raising prices on clients who were already paying you fairly.

Utilization and idle are the same fact from two directions. Someone at 52% utilization has 48% idle, and seeing both together tells you where your capacity is without opening a spreadsheet. The capacity planning guide covers what to do once you know.

What changes when the report reconciles to payroll?

Three things. Client margins stop moving with the bench, so a client who was profitable in March is still profitable in April unless the work or the price changed. Over-servicing shows up as a gap and a lower margin rather than a bonus. And idle becomes something you review every month instead of a surprise that turns up in the year-end accounts. The client profitability guide walks through the full monthly close.

Verbial works out profitability from contracted revenue and absorbed cost, reports idle on its own line, and shows cost and margin to admins only. If you want to see what your accounts look like on that basis, start free.

Questions

What is a good gross margin for a marketing agency?

50 to 60% on labor is healthy, and below 40% usually means you are over-servicing or under-pricing. Measure it from contracted revenue and fully loaded cost. An hours-times-rate report will flatter you.

How do you account for idle time in agency profitability?

Cost your salaried people at a fixed monthly capacity, charge clients only for the hours actually logged, and report the leftover as idle on its own line. It belongs to no client and no department, and burying it in client costs is what makes every margin look better than it is.

Why does my most over-serviced client look like my best client?

Because a report built on hours times billing rate counts every unpaid hour as revenue. The more free work you do, the better that account looks. Switch the revenue line to what you invoiced and the picture inverts.

Ty Smith
Founder. Runs two marketing agencies on the product.

Agency operating software

Run your agency on one system.

See the operating software that agencies built to scale themselves.

14-day trial. No card, no sales call. Your workspace is ready in a few minutes.