The dominant factor is never technology — it remains uncertainty. Each unanswered question in the specification is converted into padding inside the number you receive. A vendor that cannot see the exceptions and edge cases has to assume the more expensive option. Putting two weeks into a proper discovery can cut the final cost much more than negotiating the rate.

Integrations remain another reliable source of cost. A form that saves data is easy to estimate; the same screen talking to a payment provider and a CRM is a different problem. The effort hides in the counterparty: undocumented APIs, java development agency waiting on someone else's team, inconsistent data. Ask any vendor to list every external system, as this is the usual source of overruns.

The requirements nobody writes down silently change the budget. An internal tool used by a small internal team is a very different build from the same feature set handling thousands of external customers. Compliance work, high availability, performance under load, traceability and accessibility all add measurable effort. State them early or else expect them to arrive later as change requests.

The mix of people behind the number matters. A rate card tells you almost nothing on its own: a senior engineer at a higher rate is often cheaper overall than two juniors who require heavy code review. Also ask what else appears on the invoice: project management, quality assurance, DevOps and UX design are legitimate costs, but these should be itemised.

The number in the proposal is rarely what you will actually spend. Expect infrastructure, custom software development pricing third-party licences, logging and alerting and a maintenance allowance each year. A common working assumption holds that any production system consumes a noticeable fraction of the initial investment annually in fixes, updates and small changes. Treating the launch as the finish line remains the most common budgeting mistake.