Why agencies are fully booked but not profitable, and how to find your cause

Blog post image

Why agencies are fully booked but not profitable: summary & key takeaways

  • The gap: Your team is busy on hours that never reach an invoice at full rate, so a full calendar hides a thin margin.

  • The breakdown: Sort one month of available hours into four buckets: billed, given away on retainers, unpriced non-billable work and bench.

  • The test: Compare your billed rate and effective rate with a cost floor to tell a pricing problem from a delivery problem.

  • The fix order: Recover the bucket holding the most dollars first, then reprice whatever still sits below the floor.

The main reason why agencies are fully booked but not profitable is that the calendar counts hours worked, not hours billed at the rate you sold. Looking back from Teamwork.com, over-servicing was the biggest drain of my agency years: clients asked for more inside the same retainer, and nothing recovered the cost.

A full team that still can't show a profit is exhausting, and it rarely means people are slacking or clients are wrong. Sort one month of booked hours into four buckets and you can name the cause that took your margin, then fix the biggest bucket first.

A full calendar counts hours worked, not hours paid for

A fully booked team can still bill barely half its time, because booking and billing measure different things. Billable utilization is the share of a person's available hours that you bill to a client. The second number is the share of client delivery hours you actually invoice, which consultancies call realization. Pull both from last month's timesheets before reading on.

The two can sit far apart. A timesheet can show 95% of hours booked while billable utilization sits under 60%, because retainer overruns, internal meetings and account admin count as booked. For the profit levers behind that gap, see why fully booked firms still miss their margin.

Split one month of booked hours into four buckets

The fastest way to see what sits behind those two numbers is to sort every available hour in one month into four buckets. Take an illustrative 60-person agency with a 40-person delivery team; every figure is an assumption.

Each person has 140 available hours a month after leave and holidays, giving 5,600 honest available hours. The rate card assumes a $150 blended billable rate, a $70 fully loaded blended cost rate and 75% billable utilization. The booked-hour breakdown for one agency month shows a full team billing just over half its time.

Booked-hour bucket

Hours this month
Share of available hours
Revenue billed
Billed at the rate sold
3,220
57.5%
$483,000
Given away on retainers
560
10.0%
$0
Non-billable work nobody priced in (client reporting, status updates, internal meetings, account admin)
1,540
27.5%
$0
Bench or unassigned
280
5.0%
$0
Total
5,600
100%
$483,000

Only 280 hours sat unassigned, so the team really is full: 5,320 hours booked, or 95% of the month. Yet billable utilization is 57.5%, and the team billed only 85.2% of the 3,780 hours it spent delivering for clients.

Billable utilization=3,220 billed hours5,600 available hours=0.575\text{Billable utilization} = \frac{3{,}220 \text{ billed hours}}{5{,}600 \text{ available hours}} = 0.575

In dollars, the planned vs. actual delivery margin for the month shows a $164,500 gap. The plan bills 4,200 hours at $150 and costs 5,600 hours at $70.

Delivery margin line

Plan at rate card
Actual this month
Billed hours
4,200
3,220
Revenue
$630,000
$483,000
Delivery cost
$392,000
$409,500
Delivery margin
$238,000 (37.8%)
$73,500 (15.2%)

Actual cost runs $17,500 over plan. Senior people costing about $95 an hour spent 500 hours on work priced for mid-level staff at about $60.

The rest of the gap is unbilled revenue. Giving away 560 retainer hours cost $84,000 at $150 an hour. Non-billable and bench time used 1,820 hours against the 1,400 the plan allowed, so the extra 420 hours cost $63,000. That makes over-servicing the biggest single cause, at about half the gap.

Run the same split on last month's timesheets. If your time entries can't be sorted into these four buckets, that's your first finding.

Check your billable utilization before you split the month

Work out the billable utilization figure your own booked-hour breakdown starts from.

Try the utilization calculator

Five causes, and the symptom that gives each one away

The breakdown shows how many hours went missing, and usually one or two causes took most of them. Each leaves a distinct symptom in the numbers, and every threshold here is a working rule of thumb to adjust to your rate card.

Retainer hours given away beyond the allowance

Over-servicing shows up as retainer accounts burning past their monthly allowance while the invoice stays flat. Small requests get absorbed because they're quick, and nobody logs them as out of scope.

The test is retainer burn above 110% of the allowance two months running. One heavy month is just busy; two in a row is a scope that has outgrown its fee.

Log every out-of-scope request against the retainer as it arrives, then offer a change order or re-scope at renewal. Roll underspend and overspend between months only inside a band both sides have agreed. Our guide to preventing scope creep on retainers covers the client conversation.

