Open with the business problem, not your preferred technology. Who will use the system, how often, and how is the job done today? An estimator who knows what you are trying to achieve will suggest a cheaper route to it; one who only sees a feature list can only fixed price contract software development exactly what you asked for.
Define what is included as short scenarios: a walk through each important path. Just as important, list what the first release deliberately excludes. An explicit list of exclusions removes more argument during acceptance than any other single page. Also mark which items are decided and which are still open — the difference changes the price, and hiding it helps no one.
Write down the hard constraints. This means existing systems the software has to talk to, existing databases and their quality, compliance requirements, user volumes, time and materials contract which devices matter and infrastructure that is already decided. If there is a hard date, say why: a team will often cut the right scope to meet it, but only if they know it exists.
Say what the word done means for the important items. Clear acceptance criteria do not require formal language: a short paragraph stating what a user should be able to do is sufficient. That one addition reduces acceptance testing by a surprising margin and hire protobuf developer eliminates the usual argument at handover.
One last thing, say what you expect back. Require a breakdown by feature or module, the assumptions used, the main risks and a low number and mobile app optimization services a high number. Treat a wide range as useful information rather than evasion: it normally identifies the part of the brief that needs work. Then tighten that section and ask for a new estimate — the revised figure is far closer to reality.