2. I document it in a Spec and make sure the customer reviews and understands exactly what they will get. Again, while enjoying good coffee!
3. The customer pays up front for this initial Spec work. If they don’t want to pay up front I walk away. I don’t work with customers who doesn’t understand that work costs money.
4. If they are happy with the spec I then negotiate a contract and payment terms. This always includes an upfront payment. Usually 10%. If they don’t want to pay a percentage upfront I walk away. Cheap customers are not worth the pain. The rest is paid based on milestone deliverables. I always make sure that milestones are backend heavy so that I have a time buffer if needed.
5. I quickly implement what I call the “skeleton” of the application. All use cases are implemented with a minimum ugly/super simple UI and an in-memory hash map “database” for storage. Test cases cover all use cases end-to-end. I use an in-house code generator to make this step fast (80% of the code is usually generated).
6. I then iterate, refine, and improve the whole application step by step until it is done. With regular demos to the customer getting feedback on progress.
It works well. It isn’t perfect (what is?) but it has been successful for me.