Alongside my job, I designed and built a home-repair platform as an independent project: locksmiths, plumbing, glazing, heating, electrics. Clients such as property managers or insurers order jobs. Tradespeople carry them out. The platform connects them, tracks each job and produces the documents.
In the first version, tradespeople were subcontractors. In the second, they became partners. Between the two, the business model reversed.
Two models, two directions for the money
In the first version, tradespeople were subcontractors. The platform collected the client's payment, kept its share and paid the rest to the tradesperson. It invoiced in the tradesperson's name, under a billing mandate the tradesperson signed.
In the second, tradespeople become partners. The partner invoices the client company directly. The platform then invoices the partner for its own fees: a monthly subscription, a commission on the revenue made through the platform, and an access fee for each client company the partner is connected to.
A different company now collects the money, and the legal relationship changes with it. Every screen that dealt with money had to be reviewed.
What I rebuilt
- Invoices. Who issues what, to whom, with which numbering and which legal mentions. Quotes, client invoices, invoices to client companies, credit notes, platform invoices to partners: each document type has its own number series. A credit note cannot exceed the invoice it corrects.
- The commission. A client company can add its own rate to the base commission. The two are added together, with a cap. The calculation happens in one place in the code, and a test checks that no other module recomputes it. Rates are configured in the admin, with no redeploy.
- The contract. The billing mandate gave way to a partnership contract, generated by the platform and signed in the app by the partner company's manager.
- The vocabulary. The contract rules out any employment relationship. Words like "our technicians" were removed from the interface and the code, because they describe an employer. In the code, the subcontractor became a partner company.
- The old mode. Payouts by the platform remain available as an option, for the cases the contract allows.
VAT, a subject of its own
A platform that produces invoices has to apply the right VAT rate. In French home repair, there are several.
- Work in a home more than two years old falls under the reduced 10% rate. The platform generates the simplified 1301-SD certificate and has it signed.
- Other cases fall under the standard 20% rate.
- A partner under the small-business exemption, a small company not required to charge VAT, invoices without VAT, with the mention "TVA non applicable, art. 293 B du CGI".
- Reverse charge, where the client declares the VAT, is a different case. The platform records it separately.
The order of the checks matters. The issuer's status is checked before the type of job: an exempt partner invoices without VAT, whatever the job. In the other order, the platform produces a non-compliant invoice.
What it taught me
I did not know this field. I read the contract article by article, and I worked with the accountant on drafting the invoices and calculating the VAT rates. When a rate was unclear, I put the question to the accountant in writing and held the feature back until the answer came.
In this field, a bug produces a wrong invoice, sent to a real company. So every decision is dated and written down in the repository, with its reason.
On the technical side, the platform is TypeScript end to end: an Express API with Prisma, an installable Next.js web app, and a state machine that every change to a job's status goes through.
That platform became DispaTech, offered white-labelled with a public demo.