How to Price Agency Work Without Guessing
Hourly caps your income and punishes efficiency. Value pricing is hard to sell. Here's the pricing model most agencies should actually run.
Most agency pricing is reverse-engineered from a number that felt sayable out loud. Someone estimates hours, multiplies by a rate they picked in 2021, adjusts until it sounds like a number the client will accept, and sends it.
That works until it doesn't, and the failure is always the same shape: the profitable projects subsidise the unprofitable ones, and nobody knows which is which.
Why hourly is a trap for agencies
It punishes you for getting good. Your team builds a component library, gets faster, and delivers the same outcome in half the time. Under hourly, you just cut your own revenue in half. You are financially penalised for the exact investment that makes you better.
It caps you at capacity. Revenue equals people times hours times rate. The only levers are hiring or raising rates.
It makes clients watch the meter. Every question becomes billable, so clients stop asking them. That's bad for the work.
It puts overrun risk on the client, which they will not accept quietly. The uncomfortable conversation about a bigger-than-expected invoice is a relationship tax you pay repeatedly.
Why pure value pricing is hard
The theory is appealing: charge a share of the value you create. If a site generates $500k, charge accordingly.
In practice it breaks down.
Attribution is contested. Was it the site, the ad spend, the product, the market? The client will credit the parts that aren't you.
Most clients can't tell you the value. Ask what a lead is worth and many genuinely don't know.
It requires a level of trust most new client relationships don't have yet.
Value pricing works for a small set of agencies with deep specialism and strong proof. For everyone else, it's a thing read about in a book and never successfully sold.
What actually works: fixed price on defined scope
Most agencies should run fixed price for projects, and the discipline is in the word defined.
Fixed price means you own the estimate risk. Get faster and you keep the upside. Underestimate and you eat it. That's the deal, and it's why the scope document matters more than the number.
The client gets certainty, which is what they actually want. Nobody enjoys an open-ended invoice.
It makes the conversation about outcomes, not hours. You're selling a finished thing, not a quantity of effort.
The requirement: you must know your real delivery costs. Which means tracking time even though you're not billing it. Not to invoice from — to price from. An agency that doesn't track time on fixed-price work is guessing forever.
Build the estimate from the bottom, then check it from the top
Bottom-up: break the project into components, estimate each one at what it actually takes based on your history, add your overhead rate, add margin, add contingency.
Top-down: what's this worth to the client, and what would a competent competitor charge? If your bottom-up number is far below that, you're leaving money on the table. If it's far above, either your scope is bloated or your delivery is inefficient.
Use both. The bottom-up number stops you losing money. The top-down number stops you underselling.
Contingency is not padding
Something on every project goes long. A stakeholder disappears for two weeks, an API turns out to be undocumented, a "simple" integration isn't.
Add 15–25% contingency depending on how much is unknown. Don't itemise it on the proposal — it's part of your price, not a line the client gets to negotiate away.
If you consistently finish under it, lower it. If you consistently blow through it, your estimates are wrong and no amount of contingency will save you.
The scope document earns its keep
The single highest-leverage document in an agency is the one that says what's not included.
Every fixed-price proposal should have an explicit out-of-scope section. It feels awkward to write and it prevents nearly every difficult conversation later. When someone asks for the extra feature in week six, you point at a document you both signed rather than negotiating from nothing.
Also define, in writing:
- Revision rounds. How many, and what a "round" means.
- Response time expectations from the client. Their delays are the most common cause of your overrun, and unless you've written it down you'll absorb the cost.
- The change process. New requests get a written estimate before work starts. Not a conversation at invoicing.
Retainers are the other half
Projects are lumpy. Retainers are what makes the business survivable, and they're covered properly in our retainer guide.
The short version: sell the retainer at handoff, when the client is happy and anxious about being alone with something they don't understand. Make it the default in your proposal with an opt-out, rather than an upsell they have to choose.
Numbers worth knowing
Effective hourly rate. Project price divided by hours actually spent. This is the number that tells you whether your pricing works, and most agencies have never calculated it. Do it per project for a quarter and the pattern will surprise you.
Margin by project type. Some work you're good at. Some you keep taking because you took it before. This tells you which is which.
Proposal win rate. Below about 30% and you're either quoting too high or chasing bad-fit work. Above 80% and you're almost certainly too cheap.
That last one catches people out. A very high win rate feels like success and usually means you're the cheapest option, which is a hard place to stay.
When to raise prices
When your win rate is high, your calendar is full, and you're turning work away. All three, not one.
Raise on new clients first. Existing clients get notice and a reason, not a surprise.
And expect to lose some. Losing your most price-sensitive clients while raising the rate on everyone else is usually a net gain — those clients are typically also the most demanding.
We work as a white-label build team for US agencies on fixed-price scopes, so you can quote your client without carrying the delivery risk. See how that works.