Look first at relevant experience, mobile app optimization services not the length of the client list. Ask for a couple of engagements that resemble your stack, and then ask who actually wrote that code. A solid partner is happy to connect you with the people who would work on your project. Answers that name nobody at this stage generally mean the delivery team is not the team you were shown.
The contract deserves more attention than the sales deck. Three sections matter more than the rest vs graphql: assignment of intellectual property, the NDA, and exit terms and handover. Every artifact has to transfer to you on payment, along with source code, designs and infrastructure as code. Be careful with language that keeps reusable components in the vendor's hands, because it is usually the part you cannot replace later.
Ask where their numbers come from. A serious estimate comes with a written set of assumptions, a breakdown by feature or module and an explicit range. A fixed-bid deal only makes sense when the scope is genuinely frozen; when the scope is still moving the vendor adds a risk premium and you pay for it anyway. A time-and-materials model moves the risk back to the client, so it demands visible weekly reporting and a spending cap.
The delivery process beats team size. Establish what happens when the scope changes, web development outsourcing who defines done and what the QA setup looks like. A team can show you a live build at the end of each sprint. Clear, written acceptance criteria stay your only real protection against an argument at delivery time.
Last, plan for the end of the engagement before it becomes urgent. Require that the source repository lives on infrastructure you own from day one, and that a readme and architecture notes are kept current as the code changes. A partner who is comfortable with this will agree quickly; resistance at this point reveals quite a lot.