The dominant factor is never the choice of framework — it is unclear scope. Every open question in the brief turns into a contingency in the estimate. A supplier that cannot see what happens on the unhappy path has to assume the worst. Investing a few days in a discovery phase often reduces the final cost far more than haggling over hourly rates.
Integrations tend to be the next major multiplier. A screen that writes to your own database is predictable; the same screen talking to a legacy ERP is a different problem. The effort lives in the third party: rate limits and sandbox access, slow approval cycles, inconsistent data. Ask each bidder to break integrations out as separate items, because that is where the numbers slip.
Non-functional requirements silently change the estimate. An application used by a small internal team has almost nothing in common with the same functionality handling thousands of external customers. Audit and compliance requirements, graphql vs rest uptime targets, load handling, audit logging and accessibility add real engineering time. Write them down at the start or you can expect them priced as extras.
Who actually does the work matters. A day rate tells you little on its own: one senior developer at a premium rate can be cheaper per delivered feature than a pair of junior developers who need supervision and rework. Check too what else appears on the invoice: hire react engineers coordination, QA, infrastructure work and design are legitimate costs, but they should be visible in the estimate.
The number in the proposal is rarely the total cost. Plan for infrastructure, paid APIs, observability and an ongoing support budget for every year the software runs. A common working assumption says that software in active use needs a recurring percentage of its original build cost annually for updates, top golang development companies security patches and small improvements. Leaving it out of the budget is the most frequent planning error.
