The biggest cost driver which is better monolith or microservices rarely the choice of framework — it is almost always uncertainty. Every ambiguity in the requirements turns into a contingency in the estimate. A vendor that cannot see what happens on the unhappy path must assume the more expensive option. Investing a few days in requirements work often reduces the overall figure by far more than haggling over hourly rates.
Integrations remain the next major multiplier. A feature that touches only your own data is easy to estimate; the same screen wired into a legacy ERP is another matter entirely. The unknown hides in the other system: rate limits and sandbox access, waiting on someone else's team, data that does not match your model. Ask each bidder to list every external system, since this is where estimates break.
The requirements nobody writes down quietly rewrite the number. A tool used by a handful of staff costs far less than the same idea serving public traffic. Audit and compliance requirements, high availability, performance under load, data retention rules and accessibility all add real engineering time. Write them down at the start or expect them to arrive later as change requests.
The team you are quoted matters. An hourly rate tells you almost nothing on its own: an experienced engineer at twice the price can be cheaper per delivered feature than two inexperienced developers who require supervision and rework. Check too what else appears on the invoice: project management, quality assurance, infrastructure work and design have to be done by someone, but these should be visible in the estimate.
The number in the proposal is not what you will actually spend. Expect hosting, third-party licences, observability and livewire developer an ongoing support budget each year. A common working assumption holds that a live system consumes a recurring percentage of its original build cost per year simply to stay current. Treating the launch as the finish line is the classic mistake.