Признание выручки
Эта страница объясняет, как именно система считает выручку за период и почему эта цифра может отличаться от суммы денег, которые реально легли на счёт за этот же период. Понимание этой разницы критично для любого, кто читает финансовые отчёты: владельца, бухгалтера, управляющего.
Короткий ответ
Заголовок раздела «Короткий ответ»Система использует метод начисления по ночам проживания (accrual по ночам) — международный стандарт USALI для гостиничного бизнеса. Выручка бронирования распределяется пропорционально ночам, когда гость реально проживал в номере, а не по дате создания брони и не по дате оплаты.
Это значит:
- Бронь на 10 ночей с 25 января по 4 февраля → в январе признаётся выручка за 7 ночей, в феврале — за 3.
- Момент, когда деньги легли на счёт, на эту цифру не влияет.
- Правило ночи. Прошедшая ночь входит в выручку, только если бронь заселена или выехала (CHECKED_IN, CHECKED_OUT): пока гость не заселился, в номере никто не ночевал. Ночь с сегодняшней и дальше входит и у подтверждённой брони (CONFIRMED, «На проверке у ресепшена») — это «забронировано вперёд». Правило одно для цены ночей, скидок и доплат, доплат за время и услуг брони.
- Отменённые брони и неявки в выручку не входят. Удержание при отмене или незаезде есть только в P&L.
Три способа считать выручку — и почему мы выбрали именно этот
Заголовок раздела «Три способа считать выручку — и почему мы выбрали именно этот»В мировой практике есть три разных метода признания выручки, и они дают разные цифры за один и тот же период.
1. По дате брони (as-booked)
Заголовок раздела «1. По дате брони (as-booked)»Выручка признаётся в момент, когда бронь была создана. Проблема: это не выручка, это объём продаж. Забронированное в январе проживание в мае может быть отменено, и тогда «январская выручка» окажется фикцией.
2. По дате оплаты (cash-basis)
Заголовок раздела «2. По дате оплаты (cash-basis)»Выручка признаётся в момент, когда деньги пришли на счёт. Плюс: совпадает с банковской выпиской. Проблема: если гость внёс предоплату в декабре, а жил в марте, декабрь будет искусственно богатым, а март — бедным. Расходы на обслуживание гостя (уборка, коммуналка, зарплаты) всё равно пойдут в марте. В результате декабрь выглядит прибыльным без причины, март — убыточным без причины.
3. По ночам проживания (accrual — наш выбор)
Заголовок раздела «3. По ночам проживания (accrual — наш выбор)»Выручка признаётся пропорционально ночам, когда гость реально жил в номере. Плюс: выручка и расходы всегда относятся к одному и тому же периоду. GOP (прибыль до аренды и налогов) отражает реальную эффективность гостиницы за конкретный месяц. Минус: цифра выручки не совпадает один в один с движением денег по счёту.
Это и есть стандарт USALI — Uniform System of Accounts for the Lodging Industry, по которому отчитываются все международные гостиничные сети. Мы используем его, потому что это единственный метод, при котором P&L-отчёт даёт правду о том, заработала гостиница или потеряла за конкретный месяц.
Пример расхождения
Заголовок раздела «Пример расхождения»Бронь на 100 000 ₸, 10 ночей с 15 января по 25 января. Гость оплатил всё сразу при заезде 15 января. За январь расходы на эту бронь: 75 000 ₸ (зарплаты, коммуналка, продукты).
| Метод | Январь: выручка | Январь: GOP |
|---|---|---|
| По дате брони (as-booked) | зависит от даты создания | случайная цифра |
| По дате оплаты (cash) | 100 000 | +25 000 |
| По ночам (наш) | 100 000 | +25 000 |
Пока оплата и проживание в одном месяце — все методы сходятся.
А теперь тот же гость, но предоплатил в декабре:
| Метод | Декабрь выручка | Декабрь GOP | Январь выручка | Январь GOP |
|---|---|---|---|---|
| По дате брони | 100 000 (при бронировании в декабре) | +100 000 | 0 | −75 000 |
| По дате оплаты (cash) | 100 000 | +100 000 | 0 | −75 000 |
| По ночам (наш) | 0 | 0 | 100 000 | +25 000 |
Видно, что первые два метода создают ложно-прибыльный декабрь и ложно-убыточный январь. Метод по ночам даёт правду: декабрь ничего не заработал, январь принёс 25 000 ₸ прибыли.
Где какой метод используется в системе
Заголовок раздела «Где какой метод используется в системе»| Отчёт / экран | Метод | Почему именно так |
|---|---|---|
| Главная, плитка «Выручка» | По ночам: выручка проживания и услуги брони по ночам периода, допродажи — по дате создания, если оплачены | То же число, что итог «Выручки по категориям» за тот же период |
| Главная, карточка «Выручка проживания» и отчёт «Разбор выручки проживания» | По ночам, целыми днями по вчера | Цена ночей со скидками и доплатами, доплаты за время, минус возвраты брони за эти ночи |
P&L отчёт (/reports/pnl) и «Прибыль за период» на главной | Accrual по USALI | Своё определение: удержания при отмене и незаезде, возвраты по дате проведения; доступ по праву financial_kpi.view |
| GOP, GOPPAR, EBITDA, прибыль до налогов | Accrual по USALI | Одна функция P&L: главная показывает те же числа, что отчёт |
| Night Audit | За смену | Брони и корректировки, заведённые за сутки; деньги смены сверяются с кассой отдельной строкой |
Касса и платежи (/reports/payment-ledger) | По дате платежа | Главный отчёт для сверки с банком — показывает реально поступившие деньги |
| Главная: «Касса за период», «Касса за сегодня», «Касса за день» объектов отдыха | По дате платежа | Это касса, а не выручка: предоплата за будущие ночи попадает сюда в день платежа |
Балансы броней (/reports/aging) | Остатки по броням | Кто сколько должен (и где переплаты) |
Как считается выручка по ночам
Заголовок раздела «Как считается выручка по ночам»Для каждой брони, чьи ночи пересекаются с запрашиваемым периодом:
perNight = (totalAmount + adjustmentsSum − refundsSum) / totalNightscountedNights = ночи пересечения с периодом, засчитанные правилом ночиstayRevenue += perNight × countedNightsstayRevenue += доплаты за время с датой услуги в периодеГде:
totalAmount— стоимость проживания брони, без услуг брониadjustmentsSum— сумма активных скидок и доплат оператора брони, кроме доплат за ранний заезд и поздний выездrefundsSum— возвраты по этой брони, дата возврата не важнаtotalNights— количество ночей брони целиком (checkOut − checkIn)- доплата за ранний заезд идёт датой заезда, за поздний выезд — датой выезда, целиком
Если бронь полностью вне периода → выручка 0. Если totalNights = 0 (некорректная бронь) → выручка 0.
Так считается выручка проживания. Выручка — она же плюс услуги брони, разделённые по ночам тем же правилом, и допродажи, созданные и оплаченные в периоде. Удержания при отмене и незаезде в них не входят — они есть только в P&L.
Скидки/доплаты (BookingPriceAdjustment)
Заголовок раздела «Скидки/доплаты (BookingPriceAdjustment)»Скидка/доплата — это пост-факт изменение цены брони (SURCHARGE — доплата, DISCOUNT — скидка), которая применяется оператором уже после создания брони (например: «доплата за дополнительного гостя», «VIP-скидка 10%», «компенсация за поломку кондиционера»).
Скидки/доплаты распределяются по тем же ночам проживания, что и сама бронь — это нужно чтобы реальная цена сделки (totalAmount + сумма скидок/доплат) корректно отражалась в accrual-выручке за период проживания.
Пример: бронь на 10 ночей с 25 января по 4 февраля, базовая цена 100 000 ₸, оператор 13 февраля добавил скидку −20 000 ₸ за лояльность. Скидка распределится по 2 000 ₸ на каждую ночь:
| Метод | Январь выручка | Февраль выручка |
|---|---|---|
По дате createdAt скидки/доплаты | 70 000 (100к × 7/10) | 30 000 − 20 000 = 10 000 |
| По ночам проживания (наш) | 70 000 − 14 000 = 56 000 | 30 000 − 6 000 = 24 000 |
Метод по ночам — единственный корректный для accrual: скидка относится к услуге (10 ночам проживания), а не к моменту, когда оператор её внёс в систему.
Проживание, услуги брони и допродажи
Заголовок раздела «Проживание, услуги брони и допродажи»Выручка объекта складывается из трёх частей:
- Проживание — цена ночей по броням, без услуг брони и допродаж.
- Услуги брони — услуги, добавленные в бронь: завтрак, трансфер, поздний выезд. Оплачиваются вместе с бронью, общим платежом. В P&L, «Каналах», «Выручке по категориям» и выручке сети распределяются по ночам проживания, как и сама бронь.
- Допродажи — продажи на стойке с бронью и без неё: напитки, прокат, мангал. У допродажи своя оплата, поэтому в P&L она признаётся по дню оплаты; отменённые не входят.
Обе части сверх проживания входят в P&L, в плитку «Выручка» главной, в «Выручку по категориям», «Каналы», «Гости» и в отчёты сети. Каждый отчёт показывает их двумя отдельными строками. На главной услуги брони, как и в отчётах, делятся по ночам; допродажи — созданные и оплаченные в периоде.
Что остаётся только на проживании:
- ADR, RevPAR и выручка проживания (карточка главной и «Разбор выручки проживания») — это цена номера, услуги брони и допродажи их не меняют. TRevPAR — выручка номеров с услугами брони и допродажами при бронях номеров.
- Комиссия канала — площадка берёт процент с проживания; так считают и «Каналы», и P&L.
- Темп бронирования, «Продано на 6 месяцев», прогноз и «Заезды после периода» — это не выручка, а «Сумма броней»: стоимость проживания брони целиком, со скидками и доплатами, без возвратов.
Допродажа без брони в «Каналы» не входит: у неё нет канала. Её видно в «Выручке по категориям» строкой «Продажи вне броней».
Если гость платит за накопленные допродажи при выезде, вся сумма попадает в день выезда, а не распределяется по дням проживания. Для гостиницы это редко меняет картину.
Разбивка выручки по департаментам (USALI)
Заголовок раздела «Разбивка выручки по департаментам (USALI)»В P&L-отчёте accrual-выручка дополнительно разносится по направлениям (операционным департаментам USALI): размещение, питание, прочие направления и прочие доходы. Привязка идёт через категорию выручки (SaleCategory.department):
- Проживание (комната + скидки/доплаты − возвраты) → всегда Размещение.
- Услуги брони и допродажи → в своё направление по категории; услуга без категории и свободная позиция идут в Размещение. Товар с полки — в отдел «Розница», если его категория там стоит (см. Категории выручки); себестоимость проданного идёт в тот же отдел и тот же день, что выручка.
- Категория «Доход вне операций» (субаренда, проценты) → в выручку не входит ни у услуг брони, ни у допродаж — ни в P&L, ни на дашборде; в P&L это строка «Доход» внеоперационной секции ниже GOP.
- Удержание при отмене → «Прочие доходы», удержание за незаезд → «Размещение»; оба — по дате отмены.
- Бронь с отметкой «Бесплатное размещение» даёт в P&L занятую ночь, но не проданную: в ADR по USALI и проданные ночи P&L не входит. ADR главной и отчётов считает такую ночь проданной с нулём.
По каждому направлению P&L показывает не только выручку, но и прибыль направления (выручка минус его зарплаты и прочие расходы). Это позволяет увидеть, какое направление зарабатывает, а какое — съедает маржу. Сама модель расчёта по ночам при этом не меняется: разбивка по направлениям — это «надстройка» над той же accrual-выручкой.
Refunds (возвраты)
Заголовок раздела «Refunds (возвраты)»В P&L, кассе, ночном аудите и сигнале «возвраты» сети возвраты вычитаются по дате проведения (PaymentRefund.settledAt). Это бухгалтерский стандарт: возврат — это поправка текущего периода, а не ретроактивное изменение прошлого закрытого месяца.
Последствие для P&L: если гость жил в январе, а возврат ему оформили в марте, то:
- Январь показывает полную выручку (100 000 ₸)
- Март вычитает возврат из своей выручки
- Сумма помесячных чисел за январь-март не равна сумме выручки за квартал, если возврат был частичным и затронул оба месяца. Для квартального периода возврат будет учтён один раз.
Если для вас это проблема (например, нужна чистая квартальная выручка без таких артефактов) — запрашивайте P&L за квартал целиком, а не складывайте три месячных отчёта вручную.
Выручка проживания и выручка — главная (плитка «Выручка», карточка «Выручка проживания»), Разбор выручки проживания, Каналы продаж, Выручка по категориям, Год к году и выручка сети — считают возврат иначе. Он вычитается из выручки своей брони и делится её ночами, как сама выручка, а дата возврата не важна. Гость жил 28 августа – 2 сентября, ему вернули 10 000 ₸: сентябрь с одной ночью из пяти вычтет 2 000 ₸, август — 8 000 ₸.
Почему цифры в P&L не сходятся с кассой
Заголовок раздела «Почему цифры в P&L не сходятся с кассой»Самый частый источник путаницы. Управляющий смотрит на P&L за апрель и видит «Итого выручка: 593 270 ₸». Потом открывает банковскую выписку и кассу и понимает, что за размещение (за ночи гостей) за этот месяц фактически не пришло ни тенге — только 20 270 ₸ за услуги на ресепшене. Возникает закономерный вопрос: что это за 593 270 ₸ и где они?
Короткий ответ
Заголовок раздела «Короткий ответ»Это две разные метрики про два разных события, и обе верные — просто про разное.
- 593 270 ₸ (P&L, «Выручка по USALI» на главной) — это начисленная выручка за апрель по USALI: столько гостиница заработала услугами, оказанными в апреле. Часть гостей оплачивала эти ночи в марте, часть оплатит в мае — но услуги оказаны в апреле, поэтому выручка признана в апреле.
- 20 270 ₸ (касса) — это сколько реальных денег поступило в апреле. За проживание в этом месяце большая часть уже была оплачена заранее (в марте или раньше), поэтому в кассе апреля только допродажи.
Обе цифры корректны. Они отвечают на разные вопросы:
- P&L отвечает «сколько гостиница заработала апрелем»
- Касса отвечает «сколько денег поступило в апреле»
Ещё один пример
Заголовок раздела «Ещё один пример»Владелец смотрит на P&L за март и видит «GOP: 2 000 000 ₸». Потом смотрит выписку за март — «пришло 3 500 000 ₸». Разница в другую сторону.
- GOP 2 000 000 — столько гостиница заработала за услуги, оказанные в марте (прибыль до платы управляющей компании, аренды, налогов и процентов).
- 3 500 000 на счёте — это разные деньги: часть за март, часть предоплат за апрель-май, минус частичные возвраты за февральские брони.
Эти цифры никогда не обязаны совпадать. Совпадают они только в учебном примере, когда все гости заехали, прожили и расплатились в одном и том же месяце, а возвратов не было.
Как посмотреть реальные деньги — пошагово
Заголовок раздела «Как посмотреть реальные деньги — пошагово»Если нужно ответить на вопрос «сколько денег реально пришло за этот период», зайти нужно в Касса и платежи.
- В левом меню откройте раздел «Отчёты» → «Касса и платежи» (значок кошелька).
- Вверху — три KPI-карточки:
- Поступления — сколько пришло всего за период (и количество транзакций).
- Возвраты — сколько вернули гостям (если были возвраты).
- Чистая касса — итог: поступления минус возвраты. Это число для сверки с банком.
- Ниже — блок «По источнику»: отдельно брони и отдельно сервис (допродажи на стойке: бар, прачечная, прокат). Видно, откуда пришли деньги.
- График «Поступления по дням» — столбчатая диаграмма. Зелёные столбцы — поступления, красные — возвраты. Сразу видно пиковые дни.
- Таблица «По способам оплаты» — отдельно наличные, Kaspi, банк. перевод и т.д. Эта разбивка обычно нужна бухгалтеру.
- Внизу — детальная таблица транзакций: каждая запись со ссылкой на бронирование и гостя.
- Справа сверху — кнопки Excel и CSV. Обычно бухгалтеру отправляется Excel за месяц.
Фильтр периода — стандартный: сегодня / вчера / этот месяц / прошлый месяц / квартал / произвольный диапазон. Всё на странице — KPI, график, разбивки и таблица — пересчитывается в связке.
Куда смотреть в зависимости от задачи
Заголовок раздела «Куда смотреть в зависимости от задачи»| Задача | Отчёт |
|---|---|
| Сколько денег пришло за день/неделю/месяц | Касса и платежи |
| Сверка кассы с банковской выпиской | Касса и платежи → Excel |
| Сколько пришло наличными / Kaspi / переводом | Касса и платежи → «По способам оплаты» |
| Что заработала гостиница в марте (прибыльность) | P&L |
| Какая маржа (GOP, EBITDA, GOPPAR) | P&L |
| Сравнение этого месяца с прошлым годом по прибыли | Год к году |
| Что произошло за смену на ресепшене (заезды/выезды/оплаты одной даты) | Ночной аудит |
| Кто из гостей должен денег (и где переплаты) | Балансы броней |
Технические детали
Заголовок раздела «Технические детали»- Модуль:
apps/api/src/modules/revenue-lines/— выручку брони собирает только он BookingRevenueService.stayRevenue/revenue— выборка «Выручки проживания» и «Выручки» фонда за периодstayRevenue.ts— деление по ночам и сложение:stayRevenueTotals,revenueTotals, разбивка по дням и месяцамstayRevenueByBucketnightRule.ts— правило ночи, одно на все части- P&L собирает своё определение «по USALI» из тех же частей в
reports.service.ts
Что планируется дальше
Заголовок раздела «Что планируется дальше»- Night Audit остаётся «за смену»: начисления по дате создания брони и корректировок — это его естественная семантика.
Где скидки/доплаты учитываются в отчётах
Заголовок раздела «Где скидки/доплаты учитываются в отчётах»| Отчёт | Метод учёта скидок/доплат |
|---|---|
Главная → «Выручка» (/analytics/kpi) и «Выручка проживания» (/analytics/revenue) | По ночам, в составе выручки проживания |
P&L (reports.profitAndLoss) | Отдельная строка revenue.adjustments, входит в revenue.total |
| Revenue by Group | Свёрнуты в totalRevenue группы (без отдельной строки) |
| Channel Performance | Свёрнуты в totalRevenue канала (без отдельной строки) |
| Год к году | Свёрнуты в выручку проживания месяца, ADR и RevPAR — по ночам брони, как в Channel Performance |
| Cancellation Report | Включены в «Отменено на» (summary.amount) отменённой брони целиком, вместе с доплатами за время |
| Night Audit | Отдельная строка revenue.adjustments: скидки и доплаты — по createdAt, доплаты за время — по дате услуги |