This is an old revision of the document!
The single largest cost driver is rarely technology — it is unclear scope. Every ambiguity in the specification is converted into a contingency inside the number you receive. A team that cannot see what happens on the unhappy path must assume the more expensive option. Putting two weeks into a discovery phase can cut the overall figure much more than haggling over hourly rates.
Third-party integrations are another reliable source of cost. A screen that writes to your own database is predictable; the same feature wired into a payment provider and a CRM is another matter entirely. The unknown lives in the other system: rate limits and sandbox access, slow approval cycles, reactjs vs vuejs data that does not match your model. Ask the estimator to price integrations separately, react vs livewire because this is where estimates break.
Non-functional requirements quietly rewrite the budget. An application used by a small internal team has almost nothing in common with the same idea handling a hundred thousand users. Security reviews, availability guarantees, load handling, audit logging and accessibility all add measurable effort. Write them down at the start or you can expect them to arrive later as change requests.
Who actually does the work matters. A rate card says very little on its own: a senior engineer at twice the price frequently turns out to be cheaper per delivered feature than two juniors who need constant review. Check too who else is billed: coordination, QA, infrastructure work and UX design are legitimate costs, but they should be visible in the estimate.
The build price is not what you will actually spend. Expect infrastructure, subscriptions and licences, observability and a change budget for every year the software runs. A common working assumption is that software in active use needs a recurring percentage of the initial investment annually developers for hire updates, security patches and small improvements. Leaving it out of the budget is the classic mistake.
