I started by writing down the vocabulary the owner used, unedited, and made that the schema. What they called an enquiry stayed an enquiry, not a "lead". What they called a job stayed a job, not a "work order". That sounds cosmetic and it is not: every renaming is a translation the user has to perform mentally on every screen, and those translations are the reason internal tools get abandoned.
The core is a single timeline per customer. An enquiry becomes a quotation, a quotation becomes a confirmed job, a job accrues deliveries and payments, and each of those transitions is a row you can point at with a date and a person attached. Nothing is edited in place — a revised quotation is a new version with the old one still readable, because "what did we actually agree" is the question that starts arguments.
The hardest part of the build was deciding what not to build. There is no accounting module, no inventory valuation, no user-configurable workflow engine. Each of those was asked about and each would have doubled the surface area for a feature that would be used quarterly at best. What went in instead was a payments view that answers "who owes us money, and how old is it" on one screen, because that was the question being asked daily.
I stayed deliberately close to the owner during the build rather than gathering requirements once and disappearing. Small-business software fails on details that never make it into a specification — that a customer has two phone numbers and one of them is the one that actually gets answered, that prices are agreed in round figures and adjusted verbally, that "delivered" sometimes means delivered to a relative.