The dominant factor is rarely technology — it is almost always unclear scope. Each unanswered question in the brief becomes padding in the estimate. A team that does not know what is livewire happens on the unhappy path must assume the worst. Spending a week on a proper discovery often reduces the total much more than any rate negotiation.
Integrations remain the next major multiplier. A form that saves data is easy to estimate; the same feature talking to an old accounting system is not. The unknown lives in the other system: poor documentation, long certification processes, inconsistent data. Ask any vendor to break integrations out as separate items, because this is the usual source of overruns.
The requirements nobody writes down quietly rewrite the estimate. An application used by a small internal team is a very different build from the same functionality handling public traffic. Security reviews, uptime targets, scalability, traceability and multi-language support add measurable effort. Put them in the brief or expect them to arrive later as change requests.
Who actually does the work matters a great deal. A day rate says very little on its own: one senior developer at a higher rate frequently turns out to be less expensive in the end than two juniors who require heavy code review. Ask as well which roles are billed: delivery management, testing, DevOps and design have to be done by someone, but they should be itemised.
The quoted figure is rarely the total cost. Budget for infrastructure, third-party licences, monitoring and a maintenance allowance for every year the software runs. A useful planning figure is that bespoke software development in active use requires a noticeable fraction of the original budget annually simply to stay current. Treating the launch as the finish line is the most common budgeting mistake.