Horror Cinema · booking and payments
Time first.Film later.
Horror Cinema is a private horror cinema in Omsk: a room for one group, a film, a fear level, live actors. Its website schedule used to load from someone else’s widget, and prepayments were bank transfers backed by a screenshot of the receipt. We built the cinema its own booking system on the website, in Telegram and in VK. Now guests pick a time and prepay in about a minute, then set up the film and details later via a personal link.
Live · online payment since 6 September, new booking since 24 September 2026



- +106%visitors start a booking3.3% → 6.8% after reordering the steps
- +158%visitors reach a confirmed booking1.3% → 3.4%, preliminary: small sample
- 57%of the cinema’s deals are self-service website bookingsup from 34%
- ×16online prepayments in the same 13 days1 → 16, replacing receipt transfers
How it started
In summer 2026 the cinema’s website showed its schedule through an aggregator widget. It took up to ten seconds to load, and until then the schedule was a blank space. The ad budget is small, so every visitor who reached the schedule and left was expensive.
Speeding up someone else’s widget made little sense: lazy loading and caching were half-measures. The bot offered “today” and “tomorrow” buttons, but people need to pick a date and time straight away. So the decision was to build our own booking.
The key question was where free times come from. The cinema’s calendar became the source of truth, with our own booking service on top. Every booking immediately creates a calendar event and a CRM deal. A 1,000-rouble prepayment holds the time for 30 minutes, and unpaid holds are released automatically.
- June
Own booking instead of a widget
A Telegram bot and website booking take free times from the calendar. Guests book themselves; the manager sees a ready deal.
- Summer
VK and night rules
The VK bot mirrors Telegram. After a self-service booking in the middle of the night, a rule for late same-evening bookings appeared.
- August
Funnel analysis
The logs showed the site sometimes offered taken slots as free, and the on-screen price could differ from the CRM.
- 6 September
Time and prepayment first
YooKassa online payment and a new order of steps: the film and mode come after payment.
- 24 September
The new booking
“My booking”, “Pick a time together”, one server-side price for the website and the bots.
Where bookings got lost
At Horror Cinema you can’t just show a free hour in a calendar. One film runs about 80 minutes, another almost three hours. The group chooses a fear level and one or two actors. Both the time and the price depend on that.
So the old form demanded every decision before payment. Groups got stuck there: “which film?”, “who’s coming?”, “let’s decide tonight”. Nobody held the time. Prepayments were transfers by card number, then a receipt upload that a manager checked before confirming.
The funnel analysis turned up worse. The site sometimes showed a slot as free when it was already taken. And the on-screen price could differ from the CRM price: the last-minute discount got lost on the way to the server.
Before
- Film, mode and actors first, payment later
- Prepayment by transfer and a receipt a manager checks
- Any change after payment goes through a manager
- The time is agreed in a group chat, outside the system
- Price calculated in several places and could drift
After
- Time and a 1,000-rouble prepayment first, details later
- YooKassa online payment: Faster Payments or card, receipt automatic
- Film, mode and group size change via a personal link
- A “Pick a time together” link for the group chat
- One server-side price for the website, Telegram and VK
Payment secures the time; details come later
The new path is shorter: date, time, rough group size, one or two actors, contact and prepayment. The film and mode are chosen after payment on the “My booking” page.
That was the main engineering problem. With no film chosen yet, how long do you hold the room? A booking takes a standard 120 minutes straight away. A short film doesn’t shrink that window. A long film extends it only after a fresh calendar check, so it never runs into the next session.




Every change on “My booking” is checked and repriced by the server first. If guests open the page in two tabs and change different things, the second tab can’t overwrite the first: the server says the booking has changed and shows the current version. If the rate changes, the new price appears before saving.
What changed in numbers
- ×2more website visitors start a booking3.3% → 6.8%, statistically significant
- +158%visitors reach a confirmed booking1.3% → 3.4%, a preliminary estimate
- 34% → 57%share of self-service website bookings among all the cinema’s deals
The biggest effect came from reordering the steps: once the film moved after payment, twice as many people started a booking. Online booking became the cinema’s main channel: more than half of deals now go through without messaging a manager. Part of the growth is people who used to write in messengers and now book themselves.
Pick a time together
The slowest part of booking is agreeing when everyone is free. That used to happen in a chat we couldn’t see. Now the organiser sends one link to the group chat. Everyone ticks the options that suit them, and the page shows real free sessions that work for most people.
Voting doesn’t hold a slot. The chosen session is checked again before booking. Votes are stored without names: the browser gets a random identifier, and only its hash stays in the database.

After payment nobody has to forward screenshots. The organiser sends an invitation to the chat: date, time, address and when to arrive. The invitation link can’t manage the booking, so it’s safe to share with the whole group.

The money path
Payment is where a mistake costs money and trust. So the amount comes only from the booking stored on the server. A browser, bot or link can’t change it.
The payment provider sometimes answers slowly, and a server can restart at the worst moment. So the YooKassa request and its key are saved before sending. After a restart the system repeats the same request, and YooKassa doesn’t create a second payment. The system doesn’t take a payment notification on trust either: it re-reads the payment and checks the amount, currency and booking.
Where people book
One booking engine and one set of pricing rules across every channel
Booking
Payment
Confirmation
- amoCRMpayment note
- Google Calendarevent marker
- Botconfirmation to the guest
- 0bookings paid twice
- 0successful payments without a fiscal receiptrefunds have receipts too
- 3brands on one payment setupHorror Cinema, MORPHEUS, Art Quest
How it was built
How we built it
Online payment went live within a week: the first test payment on the website on 30 August, the first real payments on the website and in the bots on 6 September. The new booking with “My booking” and picking a time together was released on 24 September.
The cinema sets the business rules. For example, guests can’t cancel a booking themselves; a manager does it. Rules like that can’t be guessed in code; they had to be agreed up front.
- The cinemaBooking and cancellation rules, prices and discounts, what guests and managers see.
- SemCueThe booking service, pages, bots, YooKassa payments, calendar and CRM sync, the funnel analysis.
- ManagersCancellations, changes and a second actor; a ready deal instead of chats and receipts.
For technical readers
How it’s built
- Channels
- Website, Telegram bot, VK bot. One booking service and one set of pricing rules. MORPHEUS and Art Quest use the same payment setup.
- Booking service
- Node.js in Docker. Availability from Google Calendar with a fresh check before writing, and a lock per room.
- Booking changes
- A personal key link, a version number on every change, server-side repricing before saving.
- Payments
- YooKassa, three shops. The idempotency key is saved before sending; notifications are re-checked via the API.
- Sync
- A job queue per payment: amoCRM note, calendar marker, confirmation to the guest — without duplicates.
Where the numbers come from
Metrica, CRM and payments
- Conversion: Yandex Metrica visits and CRM deals in 13-day windows, 24.08–05.09 and 11.09–23.09.2026, aggregates only; Fisher’s exact test for the difference in started bookings.
- Payments: reconciliation of YooKassa, the CRM and bookings as of 14 October 2026.
- How it started: working discussions and the release log, June to September 2026.
- Screenshots use test data. In the English version the interface text is translated for this page.
Next system
Party booking and theatre booking on one core →