Skip to content
Fridman

An operating system for a service company

My cleaning company Reefa (Kraków and Katowice) runs on one system I built: sites, schedules, shifts, clients, invoices from several inFakt accounts, petty cash, bank matching, contracts signed by link, purchasing and quality checks. The office works in the app.reefa.pl panel; people in the field use a Telegram bot.

This kind of system makes sense for a service business with many sites, a field team and several legal entities. I build similar systems from PLN 60,000 excl. VAT. I am based in Kraków and work remotely and on site across Poland.

13

panel sections instead of 33, covering the whole company (as of 15 Oct 2026)

Company
Reefa, a B2B cleaning company in Kraków and Katowice, founded in 2020
Period
June–October 2026
My role
Owner. I design and build it myself, with AI agents for code and reviews.
A similar project
from PLN 60,000excl. VAT

What it looks like on screen

The screen where I check that every bank transaction has a document. A simplified schematic, with no counterparty names and no amounts.
Schematic of the “Bank and documents” screen. The real panel runs in Polish and Russian and has more columns.

The problem this system solves

In a service company, most office time goes into piecing information together. Who was on site yesterday and for how long. Whether the client has paid, and which entity invoiced them. Whether every bank transaction has a document. Whether a contract actually makes money.

At Reefa there are also several legal entities, each with its own inFakt account, a team that works on site rather than at a desk, and clients who want to see what is happening in their building. I wanted every one of those answers in one place, and a system that keeps track of the things people forget.

Questions the system answers without a call to the office

  • Who was on site yesterday, and for how many hours?
  • Which invoices are unpaid, and in which entity?
  • Does every bank transaction have an invoice or a cost document?
  • Does this contract pay for itself?
  • What do we send the client at the end of the month?
  • Who can see pay rates, and who can’t?

What I built

The panel has 13 sections with tabs, plus a card for every site, worker and client. These are the main modules.
  • Bank-to-document matching

    One rule: every bank transaction needs cover. Money in needs an invoice, money out needs a cost document. On the 1st of each month the system checks every entity, marks the gaps in red and sends them to Telegram. It finds invoice numbers even when the bank splits them across two statement lines, and drops the same transactions imported twice (from an MT940 statement and over PSD2).

    runs on its own
  • Contracts signed by link

    My own signing page with one-time SMS or email codes and an append-only event log. Signatures made with Profil Zaufany, the Polish government e-ID, are verified automatically. AI pulls the parties, company numbers and signatories out of the PDF in 13 seconds and places the signature stamps on the signature lines.

  • Roles and scoped access

    One permission catalogue that denies by default, and 6 ready-made role templates. The database enforces permissions, not just the screen. A coordinator sees only their own sites and people, which I verified by simulating roles. Pay rates are protected at column level in the database.

  • Finances across several entities

    runs on its own

    Invoices from several inFakt accounts sync every morning. I switch entity with one click, and invoices are matched to sites by tax number first. Clients see their own invoices, with PDFs, in the client portal.

  • Petty cash and cash reports

    Cash vouchers as PDFs, an Excel export that matches the accountant’s template 1:1, and a bank connection over PSD2. I imported 312 cash entries from 21 closed months into the system and reconciled them to the grosz against the documents.

  • Monthly client reports

    runs on its own

    Since October 2026 the report is on for every client: on the 5th of each month they get an email and a PDF of the visits. Visits come from the schedule, and Polish public holidays up to 2030 are built in.

  • Quality audits

    Inspections based on a simplified INSTA 800 standard. The server draws the rooms to check (a 4% sample), so nobody gets to pick the ones that look good.

  • Debt collection

    9 stages from 2 days before the due date to 60 days after it: ready-made letters, a call script, an interest note PDF and legal gates, such as no debtor-registry entry until the law allows it.

  • Contract profitability

    runs on its own

    One database function computes the live view and closes the month. Rates and parameters are versioned, so a closed month never changes. Revenue comes from invoices matched by tax number, and overhead is spread per labour hour. Here I only show the method.

  • AI-assisted purchasing

    runs on its own

    A worker types or photographs what is missing, in Polish, Russian or Ukrainian. AI maps it to a 52-⁠item catalogue, searches Allegro, picks the best offer and a fallback with reasons, and the site supervisor gets it in Telegram with “Ordered” and “Delivered” buttons.

  • HR documents

    9 onboarding documents are generated from the worker’s card, including an overlay on the official PIT-2 tax form. Every month AI recognises each document’s type and month and shows who is missing what.

  • “Needs attention” list

    One list of open issues from every module. My comments on them feed into the next morning briefs.

  • Built-in manual

    38 chapters in Polish and Russian. Each person sees only the chapters that match their permissions.

