How We Estimate Projects (And Why It's Hard)
Clients always ask: "How much will this cost?" Fair question. But the honest answer is complicated, and most people don't want complicated. They want a number.
So let me explain how software estimates actually work. Why they're uncertain. Why experienced developers sometimes get them wildly wrong. And why the cheap estimate from that other agency might not be the bargain it looks like.
The Fundamental Problem
Estimating software is like estimating a home renovation before you've opened the walls. You can see the surface. You know roughly what needs to happen. But until you actually start working, you don't know if there's asbestos behind the drywall or if the previous owner did the wiring with duct tape.
Software projects have hidden complexity everywhere. The "simple" feature that turns out to have fifteen edge cases. The third-party API that doesn't work like its documentation claims. The existing system with undocumented quirks that only surface when you start building.
We're not fortune tellers. We're making educated guesses based on experience and incomplete information.
How We Actually Estimate
Step 1: Break It Down
The first thing we do is break the project into pieces. Not "build the app" but individual features and components: user authentication, database design, API endpoints, UI screens, integrations, testing.
Each piece gets its own estimate. A login system might be 8-12 hours. A payment integration might be 20-30 hours. An admin dashboard might be 40-60 hours.
Step 2: Add Context
Raw hour estimates don't account for reality. We factor in things like:
- How clearly are requirements defined? Vague specs mean more back-and-forth.
- Are there dependencies on things outside our control? Third-party APIs, client approvals, existing systems?
- How experienced is our team with this particular tech stack?
- Is the client organized? Responsive? Or will we be chasing approvals for weeks?
Step 3: Apply Buffers
Here's where experience matters. Naive estimates are almost always too optimistic. Things take longer than you think. So we apply buffers.
A common approach is multiplying by 1.5 or 2. If the raw estimate is 100 hours, we might quote 150-200. That sounds like padding, and it is, but it's padding based on hundreds of projects where the "unexpected" happened every single time.
Some agencies skip this step to give you a lower number. Then they hit you with change orders when reality bites.
Step 4: Give Ranges, Not Exact Numbers
When possible, we provide ranges. "$15,000-$20,000" is more honest than "$17,500" because it acknowledges uncertainty.
If someone gives you an exact number with no range, they're either very confident (sometimes justified) or hiding uncertainty to make the sale (more common).
Why Estimates Go Wrong
Requirements change. You said you wanted A, we priced A, now you want A plus B and C. That's fine, but it's a different project with a different price.
Unknowns surface. That third-party service you need to integrate? Turns out their API is broken and we have to build workarounds. Nobody could've known until we tried.
Scope creep. Small requests add up. "Can we just add..." a dozen times becomes weeks of extra work. Each change seems tiny but they compound.
Optimism bias. Developers are optimists. We think we can do things faster than we can. Good estimators fight this instinct, but it's always there.
Communication gaps. You said "simple checkout." We heard "basic PayPal button." You meant "full e-commerce with guest checkout, saved cards, and Apple Pay." Nobody was lying. You just had different pictures in your heads.
Fixed Price vs. Hourly
There's always tension here. Clients want fixed prices because budgets are real. Developers prefer hourly because estimates are guesses.
Fixed price works when:
- The scope is crystal clear
- Requirements are documented and unlikely to change
- Both sides understand what's included and what's not
Hourly works when:
- Requirements are evolving
- The project involves discovery and experimentation
- You want flexibility to change direction without renegotiating
We often do hybrids. Fixed price for well-defined phases, hourly for ambiguous parts or ongoing changes.
What "Cheap" Usually Means
If someone's estimate is half of everyone else's, ask yourself why.
Maybe they're more efficient. Maybe they've built this exact thing before. Maybe they're in a lower cost-of-living area.
Or maybe they're cutting corners. Using inexperienced developers. Skipping testing. Planning to hit you with change orders. Using off-the-shelf templates that'll need expensive customization later.
Cheap estimates often become expensive projects.
How to Work With Estimates
Prioritize ruthlessly. What absolutely needs to be in v1? Cut the nice-to-haves. You can always add them later. Smaller scope means more accurate estimates.
Get detailed breakdowns. Don't accept "it'll cost $30k." Ask what that includes, hour by hour or feature by feature. This lets you evaluate if it's reasonable.
Build in contingency. Whatever budget you have, keep 20-30% in reserve. You'll probably need it. If you don't, great - that's money for v2.
Stay involved. The more responsive and available you are during development, the fewer delays and misunderstandings. This directly impacts whether estimates hold.
Accept uncertainty. If you want a guarantee, you're asking for something that doesn't exist in software. The best you can get is experience, transparency, and clear communication when things change.
Estimates are a starting point for a conversation, not a binding promise about the future. Treat them that way and you'll have fewer surprises.