Checkable credentials, not a phone number
Before a client posts anything, they want to know who they are dealing with. A profile shows identity and mobile verified, references checked, a trade credential with its expiry date, business insurance, a rating and a count of finished jobs in that trade. It deliberately does not show a phone number or a link out, and it says in small print that verification is not a guarantee of workmanship, because those are different promises and only one of them is ours to make.

Nobody can price “my sink leaks”
A plumber quoting from a one-line description is guessing, and a guessed price gets renegotiated in someone’s kitchen. The job form asks for the things that actually change a quote: symptoms, measurements, photos and video, how to get in, and a preferred date. It stops well short of a contracting workflow. The client’s address and number stay masked until they pay.

No “best match” badge
Quotes arrive split into labour and materials, alongside a start date, a duration, the artisan’s rating and their verification count. I kept all of it side by side and refused to rank it, because the cheapest quote and the right quote are often not the same row and the platform is not the one living with the result. Accepting a quote locks its scope and price.

Money first, then work
Accepting a quote does not start a job; funding it does. I made the engagement come into existence only once the money is secured, so no artisan travels to a site on the strength of a promise and no client argues about scope after the fact. Release rules vary with job size, which means the payment state machine carries several paths rather than one. In exchange, every later event hangs off a single funded engagement with one ID: the completion evidence, a dispute, the payout, both reviews.

Evidence decides the release
An artisan closes a job by filing what they did: notes, timestamped photos taken after the work, a report, and the agreed scope ticked off item by item. The client then has a fixed window to approve and release the money or open a dispute, and only the disputed amount is held. Both sides rate each other, and neither rating publishes until both are in or the window expires, so nobody writes a review in reply to the other side’s.

One record holds the money and the proof
Funding, completion evidence, payouts, disputes and both reviews all attach to the same engagement rather than living in separate tables joined after the fact. Answering “was this paid, was it done, and who said so” is then one lookup instead of a reconciliation. The trade is rigidity: loose flows that would let evidence exist without a funded job are simply not representable, and I had to rethink a few features to fit that shape.
