Begin with the business problem, not a feature list. What kind of user will use it day to day, how often, and how is the job done today? An estimator who grasps the purpose can propose a simpler way to reach it; someone handed only the requirements as given will price exactly what you asked for.
Define what is included as concrete flows: what the user does and what the system does in response. Just as important, write down what is out of scope. An explicit list of exclusions removes more argument during acceptance than almost anything else in the document. Indicate as well which parts are firm and which may still change — honest teams price those differently, what is langchain and rag and concealing the open questions only hurts you.
Set out your constraints. The list covers the platforms and services involved, the data you already hold and its condition, compliance requirements, edtech software development expected load, target platforms and any technology you are committed to. If a deadline is real, explain what drives it: a good team will often resequence the work to hit it, but only if they know it exists.
Write down what completion means for each item. Acceptance criteria need not use special syntax: a short paragraph describing what a user should be able to do will do. This one section compresses the review at the end dramatically and closes off the usual argument at handover.
To close, say what you expect back. Ask for an itemised estimate, a written list of assumptions, the risks the team sees and a low number and a high number. Read a wide range as a signal about the brief: it usually points to exactly which requirement is unclear. At that point clarify that area and request a revised number — the second estimate will be much more reliable.
