Skip to content
Myky

Work/kotle-crm

In daily production use

Kotle CRM

A boiler service company ran sales and invoicing through one spreadsheet only one person understood. The first working version of the new system took three hours.

  • CRM
  • PDF
  • Platobný QR
  • Platby
  • Kalendár
  • Prehľady
3 h
to the first working version
1 click
to an invoice with a payment QR
a whole team
instead of one person

A CRM for boiler servicing and installation: customer records, reminders for the annual service and the flue inspection, and an invoice with a payment QR in one click. The first working version took three hours.

Where the problem was

The company installs and services boilers. Customers, sales cases, engineer callouts and invoices were all handled through a single spreadsheet.

That spreadsheet worked. The problem was that only one person understood it. When he was on holiday, nobody else could reliably issue an invoice or say what state a given deal was in. And when someone accidentally overwrote a formula cell, it was noticed a week later.

The company did not have a shortage of information. It had a problem with that information being locked in one person’s head and one person’s file.

What was needed

Get the same thing the spreadsheet knew into a system a whole team can operate, without anyone having to learn to work with a database.

What I built

The first working version in a three-hour sprint. Not a prototype to show off, but something that could be opened and used straight away. Then it grew into a full system.

Customers have cards with what the company actually needs to know about boilers. Which boiler, which flue, which contract, when it was last serviced. Sales cases move between columns by dragging with the mouse, so at a glance you see where something got stuck. Engineers have their own tasks and attach photos to a callout.

An invoice is created with one click as a PDF, and in it is a payment QR code with the IBAN, the amount and the reference. The customer scans it with their phone and pays. Nobody retypes account numbers by hand and nobody gets it wrong.

And then the thing that earns the company money without it noticing: reminders that know their domain. The annual service, the flue inspection, the end of warranty. The system flags of its own accord that it is time to get in touch with this customer. Follow-up work stopped depending on whether anyone remembered.

On top of that, an overview of takings — how much the company made over a year, over a month, and how the sales cases are spread out.

What it brought

Instead of one person with a spreadsheet, a whole team works in the system. Everyone sees what they are meant to see, and nobody can accidentally overwrite someone else’s formula.

Management got back the time that used to go on being the single place where the state of the business could be found.

Under the hood

Built on Supabase. Every table has access rules directly in the database, so protection does not depend on the app asking correctly. It holds even if someone tried to go around it. Roles are handled by a separate function that gets around the recursion problem in permission checks, and the first registered user automatically becomes the administrator.

Administrator operations go through a secured server function that verifies the login and the role before every action. React with TanStack Query and form validation via Zod; PDFs are generated directly in the browser.