The dominant factor is not the technology stack — it is almost always uncertainty. Each unanswered question in the brief is converted into a buffer inside the number you receive. A vendor that does not know the exceptions and edge cases will assume the worst. Spending a week on a discovery phase frequently cuts the final cost much more than negotiating the rate.
Integrations are another reliable source of cost. A feature that touches only your own data is low risk; the same functionality talking to a payment provider and a CRM is a different problem. The effort sits in the third party: rate limits and custom docker development sandbox access, waiting on someone else's team, fields that mean something different on each side. Ask any vendor to break integrations out as separate items, because this is where estimates break.
The requirements nobody writes down quietly rewrite the number. An internal tool used by a handful of staff costs far less than the same functionality serving thousands of external customers. Compliance work, high availability, scalability, ai development agency traceability and multi-language support all add real engineering time. Write them down at the start or else expect them to arrive later as change requests.
The team you are quoted matters a great deal. An hourly rate tells you little on its own: one senior developer at a higher rate can be less expensive in the end than two inexperienced developers who require supervision and rework. Check too who else is billed: delivery management, quality assurance, release engineering and design are legitimate costs, but they must be visible in the estimate.
The build price is never what you will actually spend. Plan for cloud costs, paid APIs, observability and a maintenance allowance annually. A useful planning figure holds that elearning software development in active use requires a meaningful share of the initial investment annually for updates, security patches and small improvements. Ignoring this remains the most common budgeting mistake.