Skip to content
SemCue

Art Quest · Horror Cinema · MORPHEUS

One pictureinstead of five logins.

Websites, bots, CRM, bookings, ads and payments for three businesses lived in separate accounts, and each one answered its own question. We built the company one system: an in-house event tracker, an owner dashboard, a collector that reads 20 sources on timers, and a mirror of amoCRM in a shared database. The dashboard’s main figure is money actions, not visits.

Live · tracker, dashboard and collector on the production server; the weekly package has been built by a timer since 12 October 2026

Where the data comes from

  • Websites of three brands
  • Telegram and VK bots
  • amoCRM and bookings
  • YooKassa
  • Yandex Metrica
  • Search Console
  • Avito
  • VK

Our own system

  1. TrackerWebsite and bot events
    60,557events in three weeks
  2. CollectorReads sources on timers
    20sources in the weekly package
  3. DatabaseDeals, bookings, payments together
    4,356amoCRM deals in the mirror

What the owner gets

  • Owner dashboard19 sections: money actions, funnel, Live
  • Weekly packageThe server builds it every Monday
  • End-to-end pathClick, bot, booking, payment, deal

Each account knows its own piece

Metrica counts visits. amoCRM knows deals. YooKassa sees payments, Avito keeps its own chats and Search Console shows search. None of them can say which post brought the customer who booked a session through a bot and paid for it.

The owner needs an answer to a plain question: where did this week’s money come from. For that, data must meet in one place and speak one language. So we built an in-house system in three layers.

Before

  • Metrica counts visits, not bookings
  • amoCRM knows the deal, not the page the customer came from
  • The website, the bot and the payment write to separate logs

After

  • One tracker across the websites and bots
  • amoCRM deals sit in the same database as the events
  • An end-to-end key ties click, bot, booking and payment; deals gain a website session
  • The server builds the weekly package itself
  • Layer 1

    Tracker

    Our code on the websites and in the bots writes events to the database. The registry describes 110 events: when each fires, why it matters and whether it shows on the dashboard.

  • Layer 2

    Collector

    A Python programme on three timers reads external sources and stores the records in its own store. The weekly package draws on 20 sources.

  • Layer 3

    Dashboard

    The owner’s web panel with 19 sections. Its headline figure is money actions, not visits.

The CRM / Bookings section of the dashboard on demo data: today and period figures, period comparison and the deal funnel.
Deals, bookings and payments in one section: today, the week and the month. Demo data; interface translated for this page.

The dashboard counts money actions, not visits

The main tile on the dashboard is called Money actions. It adds three counters: uploaded payment receipts, Horror Cinema website bookings and bot enquiries sent to CRM with a real phone number.

A repeated event doubles nothing: receipts are counted by unique booking number, website bookings by unique session and bot enquiries by unique token. It counts actions, not roubles.

In the quiz section live and dead sessions are counted separately. In a live session the visitor did something on the page. In a dead one they arrived and left. Traffic full of empty visits no longer looks like a win.

Owner dashboard on demo data: Money actions, enquiries, visits, sessions and errors tiles, today’s CRM block and cards for three projects.
The dashboard home on demo data. The main tile counts actions, not visits. Interface translated for this page.
Live event feed on demo data: project, funnel, session and device for every action.
The Live event feed: what people do on the site, with project, session and device. Demo data; interface translated for this page.
  • 19dashboard sectionshome, websites, ads, bots, CRM, payroll, Live
  • 110events in the registrywhen each fires, why, and whether it shows on the dashboard
  • 60,557events recorded8 to 29 October, service traffic not filtered out
  • 5,488unique sessionsover the same three weeks

The collector reads 20 sources on timers

The collector is a separate programme on the server. Three timers start it: a frequent one, a daily one and a weekly one. It reads Metrica, Search Console, Avito, VK, YooKassa, amoCRM and the booking store, brings records to a common shape and puts them in its own store.

By 9 October the store held 18,390 normalised records, 103 collector runs and 1,762 attribution links. A link answers which channel a deal, booking or payment came from.

  • 2,182Yandex Metrica recordsper the 29 September status
  • 1,801Search Console recordsas of 29 September
  • 999Avito chatsas of 29 September
  • 181YooKassa paymentsand 18 refunds, as of 29 September

The collector’s main rule: a failure never becomes a zero. If one of the 17 optional sources does not answer, the package is marked PARTIAL with a warning. If one of the three critical sources fails (the full deal list, the booking store, the calendar), the package is not released.

A separate layer tracks changes to the websites. It normalised 21 changes and 63 follow-up checks at 7, 14 and 28 days after each.

