Skip to content
SemCue

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

Overview with test data: “21,594 ₽ known + unknown balances”, while the first shortfall and the amount to distribute stay as dashes until balances are reconciled

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

amoCRM and the booking calendarbalances due on bookings and sales history for the forecast
Bank APIread-only balances and statements
Payroll journalaccruals and payouts already made
Manual recordsdebts, rent, bills, accounts in several currencies

Finance core

Unknown is not zeroif an amount or a rate is unknown, the money conclusion is blocked and the screen shows “—”
Every payment counts oncea received payment updates the account and settles the accrual in one operation
Scenarios kept apart from factsstress, existing bookings, base and strong; future money is never shown as cash

Answers for the day

How much money there isper account and currency, with the reconciliation date
What to pay todayincluding anything overdue
When the first gap comesunder the chosen scenario
How much can be distributedsafe, base or aggressive
Sources, core rules and answers. The bank is connected read-only.

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.

The finance core’s main rule
“Needs a decision”: reconcile balances and fix the date of an old debt, or no total is calculated
Test data, interface text translated for this page. Until balances are reconciled, no total is calculated: the system shows which decision is needed.

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%.

Overview with test data: “21,594 ₽ known + unknown balances”, while the first shortfall and the amount to distribute stay as dashes until balances are reconciled
Test data, interface text translated for this page. Confirmed amounts sit apart from the forecast; no total is shown until balances are reconciled.

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.

Sales forecast error by horizonThe model in use at the end of September 2026, backtested on 33 historical dates. WAPE, per cent: 7 days 21.7; 14 days 20.6; 30 days 16.7; 60 days 13.3; 90 days 12.7.0%5%10%15%20%25%21.7%7 days20.6%14 days16.7%30 days13.3%60 days12.7%90 days
Check of the sales model in use at the end of September 2026 on 33 historical forecast dates. WAPE is the error in total sales over the horizon as a percentage of actuals. Lower is better.

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.

  1. EventA calendar booking or an amoCRM deal: date, programme, who worked
  2. Rate ruleRole and package set the amount. Unclear events go to a review queue
  3. AccrualA line: date · event · package · role · amount · rule
  4. PenaltiesA separate append-only journal. Reversing a penalty is a new record
  5. PayoutsEach payout settles the oldest amounts first. The same payout cannot be recorded twice
  6. 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

Next system

A new server within a day of a cloud outage →

SemCue / Let’s talk

What would you like to work on?

Tell us about your project and what you need. A rough idea is enough.

Get in touch on Telegram

We’ll discuss your goals, where things stand and the right next step.

Discuss your project on Telegram
In developmentThis site is still being built, so things may change.