The biggest cost driver is never the technology stack — it is almost always uncertainty. Every ambiguity in the specification turns into a buffer somewhere in the quote. A team that cannot see what happens on the unhappy path has to assume the worst. Investing a few days in requirements work can cut the total far more than negotiating the rate.
Connections to other systems tend to be the second big multiplier. A feature that touches only your own data is low risk; the same feature connected to a legacy ERP is a different problem. The effort lives in the counterparty: poor documentation, slow approval cycles, how software outsourcing works fields that mean something different on each side. Ask each bidder to break integrations out as separate items, since this is where estimates break.
Quality attributes silently change the estimate. An internal tool used by a small internal team has almost nothing in common with the same functionality handling public traffic. Compliance work, availability guarantees, performance under load, traceability and localisation add real engineering time. State them early or expect them priced as extras.
Who actually does the work changes the arithmetic. A day rate tells you very little on its own: an experienced engineer at twice the price frequently turns out to be cheaper overall than two juniors who need supervision and rework. Check too which roles are billed: coordination, quality assurance, DevOps and UX design are real work, but they should be named rather than hidden inside a blended rate.
The build price is not what you will actually spend. Plan for cloud costs, third-party licences, observability and a maintenance allowance for every year the livewire software runs. A useful planning figure is that a live system requires a noticeable fraction of its original build cost per year for updates, security patches and small improvements. Treating the launch as the finish line remains the most frequent planning error.