The biggest cost driver is never the technology stack — it is almost always uncertainty. Every ambiguity in the specification turns into a contingency somewhere in the quote. A vendor that cannot see what happens on the unhappy path must assume a pessimistic case. Investing a few days in a proper discovery often reduces the final cost by far more than haggling over hourly rates.
Connections to other systems are the next major outsource mobile app development multiplier. A form that saves data is easy to estimate; the same feature connected to a payment provider and a CRM is a different problem. The cost sits in the other system: rate limits and sandbox access, waiting on someone else's team, business process automation company fields that mean something different on each side. Ask the estimator to list every external system, because this is the usual source of overruns.
Non-functional requirements silently change the number. An internal tool used by twenty people costs far less than the same idea serving thousands of external customers. Compliance work, uptime targets, scalability, mvp development mistakes to avoid data retention rules and localisation each add real engineering time. Put them in the brief or you can expect the estimate to move later.
The mix of people behind the number changes the arithmetic. A day rate tells you little on its own: a senior engineer at a higher rate can be cheaper overall than two juniors who need heavy code review. Also ask which roles are billed: delivery management, testing, release engineering and analysis have to be done by someone, but these should be named rather than hidden inside a blended rate.
The build price is never the full cost of ownership. Expect hosting, subscriptions and licences, monitoring and a change budget annually. A useful planning figure holds that software development companies in uk in active use requires a meaningful share of its original build cost every year simply to stay current. Treating the launch as the finish line is the most frequent planning error.