The most common cause of custom software projects running over time and over budget is not bad engineering. It is scope that was not defined before the project started.
The Won’t Have list is as important as the Must Have list. Writing down what you are explicitly not building prevents scope creep. When a stakeholder asks to add something in week eight, the answer is that it is in the Won’t Have list and here is the change order process.
Before writing the first line of code: can you walk through the scope in a 30-minute meeting and have everyone agree on what done looks like? If not, the scope is not ready. Wireframes or low-fidelity prototypes at this stage are the highest-ROI investment you can make.