Skip to content
Proudly based in Nova Scotia, Canada · clients welcome from every countryContact usClient login
CodeLumaDevelopment Inc.

Home / Blog / Article

CodeLuma insights · May 11, 2026 · 6 min read

How We Estimate Software Projects Accurately Without Budget Surprises

Why software estimates go wrong and the method we use to get them right: decomposition, ranges, risk buffers, spikes, assumptions, reference projects, tracking, and how to keep budgets predictable through change.

Almost every client fears the same thing: a quote that looks reasonable and then doubles halfway through. And almost every experienced developer knows why it happens: estimating software is genuinely hard, and unrealistic optimism is the default. Some overruns are unavoidable, but most are predictable and preventable with a disciplined approach. This article explains why estimates go wrong and how we produce estimates you can plan around.

A good estimate is a range with stated assumptions, not a single confident number.
A good estimate is a range with stated assumptions, not a single confident number.

Why estimates go wrong

  • Optimism. People estimate the happy path and forget interruptions, reviews, defects, meetings and the time to understand old code.
  • Hidden complexity. "A login page" or "sync with the accounting system" hides many decisions: password reset, lockouts, roles, error handling, duplicates, rate limits, rate changes.
  • Unclear requirements. If nobody has defined what "done" means, the estimate is for an imagined product that differs from what is eventually built.
  • Unknown unknowns. Legacy systems, undocumented APIs and data quality surprises appear only once work begins.
  • Scope change. New ideas are healthy, but if they are not tracked against the budget, they silently accumulate.
  • Pressure to please. Vendors sometimes quote low to win work, planning to recover money through changes; see our red flags article.
  • Ignoring non-coding work: design, testing, deployment, data migration, documentation, training and project management.
A project agreement and pen on a desk
Original CodeLuma 3D render: a project agreement and pen on a desk.

Principle 1: estimate what you understand, discover what you do not

An estimate is only as good as the information behind it. For any project with real uncertainty, we recommend a paid discovery phase of a couple of weeks: interviews with users and stakeholders, workflow mapping, a review of existing systems and data, prototypes for the riskiest screens and a written scope with priorities; see our discovery phase article and how to scope an MVP. Discovery converts vague ideas into a backlog we can size and often reveals simplifications that save money.

Principle 2: break it down

Large estimates are inaccurate; small ones are more reliable. We decompose the project into features, then into tasks small enough to be understood, usually a day or two of work. Each feature includes all the work needed to make it real: design, front end, back end, database changes, tests, security checks, documentation and deployment. Estimating a feature as "5 days" without listing what it includes invites disagreement later. Breaking the work down also exposes the parts nobody has thought about.

Principle 3: use ranges, not single numbers

For each item we estimate a best case, a likely case and a worst case. The sum of many small ranges gives a total range, and the spread between them measures uncertainty. A project quoted as "between X and Y, most likely near Z" tells you far more than a false-precision single figure. Early in discovery ranges are wide; as unknowns are resolved they narrow, a phenomenon sometimes called the cone of uncertainty. Presenting ranges honestly also helps you plan your budget with a contingency.

Principle 4: write down the assumptions

Every estimate rests on assumptions, such as "the client provides content by week three," "the payment provider's sandbox works as documented," "the existing data can be imported with minimal cleaning" or "two rounds of design feedback." We list them explicitly. If an assumption proves wrong, the estimate changes, and both sides know why. Assumptions turn arguments about blame into conversations about facts; see the contract points in our article on pricing models.

Principle 5: investigate the risky parts early

For the areas of greatest uncertainty, such as an unfamiliar third-party API, a complex algorithm, performance requirements or a legacy data migration, we run a spike: a short, time-boxed experiment to learn what is really involved. A day or two of investigation can prevent a two-week surprise. Integrations are the classic example; see our integration guide and our webhooks article. Data migration is another, as explained in our spreadsheet migration article.

Principle 6: use reference projects and history

Past projects calibrate estimates. If comparable features took X hours before, that is better evidence than intuition. We keep records of estimates versus actuals and adjust our rules of thumb. Independent estimates from several team members, compared and discussed, reduce individual bias, and the disagreements point straight at hidden complexity.

Principle 7: budget for the invisible work

Real projects include time for project management and communication (our communication article), testing and bug fixing, code review, environments and deployment (CI/CD), security and performance work (security, speed), documentation and handover, and buffers for the unexpected. We include these explicitly rather than hoping they fit within the feature estimates. A typical build has a substantial share of effort outside pure "coding", and quotes that ignore it look cheap and finish expensive.

Illustrative ranking based on common experience, not a measured dataset. The exact mix varies by project.
Illustrative ranking based on common experience, not a measured dataset. The exact mix varies by project.
A clipboard with a completed checklist
Original CodeLuma 3D render: a clipboard with a completed checklist.

Principle 8: control change, do not fear it

Change is healthy, since you learn as you build. The danger is untracked change. We manage it with a visible backlog: each new idea is sized, and you decide whether it replaces something else, is added with a budget increase or waits. A fixed-scope phase with a clear change process, a flexible capped backlog, or a hybrid keeps you informed of the cost of each decision.

Principle 9: track and communicate against the plan

An estimate is a living document. We report progress regularly against the plan: work completed, remaining work re-estimated, hours consumed versus forecast, top risks and decisions needed. Bad news travels early, when there is still time to adjust scope, sequence or budget. Demonstrations of working software every iteration show real progress rather than percentages "complete." See also our feature flag guide for staged delivery and the retainer article for post-launch budgeting.

Where AI tools change estimates

AI-assisted development can speed up parts of the work, particularly boilerplate, tests and refactoring, but not discovery, decision-making, review, integration debugging or coordination with people. Any honest estimate accounts for both facts; see our article on low-code and AI assistants. Be sceptical of anyone promising to cut costs to a fraction simply because they use AI.

What you can do to keep your budget predictable

  • Invest in discovery and a clear written scope before committing to a large build.
  • Prioritise ruthlessly: separate must-haves from nice-to-haves and plan a first release with the former.
  • Appoint one decision-maker who can answer questions quickly; delays in feedback cost money.
  • Provide content, data and access early.
  • Ask for ranges, assumptions, and what would change the number.
  • Hold a contingency of ten to twenty percent, more for high-uncertainty projects.
  • Review progress and budget at every iteration.

Warning signs in someone else's estimate

  • A single number with no breakdown.
  • No mention of testing, security, deployment, project management or post-launch support.
  • Much lower than other quotes without a clear explanation.
  • No stated assumptions or exclusions.
  • Reluctance to explain how they arrived at the figure.

Estimating is a skill of honesty as much as arithmetic. Our software team provides ranged, assumption-based estimates after a short discovery, and reports openly against them; contact us to discuss your project. Our maintenance plans then keep the ongoing budget just as predictable.


Put this into practice with CodeLuma

CodeLuma gives ranged, assumption-based estimates broken into features, validated by early technical spikes, and tracked openly against actuals, so you see risks before they become surprises.

Start a conversation. Tell us about your project and we will reply with practical next steps, or browse all CodeLuma services. CodeLuma Development Inc. is based in Nova Scotia and works with teams across Canada and remotely.

Keep reading

Share this article: Facebook · LinkedIn · X · Email

← All articles

Ready to put this into practice?

Talk to a Nova Scotia full-stack team that builds complex, connected systems for clients across Canada and worldwide.

Start a project