The conversation goes the same way almost every time a new client comes in.
They ask the cost. I ask what they actually need. I send a quote. "That's expensive." I walk through exactly what's in it, line by line. Still expensive. I offer a small discount to keep the relationship. They come back asking for more.
I used to keep giving. Then a Canadian client taught me why that habit was going to cost me a lot more than money.
The job that changed how I quote
This client bargained hard, I dropped my price to close the deal, and the scope was small: a few updates to their existing WordPress site. I'm not a big fan of WordPress — I'll say that upfront, it colors this story — but it was a small job at a reduced rate, so I said yes.
"A few updates" did not stay a few updates. One small ask led to another, which needed a plugin that conflicted with another plugin, which needed a theme change, which broke something else. Each individual request sounded reasonable on its own. Together, they added up to rebuilding the entire site from scratch — at the price I'd agreed to for a handful of tweaks.
I did it. I finished the job. And I lost money and time on a client I'd already discounted to win.
What I actually did wrong
It wasn't agreeing to a discount. It was agreeing to a discount without re-scoping the moment the ask changed. Every "can you also just..." should have been a new estimate, not a favor squeezed into the old one. I said yes to the relationship instead of saying yes to a number, and by the time I noticed how far the scope had moved, I'd already done half the extra work for free.
What I say now
When a client pushes for a lower price after I've already explained the quote, I tell them straight:
"You're expecting Corolla pricing, but what you've asked for is Lamborghini options. You'll get exactly what you pay for."
It sounds blunt written down. In conversation it isn't — it's said plainly, not angrily, and it does something a longer explanation doesn't: it makes the mismatch obvious in one sentence. A client who wants custom logic, clean code, and something that won't break in six months is not shopping in the same category as a client who wants the cheapest possible build. Both are valid. They're not the same job.
What changed in how I run projects since then
- The quote has a defined scope, in writing, before anything starts. Not "a few updates" — an actual list.
- A discount is a number, not a mood. If I reduce the price, the scope shrinks to match it. I say that out loud when I offer the discount, not after the client tries to expand the work.
- "Can you also just—" gets a real answer: "Sure, that's outside the current scope, here's what it adds." Every time, no exceptions, said the same calm way whether it's the first ask or the fifth.
- I stopped treating discount requests as a negotiation I have to win by conceding. Explaining the quote once is fair. Explaining it three times while lowering the number each time teaches the client that pushback is how you get a cheaper Claude — sorry, cheaper developer.
- I'm honest about not loving certain platforms going in. If I'm not a WordPress person and the job is a WordPress site, the client should hear that before I quote, not discover it when something breaks.
- If the number doesn't work, I walk. Not every negotiation ends in a deal, and that's fine. I'd rather sleep well or watch a movie than take a job at a price that means I'm working for free by week two. Saying no to a bad price is cheaper than saying yes and resenting the project for the next month.
Why I think this is worth sharing
Every freelancer or agency dev has some version of this story. The details change — the platform, the client, the country — but the shape is identical: discount granted, scope quietly expands, developer eats the difference because walking away mid-project feels worse than finishing at a loss.
The fix isn't "don't give discounts" or "don't take small jobs." It's that price and scope have to move together, every time, out loud, before the work happens — not after you're three unpaid hours into a rebuild you didn't agree to.
What's your version of the Corolla line? Every developer I know has one phrase that ends these conversations — I'd like to hear yours.

Top comments (0)