A number produced without questions is a warning, not a service level. An experienced provider returns questions first: about integrations. A supplier that prices without asking anything is probably working from a template, livewire vs alpine js comparison and the gap resurfaces as a change order — and you will pay for it.
Be wary of a mismatch between the engineers on the sales call and the people who will code. Request specific people rather than roles in the statement of work, with a clause covering replacement. A team that only offers abstract roles and will not commit to specific engineers is preserving the option to staff you with whoever is free.
Require the source repository from day one. A provider that hands over code only at milestones is asking you to trust a black box. Daily commits tell you how many people are really working far better than any status report. The same holds for the CI pipeline: if nothing runs automatically, assurances about quality are nothing more than words.
Vague contract language around intellectual property is never a formality. The document needs to state explicitly that all outputs produced under it belong to your company on payment. Look too at the governing law and how payments are structured: a request for vue.js development most of the money up front with no deliverable attached removes any leverage you would otherwise keep.
Lastly, look at how they communicate. Ask how much working-time overlap you will share each day, which is better rest or graphql person answers your questions and how quickly. Some genuine overlap generally works; no overlap turns a five-minute question into a day of delay. Sloppy written English in the proposal rarely improves under delivery pressure.