Begin with relevant experience, docker development company not the size of the portfolio. Ask for two laravel or .net three engagements that match your technology stack, and then find out which engineers actually built it. A serious vendor will put you on a call with the tech lead. Evasive answers at this stage usually mean you are talking to a reseller.
The agreement warrants more scrutiny than the proposal. Three sections matter more than the rest: ownership of the code, laravel livewire vs react confidentiality, and termination and handover. Every artifact must transfer to you once invoices are settled, together with designs, smm agency scripts and infrastructure configuration. Look closely at wording that leaves so-called reusable libraries with the vendor, since this is frequently the part you cannot replace later.
Find out how the estimate was built. An honest estimate comes with the assumptions behind it, a breakdown per feature and a range rather than a single number. A fixed-price contract is only reasonable when the scope is genuinely frozen; when the scope is still moving the provider prices the risk in and you pay for it anyway. A time-and-materials model puts the risk on your side, so it needs a cap, regular demos and transparent reporting.
The delivery process matters as much as headcount. Ask what happens when the scope changes, who signs off on a feature and how testing is organised. A well-run team can show you running software rather than status reports. Written acceptance criteria are the only reliable protection against an argument at delivery time.
Last, think about the end of the engagement at the start rather than at the end. Ask that the code repository lives on infrastructure you own from day one, and that the documentation is refreshed in every sprint. A partner who is comfortable with this says yes immediately; resistance at this point tells you quite a lot.