How it fits together

Everything lands in one database, and the database itself enforces permissions and rules. A green lamp marks a step that runs without a person.
  1. 1. Sources

    • Workers’ Telegram bot

      shifts, photos, purchase requests

    • inFakt, several accounts

      sales and cost invoices

    • Bank

      PSD2 and MT940 statements

    • PDF documents

      contracts, cash vouchers, HR forms

  2. 2. Database and rules

    • Postgres with RLS

      the database enforces permissions

      runs on its own
    • Functions and schedules

      syncs, reports, checks

      runs on its own
    • AI (Claude)

      reads documents and requests

      runs on its own
  3. 3. Modules

    • Schedule and shifts

    • Finance, cash and bank

      matching on the 1st

      runs on its own
    • E-signed contracts

    • Quality and purchasing

    • Contract profitability

      month close

      runs on its own
  4. 4. Outputs

    • Client PDF report

      on the 5th of the month

      runs on its own
    • Briefs and alerts in Telegram

      12 reporting functions

      runs on its own
    • Panel, 13 sections

      a person decides here

      a person decides
    • Client portal

      invoices and shift photos

Data from the bot, inFakt, the bank and documents flows into one database with permissions. Modules work on top of it, and results go out as reports, alerts, the panel and the client portal.

Key:runs on its owna person decidesdata, people or a place of work

Numbers from the system

Numbers from the system, with the date of each measurement
What I measureValue
Sections in the panel menuas of 15 Oct 202613 (previously 33)
Cash entries imported and reconciledSeptember 2024 – May 2026as of 11 Jul 2026312 from 21 months, reconciled to the grosz
Shifts logged in the systemas of 14 Oct 2026about 2,700
Site photos storedas of 16 Sept 2026over 2,800
Bugs found in the new-panel auditas of 2 Jul 202660 high and medium plus 68 low; 128 fixes in 3 releases
Screens and dialogs checked on mobileas of 10 Jul 202674
Contract module testslive test on 15 October 2026as of 17 Oct 2026112, live 43 of 43
Profitability engine testsas of 18 Oct 202658 SQL test sections

I don’t publish amounts: revenue, rates, balances or contract results. The number of sites and clients is internal.

Before every risky release, independent reviewers (AI agents) check the code. I count a release as done only when the change is visible in the code of the live system.

What it runs on

React, Vite, TypeScript
a browser panel that also works on a phone
Supabase: Postgres with RLS
data and permissions enforced by the database
Supabase Edge Functions, pg_cron
integrations, reports and scheduled jobs
Telegram Bot API
workers, notifications and my briefs
inFakt API
invoices from several accounts
Enable Banking (PSD2), MT940
bank data
Anthropic Claude
reading contracts, documents and purchase requests
SMSAPI, Apify, pdf-lib
SMS signing codes, offer search, PDF files
Vercel
panel hosting

What you can take for your company

  • Start with one process, but in one database

    You don’t need to build everything at once. I start where you lose the most hours, usually scheduling and paying people or invoices and the bank, and plug every next module into the same database. A year later you don’t have five tools that don’t talk to each other.

  • Permissions in the database, not the menu

    If a coordinator shouldn’t see pay rates, hiding a button isn’t enough. In my company the database enforces it, and I test it by simulating roles. I’ll do the same for you.

  • Every transaction with a document

    The rule “every bank transaction has cover” catches gaps before your accountant does. It can be connected to an invoicing tool that has an API. Mine is inFakt plus two bank data sources.

  • A client report that sends itself

    The monthly PDF of visits goes out on the 5th with no one doing anything. The client sees what was done, and nobody in the office assembles it by hand.

Services where I do this

Other case studies

  • 1,100 hA bot for the field teamA shift starts and ends with one button in Telegram, with location and photos. The rebuild removed 55 issues and is covered by 19 scenario tests.
  • 11AI agents that run part of the company11 routines and agents: a panel doctor, SEO content, lead growth, moderation, tenders and a morning brief. Five of them log every decision, and releases roll back automatically.
  • +30%Organic growth of reefa.plA plan of 33 SEO and GEO changes, 29 free tools, an open norms dataset (460 categories from 2,338 rows of data) and a content routine. Clicks from Google rose from 8.6 to 11.2 a day in July.
  • 3 daysKtoSprząta.pl — an industry platformA directory of companies from public registries, a search that fixes typos, a free Pro panel for companies and AI moderation three times a day.

Let’s talk about your company

30 minutes, no sales deck. You tell me where time and money leak, and I tell you what I’d do first and roughly what it costs.