Revenue per client is the number most freelancers and small agencies track. It's also the wrong number for deciding which clients to keep, because it ignores the hours that never show up on an invoice: the extra rounds of revisions, the Slack messages answered at 9pm, the scope creep nobody billed for, the client calls that run twenty minutes over.
Here's a straightforward way to work out real profitability per client, not just top-line revenue, using nothing more than a few weeks of honest time tracking.
Step 1: Total up actual hours, not billed hours
Start tracking every hour spent on a client for one full billing cycle, including work that wasn't billable. Onboarding calls, revision rounds beyond what was scoped, internal Slack or email threads, project management overhead, the ten minutes spent hunting down a file the client swears they sent. Most time tracking tools (Toggl, Harvest, or even a plain spreadsheet) can separate billable from non-billable time if you tag entries consistently from the start.
The gap between billed hours and actual hours is usually bigger than people expect, and it's almost always bigger for the clients who feel the most "easy," because a good relationship makes the extra unpaid time invisible until you actually add it up.
Step 2: Calculate a true effective hourly rate
Take total revenue from that client for the period and divide it by total actual hours, not billed hours. This is the number that matters, not the rate printed on the contract.
effective_rate = client_revenue / actual_hours_spent
A client paying a nominal $150/hour rate but requiring double the scoped hours in revisions has an effective rate closer to $75/hour once every hour is counted. A client paying $100/hour who never asks for anything outside scope might have an effective rate closer to $110/hour once efficiency and low overhead are factored in. The nominal rate on paper tells you almost nothing about which client is actually better business.
Step 3: Add in the overhead that's specific to that client
Some clients cost more to serve structurally, regardless of hours logged: more frequent status meetings, specialized tools or software licenses required just for their project, extra insurance or compliance requirements that only apply to that one account. Assign a rough dollar value to this overhead per client per month and subtract it from revenue before calculating the effective rate.
adjusted_profit = client_revenue - overhead_cost
true_effective_rate = adjusted_profit / actual_hours_spent
A client requiring a dedicated project management tool seat, a NDA-driven compliance review, or a weekly call that eats into billable time elsewhere is quietly more expensive to serve than the invoice total suggests, and this step is where that cost finally gets counted instead of absorbed silently.
Step 4: Rank clients by true effective rate, not revenue
Once every active client has a true effective rate, rank them from highest to lowest. The highest-revenue client is frequently not the most profitable one once actual hours and overhead are factored in, and this ranking is where the surprises usually show up.
This ranking is the actual decision-making tool: it tells you who to raise rates on, who to scope more tightly going forward, and in some cases, who to let go entirely once a pipeline exists to replace that revenue with something less draining. It also tells you which client relationships are worth protecting and investing more time into, since the top of the list is usually where the best future referrals come from too.
The Freelancers Union publishes general guidance on rate-setting and scope management that pairs well with this kind of per-client analysis, particularly for freelancers navigating the awkward conversation of raising rates on a long-standing but low-margin client who has simply never been asked to pay more.
What to actually do with a low-ranked client
Finding a client near the bottom of the ranking doesn't automatically mean firing them. There are usually three options worth considering before that step. First, renegotiate scope, sometimes a client isn't a bad fit, the engagement has just drifted beyond what was originally priced, and a scope conversation resets the relationship without losing the account. Second, raise the rate specifically for that account at the next renewal, framed around the actual value delivered rather than an arbitrary increase. Third, set firmer boundaries around response times and revision rounds, which often recovers a meaningful chunk of the lost hours without any pricing conversation at all.
Firing a client is the last resort, not the first move, and it only makes sense once the other three options have been tried or the relationship has become clearly unsustainable regardless of pricing.
A note on scope creep specifically
Scope creep is the single biggest driver of clients sliding down this ranking over time, and it rarely arrives as one dramatic ask. It shows up as a string of small, individually reasonable-sounding requests: one extra revision round here, a quick call there, a "can you just also" tacked onto an email. None of these look like a big deal in isolation, which is exactly why they're so easy to under-price collectively.
Tracking actual hours against scoped hours on a rolling basis catches this drift early, well before it's accumulated into a client that's quietly become unprofitable over six months of small, reasonable-sounding asks that were never individually worth pushing back on.
Step 5: Revisit the ranking quarterly, not once
A client that scores well this quarter can slide next quarter if scope quietly expands without a corresponding rate increase, which happens gradually enough that it's easy to miss without a recurring check-in. Treating this as a one-time exercise defeats the purpose. The value comes from catching the drift early, before six months of underpriced scope creep has accumulated into a client relationship that's quietly losing money every month.
Automating the recalculation
Doing this by hand quarterly is enough to catch the worst offenders, but a client profitability scorecard by EvvyTools runs the same effective-rate and overhead math automatically once hours and revenue are entered, so the ranking updates each time new time-tracking data comes in instead of requiring a fresh spreadsheet build every quarter.
This kind of per-client math is also a preview of a bigger conversation that comes up when a service business is eventually sold or valued. A deeper look at why business valuation methods disagree covers how client concentration and profitability per account directly affect what a buyer is willing to pay, since a business dependent on a handful of low-margin, high-maintenance clients is worth measurably less than one with a diversified, high-margin client base, even at identical total revenue on the top line.
Tracking this consistently changes more than pricing decisions. It changes which clients you say yes to in the first place, once the real cost of a demanding but modestly-paying account is sitting in a number instead of a vague feeling.
Applying the same math before saying yes to a new client
Once this framework exists for current clients, it's worth applying a rough version of it before signing a new one, not just after the fact. A prospective client's requested scope, communication style during the sales process, and stated budget are all early signals that map reasonably well onto the effective-rate math described above. A prospect who negotiates hard on price while requesting an unusually detailed scope of work upfront is telling you something about the effective rate that engagement is likely to produce, well before the first invoice goes out.
This doesn't mean turning away every demanding prospect, some of the best long-term clients start out asking a lot of questions. It means going in with eyes open about where a new engagement is likely to land on the same ranking that existing clients get scored against, and pricing or scoping accordingly from the very first proposal rather than discovering the mismatch three months into the relationship.
Top comments (0)