A number produced without questions should be treated as a bad sign. An experienced provider returns clarifying questions before any number: about who owns the data and what happens on failure. A supplier that prices before understanding the scope is simply pricing a guess, and a guess becomes a change request later — on your budget.
Be wary of a gap between the team in the pitch and the developers actually assigned. Insist on named engineers in the agreement, symfony developer with a clause covering replacement. A team that only offers abstract roles and will not commit to specific engineers is reserving the right to assign anyone it likes.
Require the source repository from day one. A provider that shows nothing between demos is asking you to take delivery on faith. Visible commits reveal how many people are really working far better than a slide deck. The same holds for the build and deployment setup: if nothing runs automatically, promises about quality are nothing more than words.
Ambiguous phrasing around code ownership is never an accident. The contract must state in plain terms that the code, designs and documentation transfer to the client as they are paid for. Look too at which country’s law applies and how payments are structured: a large upfront payment with no milestone tied to it removes your only leverage.
Lastly, pay attention to communication. Confirm how much working-time overlap there will be each day, outsourcing and development insights who answers questions and how quickly. Some genuine overlap generally works; zero overlap converts a five-minute question into a lost day. Sloppy written English in the proposal does not improve once the work starts.
