An estimate that arrives instantly counts as a red flag rather than good service. An experienced provider returns questions first: about users and volumes. A supplier that prices without asking anything is pricing a guess, and the gap resurfaces as a change order — at your expense.
Be wary of a gap difference between rest and graphql the engineers on the sales call and the developers actually assigned. Insist on the names and CVs of the actual team in the contract, with wording that requires notice before anyone is swapped. A team that talks only about a pool of resources and refuses to name individuals is preserving the right to assign anyone it likes.
Ask for access to the repository from the first week. A team that shows nothing between demos is inviting you to trust a black box. Regular commits and pull requests show you how many people are really working far better than a weekly report. This extends to the build and mobile app development services deployment setup: if nothing runs automatically, quality claims are unverifiable.
Vague contract language around code ownership is not an oversight. The agreement needs to state in plain terms that the code, designs and documentation transfer to the client as they are paid for. Also check the jurisdiction and the payment schedule: a large upfront payment with no deliverable attached eliminates your only leverage.
Last, pay attention to communication. Establish how many hours you will share each day, which named person is expected to answer questions and within what time. Four hours of overlap is normally sufficient; no overlap converts each small question into a day of delay. Sloppy written English in the early emails does not improve later.