A full amoCRM export in 6 minutes 45 seconds

At 14:26 Tashkent time on 8 October a full amoCRM export started. At 14:33 it finished.

In 6 minutes 45 seconds it pulled 4,063 deals, 8,844 contacts, 36,263 tasks and 5,748 deal notes. That took 253 API calls, with 0 errors. It made no write requests: the export only read data.

The deal mirror sits next to the website events. As of 29 October it holds 4,356 deals. The system adds a website session, an entry page, a booking number and a payment to a deal when they are known.

  • 4,063dealsin the 8 October export
  • 8,844contacts
  • 36,263tasks
  • 253API calls0 errors

The weekly package builds without people

Every Monday at 03:30 Tashkent time the server builds the weekly package from 20 sources. Each package gets a SHA-256 checksum, and Drive receives a safe ZIP with aggregates only: no conversations, CRM cards or customer data.

The packages of 12, 19 and 26 October were built by the timer. Nobody pressed a button.

  • 7 minfirst scheduled run12 October, 03:30 to 03:37
  • 98.6 sfull week build12 phases, a rehearsal on a copy of the store
  • 3 of 3runs in a row with no manual start12, 19 and 26 October

What the owner gets from the package each week is covered in a separate case on the weekly business report.

Click, bot, booking, payment and deal on one key

On 28 October an end-to-end key went into the links to the bots: it ties the website, the bot, the booking and the payment together. In the first day the system issued 348 keys.

Deals in the mirror gained a link to a website session: from 0 to 38 of 278 (14%). Now 47 deals have an entry page, 57 a booking number and 39 a payment.

The booking money funnel on demo data: from opening the widget on the website to an uploaded prepayment receipt.
The booking money funnel on demo data: from opening the widget to the prepayment receipt. Interface translated for this page.

One key along the whole customer path

  1. 1Clickad, post, QR code
  2. 2Websitesession and entry page
  3. 3Botkey in the Telegram and VK link
  4. 4Bookingkey and session are stored
  5. 5Paymentpayment tied to the booking
  6. 6Dealin the amoCRM mirror

348 keys issued in the first day

Sessions with no source: before and after the rule recount

Horror Cinema
before
79%
after
34%
Art Quest
before
95%
after
62%
MORPHEUS
before
73%
after
29%
The share of sessions with no source was recounted with the new channel rules on data from 8 October. The data itself did not change.

The whole customer path from click to deal is covered in a separate case on end-to-end analytics.

What the data showed

  • iPhone

    The booking form did not submit from iPhones for five days

    From 19 to 23 October the booking form on the Horror Cinema site did not submit from iPhones. The weekly report for 19 to 25 October shows 3 self-service booking enquiries against 12 the week before. Fixed on 23 October.

  • Direct

    “Direct + search” deals turned out to be calls

    41 “Direct + search” deals turned out to be calls to the advertising number. The Direct click tag reached the websites in only 2 sessions, while 730 sessions came from organic Yandex search. Such deals do not show up in website visits.

  • Widget

    A booking lost its session

    11 of 11 bookings through the Horror Cinema website widget before 19 October arrived without a session: a filter took a 13-digit timestamp for a phone number. From 19 October a booking carries the widget session, and from 28 October the widget passes the website session, so a booking joins the visit.

How it was built

Five months from the first dashboard to the end-to-end key

The first working dashboard version dates from 29 May 2026. On 13 June CRM and the bots joined it. By the end of September the collector ran beside it, on 12 October it built its first scheduled weekly package on its own on the new server, and the end-to-end key went in on 28 October.

The company asks the questions: where did the money come from, where do enquiries get lost, what changed this week. We turn each question into an event, a table or a screen.

  • The companyQuestions for the data and the choice of sources: what to read, what counts as money.
  • SemCueThe tracker, dashboard, collector, amoCRM mirror and end-to-end key.
  • The serverTimers start collection and the weekly package by themselves.

For technical readers

Under the hood

Tracker and dashboard
Node.js (Express) and PostgreSQL. Website and bot events, the amoCRM deal mirror, 19 dashboard sections.
Collector
Python with a SQLite store and three timers: frequent, daily and weekly.
Package rules
3 critical and 17 optional sources. A failed optional source is marked PARTIAL and never becomes a zero. Each package has a SHA-256 checksum, and Drive receives a ZIP with aggregates only.
End-to-end key
A key in the bot links, tying the booking, payment and deal to the website session.

Where the numbers come from

Where the figures come from

Next system

Customer journey: from the first click to payment →

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.