How to Price a Project (Not Just an Hour)

The trap of “just multiply hours by my rate”

Hourly billing feels safe. It maps effort to money in a way you can defend line by line, and nobody argues with a clock. But it quietly punishes you for getting good — the faster you work, the less you earn for the same result — and it turns every client call into a meter-watching exercise where you’re half-listening, half-counting minutes.

A fixed price flips that. You sell the outcome, and the speed you bought with years of practice stays in your pocket where it belongs.

The catch: a fixed price is a bet. You name a number before you’ve done the work. Most freelancers lose that bet, and not because they’re slow. They lose because they guessed the scope, skipped the buffer, and quoted a figure that felt “fair” instead of one they built up from parts they could actually point to.

Here’s the method I use, walked through start to finish with a project close enough to real that you’ll recognize the client.

The brief: a bakery wants its site “freshened up”

A bakery owner emails. She wants the old site “freshened up,” online ordering “if it’s not too expensive,” and it done “sometime before the holidays.” That’s the whole brief — vague, hedged, and full of soft words doing heavy lifting. Clients are almost always like this, not to trap you, but because pinning down requirements is your job and they know it.

So before any number exists, turn the fog into nouns and verbs. Not “freshen up,” but: rebuild the 5 existing pages, add a menu page that pulls from a Google Sheet she’ll keep updated herself, drop in a contact form, set up a Stripe order form for 12 products, and migrate her existing photos. “Online ordering” stops being an open-ended wish and becomes a feature with a fence around it.

Write the scope as deliverables you could physically tick off. The test is simple: if you can’t tick it, you can’t price it.

Estimate hours by task, not by gut

Don’t think “eh, maybe two weeks.” Two-week guesses are where money bleeds out, because the whole-project number always hides the parts you forgot. Break it into tasks you can actually picture.

TaskEstimated hours
Discovery call + scope doc3
Design pass (home + template)8
Build 5 content pages10
Menu page wired to her spreadsheet6
Stripe order form, 12 products9
Contact form + email setup2
Photo migration + cleanup3
Testing, mobile, fixes6
Revisions (2 rounds)5
Subtotal52

Two things make this honest. First, the boring stuff is in there — the discovery call, the testing, the two rounds of revisions. Those aren’t free; they’re some of the most reliable hours on the whole job. Second, every line is your actual pace, not the pace of some perfectly focused version of you who never checks email.

A habit worth building: estimate each task as low / likely / high in your head, write down the likely, and flag anything with a scary high. The Stripe form is mine here — if her 12 products turn out to have sizes and flavor variants, “9 hours” could quietly become 16. I’m not solving that yet. I’m just naming it so the buffer can.

Set the rate you build from

You need an internal hourly rate the client will never see. This isn’t a dream number. It’s the floor that keeps the lights on after you subtract unpaid admin, software subscriptions, the taxes you’ll owe, and the weeks you don’t bill anything at all.

Say your target effective rate is $70/hour — and pick yours from your own costs and the market you serve, not from mine. That $70 isn’t what you charge a client per hour. It’s the number that, spread across your genuinely billable hours, has to cover both your life and your business.

52 hours × $70 = $3,640.

That’s your raw cost-of-effort baseline. It is not the price. Don’t send it.

Add a buffer, and know exactly what it’s for

Every fixed quote needs a buffer, because your estimate is a forecast, and forecasts are wrong in one direction more than the other. The only real question is how big.

A common rule of thumb: 15–25% contingency on a project you understand cold, climbing toward 30–40% when there’s real unknown territory. The bakery job has one genuine wildcard (Stripe, possibly with variants) and a client who’s going to have a steady drip of “tiny” requests. I’d sit near the top end.

Apply 30%:

  • Baseline: $3,640
  • Buffer (30%): $1,092
  • Buffered total: $4,732

That buffer is not padding you slip in while avoiding eye contact. It’s the price of certainty — hers and yours. She gets a number that won’t move; you get oxygen for the parts that always go sideways. And when a project runs clean and you come in under, you keep the gap. That’s fixed pricing finally working for you instead of against you.

One line I never bend on: the buffer covers my estimation risk, not her scope changes. A new feature she dreams up in week three is a change order with its own price, full stop. Write that into the proposal in plain words. The buffer pays for the Stripe form being harder than expected. It does not pay for a blog, a newsletter, and a loyalty program nobody mentioned in the brief.

Protect the margin, then round to a real price

Covering your costs and making a profit are two different things, and it’s easy to confuse the warm feeling of one for the other. Your $70 rate already carries some margin if you built it from full costs. But it’s worth checking what you’re actually keeping, because “I made $4,700” feels great right up until you subtract the Stripe test account, the stock photos you bought, and the unbilled afternoon you spent on the phone talking her through her own logo.

If that math feels fuzzy, it helps to run the numbers through a margin and markup calculator so you can see the gap between what you invoice and what lands in your account. Markup is what you add on top of cost; margin is the slice of the final price that’s profit. They’re not the same thing, and quietly mixing them up is how people quote with total confidence and still end the year wondering where it all went.

Then round — but round up, to a clean and obviously intentional number. $4,732 becomes $4,800, maybe $4,950. Don’t quote $4,732. A weirdly precise figure broadcasts “I added up a column of hours,” and that invites a client to argue with the column line by line. A round number reads as a price for an outcome, not a receipt.

A quick word on tax, because it changes what actually reaches you. How you handle sales tax, VAT, or GST — and the income tax you’ll owe on this fee — varies enormously by country and by your own registration status. There’s no single rate I can hand you here, and you shouldn’t trust one if anyone tries to. Don’t accidentally bury those costs inside your margin, and treat none of this as tax advice: check your local rules with an official source or a qualified professional before the quote leaves your outbox.

The number, end to end

  • Scope → 9 concrete deliverables
  • Estimated effort → 52 hours
  • Internal rate → $70/hr → $3,640 baseline
  • Buffer (30%, justified by the Stripe unknown and a chatty client) → +$1,092
  • Margin check → confirm profit, not just cost recovery
  • Round up → $4,950 fixed

She sees one number and a list of what it buys. You see a price you can stand behind, because if she ever asks how you got there, you can show your work without flinching.

The checklist, for the next vague brief

You’ll get another one of these soon. When you do:

  1. Rewrite the scope as deliverables you could literally tick off. A verb without a boundary (“freshen up”) gets a boundary before it gets a price.
  2. List every task, including the invisible ones — calls, the scope doc, testing, revisions, admin. They’re real hours; bill them.
  3. Estimate each task at your real pace, and flag anything with a frightening worst case.
  4. Multiply by your internal rate — the floor that covers costs, taxes, and unbilled time — for a baseline.
  5. Add a buffer sized to your ignorance. More unknowns, bigger buffer. It covers your estimation risk, not her wishlist.
  6. Check your margin, not just your cost coverage. Subtract the real expenses you’ll forget otherwise.
  7. Round up to a clean number, and put your revision and change-order limits in writing.

The first time you run this it takes twenty minutes and feels like wild overkill for one quote. By the fifth project it’s a spreadsheet you fill out over a coffee. Somewhere in there the 2am math sessions stop — the ones where you lie awake re-deriving whether you undercharged. You don’t need to. You already did the arithmetic, in daylight, on paper. The number holds.

Try the matching tool