Non-billable work nobody priced in

Busy weeks with low billable utilization point to non-billable load the rate card never priced: status decks, client reporting, internal meetings and account admin. You'll know it's this cause when non-billable plus bench hours run more than 5 points above the rate card's share. In the example, they took 32.5% against 25%.

List the top three non-billable activities by hours. Then price account management and reporting into the retainer as named deliverables, or cut the time. Either way, these hours belong in each account's cost to serve.

Work sold below what it costs to deliver

Two rates per account tell you whether you have a pricing problem or a delivery problem. Billed rate is revenue divided by billed hours, and effective rate is revenue divided by every client hour worked. Set a working floor at twice the fully loaded cost rate, then adjust it to your target margin.

A billed rate below the floor is a pricing problem, so reprice from what the last comparable projects cost. A billed rate above the floor with an effective rate below it is a delivery problem, so fix scope and hours first. In the example, the $150 billed rate clears a $140 floor, but $483,000 across 3,780 client hours tells a different story:

Effective rate=483,000 revenue3,780 client hours≈127.78\text{Effective rate} = \frac{483{,}000 \text{ revenue}}{3{,}780 \text{ client hours}} \approx 127.78

At about $127.78, the effective rate sits below the floor, so this agency has a delivery problem. I see scope creep as a scoping failure that clients get blamed for, and it usually begins with an underbid at the pitch. An underbid rarely shows in the rate; it shows up later as hours the effective rate has to absorb.

Senior people doing work priced at junior rates

When budgets burn faster than progress and the same senior names keep appearing on production tasks, the staffing mix has moved away from the quote. Confirm it by checking whether the senior share of hours runs more than 10 points above the mix the quote assumed. Plan by role before the project starts and keep senior time for work priced at senior rates; in the example, that swap cost $17,500. The mix lever in our project variance guide runs the same check per project.

Hours AI removed from work you still bill by the hour

When logged hours on hourly accounts fall while scope holds, AI has removed hours you used to bill, and invoices shrink. The giveaway is logged hours down 10% or more quarter on quarter with the same deliverables. The fix is fixed fee or outcome pricing, set from what the work costs now.

In SPI Research's 2026 Impact of AI on Professional Services report, firms saying AI had "significantly increased" productivity achieved 85.9% of their revenue target. Firms reporting no change achieved 93.5% (both figures from Chapter 6 of the full report). Saved hours don't become revenue on their own; on an hourly account they come off the invoice unless you reprice or resell them. Our guide to where AI-saved hours leak covers the pricing math.

Each cause fails a different test and needs a different first fix.

Cause

Symptom you'll see
Test that confirms it
First fix
Retainer hours given away
Burn past allowance, flat invoice
Over 110% of allowance two months running
Log requests, then change order or re-scope
Non-billable work nobody priced in
Busy team, low billable utilization
Non-billable plus bench over 5 points above plan
Price reporting in, or cut it
Work sold below cost
Thin margin even inside scope
Billed rate under twice the cost rate
Reprice from comparable projects
Senior people on junior-rate work
Budgets burn faster than progress
Senior share over 10 points above quoted mix
Plan by role and protect senior time
Hours AI removed from hourly work
Logged hours fall, invoices shrink
Hours down 10% or more quarter on quarter
Move to fixed fee or outcome pricing

If two rows fit, start with the one holding more dollars in your breakdown. That's your dominant cause, and it sets the order for everything else.

Score your agency's margin gaps

The audit scores five areas of agency profitability and estimates the impact of each gap.

Run the agency profitability audit

Fix the biggest bucket first, then reprice what's left

Once you've named the dominant cause, fix the bucket holding the most dollars first, because hours recovered from an existing client cost nothing to win. Raising utilization or winning more clients comes later, because more booked hours pour into the same four buckets. Leaks outside delivery hours need a different exercise, which our agency margin leak map covers.

  1. Stop the biggest give-away: In the example that's retainer over-servicing, and recovering half the 560 hours adds $42,000 a month.

  2. Price or cut the non-billable load: Charge for account management and reporting inside the retainer, or remove the hours.

  3. Restaff the mix: Move production tasks back to the roles the quote priced, and protect senior time.

  4. Reprice what's left: Raise rates that sit below the floor, and move hourly work AI is shrinking to fixed fee.

Step 2 often starts with reporting. As an Account Director, I watched manual client reporting eat unbillable hours every week, because every client wanted a different format. If one status update takes half a day to build, nobody can see the account for the rest of the month. That's the gap to close.

