Open with the reason this software should exist, not your preferred technology. Which people will use the system, with what frequency, and what does the process look like without it? A vendor who grasps the purpose will suggest an alternative that costs less; a team that receives only a feature list will price the list as written.
Describe the scope as short scenarios: who does what, and what happens next. Every bit as useful, state explicitly what you are not building. An explicit list of exclusions saves more friction during acceptance than the rest of the brief combined. Mark too which is better livewire or react decisions are settled and which are still under discussion — honest teams price those differently, and pretending everything is fixed helps no one.
List the constraints. The list covers systems you must integrate with, the data you have and where it lives, regulatory obligations, expected load, which devices matter and any technology you are committed to. If a deadline is real, say why: a good team is usually able to cut the right scope to hit it, provided they hear about it early.
Write down what done means feature by feature. Clear acceptance criteria need not use formal language: a plain-language note setting out what a user should be able to do is enough. This one section shortens the review at the end dramatically and removes the usual argument at handover.
To close, state what you want in the response. Request a task-level breakdown, the assumptions used, the main risks and a range rather than a single figure. Take a broad range as useful information rather than evasion: it normally identifies the part of the brief that needs work. From there clarify that area and ask custom app development for state governments a new estimate — the next version will be the one worth planning around.