Art Quest · Horror Cinema · MORPHEUS · finance
Accounting thatdoesn’t invent money.
The company runs three venues, and money arrives in pieces: prepayments, balances paid on the day, transfers, cash in two tills, accounts in several currencies. It goes out on rent, fixed bills and piece-rate pay. We built a system that answers every day how much can be spent, and honestly shows “—” when data is missing.
Live · payroll since June, finance core since 29 September, receipts since 14 October 2026

- ×12faster fortnightly payroll run4 hours → 10–20 minutes, management estimate
- 705self-employed receipts collected and checked with the tax servicesince June 2025, first load
- −26%error in expected booking balances, one week aheadmodel checked on history
- 7.2%real cancellation rate, not 22% as the old model assumedanalysis of 3,440 deals
One question every morning
How much can we spend today and still have the rent next week? Sounds simple. In practice some of the money is already promised, some arrives only after a game, and some, who knows when.
Before this there was a spreadsheet with a tab per employee and questions like “why is my balance this?”. We built the first version in June on top of the payroll data: income from the booking calendar, pay, regular bills. In September the finance core was rewritten with explicit accounting rules.
Sources
Finance core
Answers for the day
Unknown is not zero
The most dangerous spreadsheet is the one that confidently shows the wrong number. So the core’s main rule is simple: if an account balance is unknown, a rate is missing or the last reconciliation is over 14 days old, no money total is calculated. A “—” and a question to close appear instead.
The rule fired on day one. On 6 October, when the “how much can be distributed” calculation went live, the tool showed “—” instead of an amount: confirmations from the head of the business were missing. Uncomfortable, but right. The rules were then refined: small unidentified amounts became a warning rather than a block.
Unknown is not zero. If an amount, rate or reconciliation is unknown, the system doesn’t invent a total; it asks.

Every rouble counted once
A booking balance comes in. In the old setup it could be counted twice: as income and as a change in the account balance. Now it is one operation that records the payment and updates the chosen account. Recurring bills such as rent are spread across their dates, and a part-payment or postponement affects only its own date.
Future money lives in scenarios kept apart from facts: no future income, existing bookings only, base and strong. Distribution is shown in three variants. “Safe” relies only on the current balance: the historical check showed that even a cautious estimate of future balances misses more often than the acceptable 5%.

A forecast that knows its error
The forecast started with a full CRM export: 3,440 deals since December 2023. Two things that used to be hunches were confirmed. After 20:30 Omsk time, almost nobody books for the same day: of 428 successful same-day bookings, 3 were made after 20:30. And cancellations of dated bookings run at 7.2%, not the 22% the old model assumed.
A separate model estimates how much of the expected balances on existing bookings the company will actually receive. On the historical check it cut the average error by 17% three days ahead, 26% a week ahead and 24% two weeks ahead.
The sales forecast is honestly labelled “limited validation”, and its error is shown rather than hidden.
Payroll from events
Staff are paid piece rates: host, entertainer, actor, different packages and extras. Pay used to be worked out in a spreadsheet from memory and chat messages. Now it is calculated from events: every accrual becomes a line that can be checked. A total without a breakdown isn’t allowed.
- EventA calendar booking or an amoCRM deal: date, programme, who worked
- Rate ruleRole and package set the amount. Unclear events go to a review queue
- AccrualA line: date · event · package · role · amount · rule
- PenaltiesA separate append-only journal. Reversing a penalty is a new record
- PayoutsEach payout settles the oldest amounts first. The same payout cannot be recorded twice
- BalanceStaff see their accruals, amount due and penalties through a personal link
Penalties go into a separate append-only log: cancelling a penalty adds a new entry rather than deleting the old one. Lateness is calculated by the server from the rule. Every employee has a personal page with accruals, the amount due and penalties.
Receipts and payouts without manual collection
Self-employed staff must send a tax receipt for every payout. For years the receipts sat in private messages and work chats. Now the system collects them from Telegram, reads the QR code and checks each receipt with the tax service. A cancelled or unknown receipt is rejected, and a repeat isn’t counted twice. How many receipts are missing shows on the employee’s page.
Payouts don’t get lost in chats either. An AI assistant finds messages in work chats such as “gave 3,000 from the Bratskaya till” and offers a card: “Yes, record it”, “No” or “Another employee”. A person confirms every entry, and the payout log gets it without retyping.
- 705receipts accepted on the first loadof 708: 2 cancelled, 1 not found by the tax service
- 13employees with a linked tax number
- 3×a day the assistant reviews chats for payouts11:00, 16:00 and 19:00
Money doesn’t get lost
The payout log is protected against loss. A write that would leave the log with fewer rows is blocked. The previous version is saved before every write, and a daily copy is kept for 60 days.
When the old server became unreachable on 8 October, the payout log and finance state were rebuilt from several sources and moved to the new server. 225 chat messages that looked like payouts didn’t go into the log automatically: a person checks them.
How it was built
The company sets the money rules
Which rates apply, what counts as debt, when to block a total: those are decisions for the head of the business, who confirms the rates and approves every change to the finance rules.
The system has run since June and changes almost every week. The newest parts, such as a day-by-day payment planner, aren’t shown here.
- The companyRates and penalties, money scenarios, what blocks a total, reconciliation against real amounts.
- SemCueThe finance core, forecast, payroll module, receipts and payouts from chats, the pages, imports from the CRM and spreadsheets.
- StaffSee their accruals and receipts on a personal page, and send receipts in Telegram as before.
For technical readers
How it’s built
- Storage
- Money state with a revision number, written under a lock via a temporary file. A change is rejected if the revision has moved on.
- Currencies
- Each account in its own currency; central bank rates and an exchange margin when converting to roubles.
- Forecast
- A sales model and a payment-probability model for booking balances. Historical checks run in the background; the page builds only the current forecast.
- Payroll
- Events from the calendar and CRM, rate rules, an append-only penalty log, a personal page per employee.
- Receipts
- Collected from Telegram, QR read, checked with the tax service, de-duplicated by seller tax number and receipt number.
- AI
- A language model finds payout messages in work chats; nothing enters the log until a person confirms it.
Where the numbers come from
Working documents and logs
- Release log: finance releases from 29 September to 6 October, receipts release on 14 October 2026.
- Forecast audit on the full CRM export, July 2026; historical model checks, September to October 2026.
- First receipts load, 15 October 2026: 708 records, 705 accepted.
- Payroll time estimate as reported by the head of the business.
- Screenshots use test data. In the English version the interface text is translated for this page.
Next system
A new server within a day of a cloud outage →