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
Gaps go to Telegram on the 1st of the month
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
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 ownContracts 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 ownInvoices 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 ownSince 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 ownOne 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 ownA 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
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. Database and rules
Postgres with RLS
the database enforces permissions
runs on its ownFunctions and schedules
syncs, reports, checks
runs on its ownAI (Claude)
reads documents and requests
runs on its own
3. Modules
Schedule and shifts
Finance, cash and bank
matching on the 1st
runs on its ownE-signed contracts
Quality and purchasing
Contract profitability
month close
runs on its own
4. Outputs
Client PDF report
on the 5th of the month
runs on its ownBriefs and alerts in Telegram
12 reporting functions
runs on its ownPanel, 13 sections
a person decides here
a person decidesClient 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
| What I measure | Value | As of |
|---|---|---|
| Sections in the panel menuas of 15 Oct 2026 | 13 (previously 33) | |
| Cash entries imported and reconciledSeptember 2024 – May 2026as of 11 Jul 2026 | 312 from 21 months, reconciled to the grosz | |
| Shifts logged in the systemas of 14 Oct 2026 | about 2,700 | |
| Site photos storedas of 16 Sept 2026 | over 2,800 | |
| Bugs found in the new-panel auditas of 2 Jul 2026 | 60 high and medium plus 68 low; 128 fixes in 3 releases | |
| Screens and dialogs checked on mobileas of 10 Jul 2026 | 74 | |
| Contract module testslive test on 15 October 2026as of 17 Oct 2026 | 112, live 43 of 43 | |
| Profitability engine testsas of 18 Oct 2026 | 58 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
A panel, CRM, field-team app or production system, built around how your company actually works.
from PLN 60,000excl. VAT- from PLN 15,000excl. VAT
IT rollouts and fractional CTO
from PLN 12,000/monthexcl. VAT
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.