Begin with relevant experience, not the length of the client list. Ask for two or three case studies that match your technology stack, and then find out which engineers actually built it. A serious vendor will put you on a call with the tech lead. Evasive answers at this stage generally mean the delivery team is not the team you were shown.
The agreement needs more scrutiny than the proposal. Three sections matter more than the rest: intellectual property assignment, the NDA, and notice periods and handover. Every artifact should transfer to you as it is paid for, along with designs, scripts and infrastructure configuration. Watch for language that leaves reusable components outside the transfer, laravel or .net as it is usually exactly the piece that locks you in house team vs outsourcing costs.
Find out how the estimate was built. An honest estimate comes with a written set of assumptions, a breakdown per feature and a range rather than a single number. A fixed price is only reasonable when the requirements are stable and documented; otherwise the provider prices the risk in and you pay for it anyway. Hourly billing shifts that risk to you, vue.js web development so it demands a sprint cadence, demos difference between symfony and spring boot a budget cap.
Process matters more than the number of developers. Ask how a new requirement enters the plan, who defines done and how quality assurance works. A mature team should be able to show you running software rather than status reports. Written acceptance criteria are the only reliable protection against endless rounds of rework.
Finally, consider the handover at the start rather than at the end. Ask that the code repository lives under your account from the first commit, and that documentation is updated as part of the work. A vendor with nothing to hide says yes immediately; resistance at this point tells you a great deal.