The biggest cost driver is not technology — it is uncertainty. Every ambiguity in the brief becomes padding somewhere in the quote. A team that has no visibility into what happens on the unhappy path will assume a pessimistic case. Investing a few days in a discovery phase often reduces the final cost much more than any rate negotiation.
Connections to other systems remain the next major multiplier. A form that saves data is easy to estimate; the same feature talking to a legacy ERP is a different problem. The cost lives in the counterparty: poor documentation, slow approval cycles, offshore development center data that does not match your model. Ask each bidder to price integrations separately, as this is where estimates break.
The requirements nobody writes down quietly rewrite the estimate. A tool used by a handful of staff is a very different build from the same functionality handling a hundred thousand users. Compliance work, high availability, scalability, data retention rules and multi-language support each add weeks of work. State them early or you can expect them to arrive later as change requests.
The mix of people behind the number changes the arithmetic. A rate card reveals little on its own: one senior developer at a premium rate can be less expensive in the end than two inexperienced developers who need supervision and rework. Also ask who else is billed: coordination, QA, DevOps and analysis are real work, but these should be itemised.
The number in the proposal is rarely what you will actually spend. Expect infrastructure, third-party licences, logging and alerting and an ongoing support budget each year. A common working assumption holds that any production system consumes a meaningful share of the original budget every year for articles on software outsourcing updates, security patches and small improvements. Leaving it out of the budget remains the most common budgeting mistake.