The single largest cost driver is rarely technology — it is uncertainty. Every open question in the specification becomes padding inside the number you receive. A vendor that does not know the edge cases has to assume a pessimistic case. Spending a week on a proper discovery frequently cuts the final cost far more than negotiating the rate.
Integrations are the second big multiplier. A screen that writes to your own database is predictable; the same screen talking to a legacy ERP is not. The cost hides in the counterparty: poor documentation, slow approval cycles, inconsistent data. Ask each bidder to break integrations out as separate items, as that is where the numbers slip.
Quality attributes silently change the number. An internal tool used by a handful of staff has almost nothing in common with the same idea handling a hundred thousand users. Audit and compliance requirements, uptime targets, scalability, audit logging and accessibility add real engineering time. Put them in the brief or you can expect them priced as extras.
Who actually does the work matters a great deal. A day rate tells you almost nothing on its own: one senior developer at twice the price frequently turns out to be cheaper overall than a pair of junior hire nuxtjs developers who need constant review. Also ask which roles are billed: project management, QA, infrastructure work and analysis are real work, but these should be visible in the estimate.
The number in the proposal is never the total cost. Plan for cloud costs, third-party licences, kotlin development agency monitoring and a maintenance allowance annually. A reasonable rule of thumb is that any production system requires a recurring percentage of the original budget per year for updates, security patches and small improvements. Ignoring this is the classic mistake.