Step 4 follows where pricing is heading. Business Insider reported in November 2025 that about a quarter of McKinsey's global fees now come from outcome-based pricing. That's one firm's own fee mix, not an industry rate. For an agency, it backs pricing retainer deliverables from what they cost, so a faster month doesn't shrink the fee.

A good breakdown next month has given-away hours at or under 5% of available hours. Non-billable plus bench should be back inside the rate card's 25% allowance.

Booked-hour bucket

Hours this month
Target hours next month
Billed at the rate sold
3,220
3,920
Given away on retainers
560
280 or fewer
Non-billable work and bench
1,820
1,400 or fewer

If the freed hours go to billable delivery and senior time returns to senior work, revenue reaches $588,000 and delivery margin $196,000, or 33.3%. That's about three quarters of the gap recovered without winning a single new client.

Where this diagnosis stops working

The fix order assumes last month's hours are accurate, and the diagnosis breaks down when they aren't. If the team doesn't trust its own timesheets, fix time capture first, then run the split on two clean weeks. Under about 15 people, one person's month swings every average, so look per person and per account instead.

Project-only shops without retainers won't see a given-away bucket in the same form, because it turns into scope overruns on fixed fees. A project-level variance check on each fixed fee fits that shape better. At any size, averages hide imbalance: a 75% team average can be two people at 95% and two at 55%. Read utilization per person before you trust the team figure.

How Teamwork.com shows where every booked hour went

Teamwork.com builds the booked-hour breakdown from live delivery data, so nobody rebuilds it from timesheets each month. It's the agentic PSA (professional services automation platform), connecting projects, resourcing and financials in one system. Project management software tracks tasks, while a PSA tracks whether the work is actually making money. Teamwork.com captures time, cost rates and billable rates in the same place delivery happens, keeping all four buckets current for every client and retainer.

Catch retainer overspend in the week it starts. Over-servicing does the most damage when nobody sees the allowance running out until renewal. Retainers in Teamwork.com reallocate the budget across the retainer, adding underspend to the next period or subtracting overspend from it. Custom notifications alert you when the budget reaches an amount you set. Set that amount below the allowance, and over-servicing shows up as an alert long before the 110% test fails.

See whose week went to work nobody pays for. Non-billable load and senior people on junior tasks both disappear inside a team total. The Utilization Report gives you real-time reports on how the team is being used, against billable targets set for every team member. The AI Utilization Summary shows who is over-capacity, under-capacity or unassigned, for a manager to act on. The Workload Planner is the short-term planning view where you shift tasks and balance workloads, moving production tasks back to the roles the quote priced.

Blog post image

Tell a pricing problem from a delivery problem. The two-rate test stalls when revenue, hours and cost live in separate spreadsheets. Set custom cost and billable rates for each team member, and the Profitability Report shows which projects or clients are profitable. With revenue, logged hours and cost in one place, you can work out both rates without rebuilding a spreadsheet. The AI Profitability Forecaster gives data-backed predictions of revenue, cost and profit, for you to review before you reprice.

Blog post image

Manual reporting belongs in the non-billable bucket. OIC Advisors moved budget reporting, portfolio dashboards and time tracking into Teamwork.com. The result, per the OIC Advisors customer story: 100% less time spent manually generating reports.

A full calendar is only good news when you can see which of its hours were paid for.

See which booked hours got paid for as your team logs them, without rebuilding last month's spreadsheet.
Start your free trial

FAQ

Why is my agency always fully booked but never as profitable as it should be?

Your agency is likely giving away retainer hours, spending time on unpriced non-billable work or staffing projects at the wrong level. Busy time only turns into profit once it reaches an invoice at the rate you sold.

What's a healthy billable utilization rate for an agency?

A healthy billable utilization rate is the one your rate card assumes for each role, not a single industry number. Account-facing roles usually carry more non-billable time than production roles, so one team-wide target hides who is over or under plan.

What's the difference between utilization and the share of hours you actually bill?

Billable utilization compares billed hours with available hours, while the share you bill compares billed hours with every hour spent delivering for clients. The first shows whether people are busy on billable delivery, and the second shows whether that delivery got paid for.

Should an agency raise prices or cut over-servicing first?

Cut over-servicing first, unless your billed rate already sits below twice your fully loaded cost rate. Recovered retainer hours bring in revenue from clients you already have, while a price rise only helps if the hours stay inside scope.

How does Teamwork.com help an agency that's fully booked but not profitable?

Teamwork.com shows where each booked hour went by capturing time, cost rates and billable rates where delivery happens. Retainers alert you as spend nears the allowance, the Utilization Report separates billable from non-billable time, and the Profitability Report shows margin by client.

Related Articles
View all