A number produced without questions is a warning, not a service level. A competent team will come back with a list of questions: about users and volumes. A vendor that prices before understanding the scope is probably guessing, and a guess will be corrected later — on your budget.
Watch for modern web development stack a mismatch between the team in the pitch and those who eventually appear in the repository. Insist on named engineers in the contract, build vs buy software with a clause that requires notice before anyone is swapped. A vendor hire node.js developer that talks only about roles and refuses to name specific engineers is reserving the option to staff you with whoever is free.
Require commit-level visibility from day one. A partner that shows code only at milestones is asking you to accept a black box. Visible commits tell you the actual pace far better than any status report. The same holds for laravel or wordpress the build and deployment setup: if nothing runs automatically, assurances about quality remain just talk.
Loose wording in the contract around code ownership is never an accident. The contract needs to state in plain terms that all outputs produced under it belong to your business as they are paid for. Look too at the jurisdiction and the payment schedule: a request for most of the money up front with no deliverable attached takes away the only leverage you have.
Last, look at communication. Confirm what overlap you will share with your working day, who answers day-to-day questions and how quickly. A few hours of overlap is usually enough; none at all turns every clarification into a twenty-four hour round trip. Careless writing in the proposal does not improve once the work starts.