Начать проект

Обсудим проект?

Нажимая на кнопку, вы даете согласие на обработку персональных данных и соглашаетесь с политикой конфиденциальности.

Отправлено!

Спасибо за заявку, мы свяжемся с вами в ближайшее время!

Биллинг: тарифы, подписки и деньги, которые теряются на округлениях

Биллинг: тарифы, расчётный период, счёт и списание в продукте с подписками

Сервис работает, оплаты проходят, а на закрытии месяца бухгалтерия присылает список расхождений на несколько рублей. Найти источник никто не может, потому что ломается биллинг обычно не в архитектуре, а в третьем знаке после запятой. Мы в Code Pilots делаем системы под процесс заказчика, и денежная логика — та часть, где чужая коробка почти никогда не подходит.

Если совсем коротко. Биллинг проходит шесть шагов от события до чека, и деньги теряются на трёх из них. Округление неполных периодов, повторное списание после сбоя и пересчёты задним числом — вот три места, где сумма перестаёт сходиться. Правила округления и порядок операций фиксируют в требованиях до начала разработки.

С 1 января 2026 года к этому добавилась новая ставка НДС, и расчётные периоды, попавшие на её смену, система должна уметь делить.

Что делает биллинг на самом деле

Слово «биллинг» звучит как одна функция, а внутри работает цепочка из шести шагов. Ошибка на любом из них выглядит одинаково — деньги не сходятся.

Шаг Что происходит Что ломается чаще всего
Событие Продукт фиксирует потребление — продление подписки, отправленное сообщение, занятое место на диске События теряются или приходят дважды
Тарификация К событию применяют тариф, пакет, лимит и скидку Порядок применения скидок нигде не зафиксирован
Начисление Сумма ложится на лицевой счёт клиента за расчётный период Неполный период считают по-разному в разных местах
Счёт Начисления собираются в документ с налогами и итогом Сумма строк не равна итогу из-за округлений
Платёж Списание через платёжного провайдера или оплата по счёту Повторная попытка списывает второй раз
Чек и проводка Фискальный чек покупателю, документы в учётную систему Данные сервиса и учётной системы расходятся

Отдельный слой — обмен с внешними системами на каждом шаге. Требования к нему жёстче обычных. Денежная операция не может выполниться дважды и не может потеряться, поэтому проектирование интерфейсов обмена для биллинга начинают с гарантий доставки и только потом переходят к формату полей.

Шесть шагов биллинга: событие, тарификация, начисление, счёт, платёж, чек и проводка

Три модели тарификации

Модель определяет, что система обязана уметь, поэтому её выбирают раньше, чем пишут первую строку кода.

Модель Как считается Что требует от системы
Подписка Фиксированная сумма за период, одинаковая для всех в тарифе Календарь периодов, пропорциональный расчёт при переходах, продление
За использование Клиент платит по факту потребления — за обращения к сервису, объём данных или активных пользователей Надёжный сбор событий, защита от дублей, агрегация за период
Гибрид Абонентская плата плюс превышение пакета Пакеты, лимиты, перенос остатка, уведомления о приближении к лимиту

Гибрид встречается чаще всего и стоит дороже двух других вместе. Пакет с лимитом тянет за собой десяток отдельных решений. Что происходит с остатком в конце периода, считается ли превышение сразу или на закрытии, блокируется ли услуга при исчерпании лимита — каждый ответ добавляет логики.

Отдельно продумывают пробный период. Он выглядит простой скидкой в сто процентов, а на деле требует своих правил. Нужна ли привязка карты на входе, что происходит при отказе от продления, считается ли пробный период при возврате клиента через полгода, начисляется ли за него документ. Половина споров с клиентами возникает именно на переходе от пробного периода к платному.

Для сервисов по подписке модель тарификации связана с экономикой продукта напрямую — как устроена эта экономика, разобрано в материале про SaaS-модель.

Где в биллинге теряются деньги

Потери в биллинге тихие. Они не вызывают аварию и не попадают в отчёт об инцидентах, поэтому живут годами.

Недосчитанное потребление. События теряются на пути от продукта к расчётному ядру, и часть услуг не тарифицируется вообще. Компания оказывает услугу бесплатно и не знает об этом.

Переплаты клиентов. Обратная ситуация: событие пришло дважды, клиент оплатил лишнее. Обнаруживается по жалобе, возвращается с извинениями, а доверие к сервису падает.

Расхождения на закрытии. Итог сервиса не сходится с учётной системой на копейки. Бухгалтерия закрывает период руками, и каждый месяц на это уходит несколько дней.

Рядом стоит четвёртый источник, к расчётам отношения не имеющий. Тарифы и промокоды регулярно становятся объектом злоупотреблений. Множественные регистрации под приветственный период, эксплуатация ошибок в лимитах и возвраты по цепочке бьют по выручке не хуже ошибок в арифметике. Эта часть закрывается отдельным слоем, разобранным в материале про антифрод в продукте.

Округления и неполные периоды

Тема выглядит мелкой ровно до первого закрытия месяца. На числах она перестаёт быть мелкой сразу.

Тариф стоит 3000 ₽ в месяц. Клиент переходит на другой тариф 12 марта, в месяце 31 день. За 11 дней старого тарифа приходится 3000 × 11 ÷ 31 = 1064,516 ₽. Округление до копеек даёт 1064,52 ₽, округление до рублей — 1065 ₽. Разница копеечная, но на тысяче переходов в месяц она превращается в сотни рублей, и накапливается она каждый месяц.

Второй классический случай — скидка на счёт из нескольких позиций. Скидка 10% на три позиции по 333,33 ₽: сумма скидок, посчитанных по каждой позиции, и скидка от итоговой суммы различаются на копейку. Обе арифметики верны, но результат разный.

Чтобы это не стало вечным источником расхождений, до начала разработки фиксируют четыре правила. По какой базе считается неполный период — по календарным дням месяца или по фиксированным тридцати. До какого знака округляют и в какую сторону. В каком порядке применяются скидка, пакет и налог. Где хранится результат округления, чтобы повторный расчёт дал ту же цифру.

Последний пункт важнее, чем кажется. Если система каждый раз пересчитывает сумму заново вместо того, чтобы хранить зафиксированный результат, счёт поедет после исправления любой мелочи в тарифе.

Правило округления стоит копейку на одном клиенте и сотни тысяч на базе за год. Записывают его один раз, до первой строки кода.

Что изменилось с 1 января 2026

Основная ставка НДС повышена с 20% до 22% — Федеральный закон от 28.11.2025 № 425-ФЗ. Пониженные ставки 0% и 10% для отдельных категорий сохранены. Для продукта с подписками из этого следуют три конкретных требования.

Первое. Расчётный период, начавшийся в декабре 2025 года и закончившийся в январе 2026, попадает на две разные ставки. Правило распределения задаёт бухгалтерия, а реализовать деление обязана система, и заранее её к этому обычно никто не готовит.

Второе. В тарифной сетке нужно однозначно понимать, цена указана с налогом или без. При смене ставки цена «с НДС» меняется для клиента, цена «без НДС» — для компании. Оба варианта законны, но выбор влияет на выручку, и делают его один раз.

Третье. Компании на упрощённой системе с 2026 года платят НДС, если доход за 2025 год превысил 20 млн ₽. Если порог превышен в течение 2026 года, налог считают с первого числа месяца, следующего за месяцем превышения. Для биллинга это означает, что ставка налога у продавца может измениться в середине года. Хранить её нужно параметром с датой действия.

Повторные списания

Самая дорогая техническая ошибка в биллинге выглядит безобидно. Запрос к платёжному провайдеру не получил ответа, система повторила попытку, деньги списались дважды.

Лечится это ключом идемпотентности. К каждой попытке списания привязывают уникальный идентификатор операции, и провайдер по нему распознаёт повтор. Вторая попытка с тем же ключом возвращает результат первой и денег не трогает.

То же правило распространяется на приём уведомлений от провайдера. Уведомление об успешном платеже приходит несколько раз, и обработчик обязан быть готов к повтору: начисление по одному идентификатору выполняется единожды, сколько бы раз сообщение ни пришло.

Отдельно проектируют поведение при неопределённости. Ответа от провайдера нет, статус операции неизвестен, и система не должна ни считать платёж успешным, ни повторять его вслепую. Здесь нужен отдельный статус и сверка по расписанию — бэкенд для биллинга проектируют именно вокруг таких состояний.

Сверка достойна отдельной строки в плане работ. Раз в сутки система забирает у провайдера реестр операций за прошлый день и сопоставляет его со своими начислениями и платежами. Расхождения попадают в отдельный список, который разбирает человек.

Без такой сверки несходящиеся операции копятся молча и всплывают на закрытии квартала, когда восстановить картину уже дорого. Практика показывает обратную зависимость: чем раньше настроена ежедневная сверка, тем меньше времени бухгалтерия тратит на закрытие периода.

Двойное списание не выглядит аварией. Оно выглядит как обычный платёж, пока клиент не откроет выписку и не напишет об этом публично.

Платёж не прошёл: что дальше

Часть автосписаний не проходит никогда полностью. Карта истекла, лимит исчерпан, банк отклонил операцию — такие случаи есть всегда. Порядок действий на этот случай определяют заранее, иначе решение принимает служба поддержки в каждом случае по-своему.

Момент Что делает система Что видит клиент
День 0 Списание отклонено, попытка фиксируется Уведомление с причиной и ссылкой на смену карты
Дни 1–3 Повторные попытки по расписанию, обычно раз в сутки Напоминание перед последней попыткой
Дни 3–7 Льготный период: доступ сохраняется, начисления идут Предупреждение о дате отключения
После льготного периода Ограничение доступа с сохранением данных Понятное объяснение и способ оплатить
Через 30–90 дней Закрытие или архивирование учётной записи Уведомление заранее, до удаления данных

Льготный период почти всегда окупается. Отключить клиента в день неудачного списания технически проще, но часть таких клиентов платёжеспособна и просто не заметила проблему с картой.

Что происходит после неудачного списания: повторные попытки, льготный период, ограничение доступа, закрытие учётной записи

Пересчёт задним числом

Фраза «а можно пересчитать прошлый месяц» звучит невинно и стоит как отдельный модуль. Причины бывают вполне законные. Ошиблись в тарифе, согласовали клиенту скидку постфактум, нашли потерянные события.

Проблема в том, что документы за период уже выпущены, чеки пробиты, данные ушли в бухгалтерию. Пересчёт означает не изменение старой цифры, а выпуск корректирующего документа с новой.

Поэтому система с самого начала строится на неизменяемых записях. Начисление не редактируют — его сторнируют и создают новое, а история операций остаётся целиком. Такой подход дороже на старте и единственный, который переживает первую же налоговую проверку.

Практическое следствие для требований: спросить про пересчёты нужно до проектирования. Ответ «нам это не понадобится» на практике не сбывается почти никогда.

Соберём расчётное ядро

Тарифная модель, неизменяемая история начислений, счета и документы, интеграции с платёжным провайдером, кассой и учётной системой.

Обсудить проект

Тарифы меняются, клиенты остаются

Тарифная сетка живёт год-полтора, потом её пересматривают. Клиенты при этом остаются на прежних условиях — иногда по договору, иногда из соображений лояльности.

Через три пересмотра в системе одновременно работают четыре поколения тарифов. Без версионирования это выглядит как набор исключений в коде, и каждое новое изменение цены превращается в разработку.

Правильная модель простая. Тариф — версионируемая сущность с датами действия, подписка клиента ссылается на конкретную версию, а перевод на новую версию оформляется отдельной операцией с датой. Тогда ответ на вопрос, почему этот клиент платит 2400 при цене тарифа 3000, находится за десять секунд.

Такая же логика нужна промокодам и индивидуальным условиям. Условие живёт отдельным объектом с периодом действия и историей, и поле в карточке клиента его не заменяет.

Чек на каждое списание

Требование 54-ФЗ формулируется просто: при расчёте с физическим лицом нужен кассовый чек. Каждое автосписание считается отдельным расчётом, поэтому чек формируется на каждое, а не только при оформлении подписки.

Жёсткой формы наименования услуги закон не устанавливает. Требование одно — из чека должно быть понятно, за что заплатили. Формулировка вида «Доступ к сервису, 30 дней» работает, абстрактное «Оплата услуг» вызывает вопросы.

Техническая сторона сводится к связке биллинга с онлайн-кассой и к обработке отказов. Касса недоступна, чек не пробился, а деньги уже списаны — этот сценарий проектируют отдельно, с очередью на повторную отправку и контролем, что ни один расчёт не остался без чека.

Для юридических лиц действует другой порядок. Там выпускают счёт, акт и счёт-фактуру, фискальный чек им не нужен. Продукт, работающий с обоими типами клиентов, ведёт две ветки документов одновременно.

Что живёт вокруг биллинга

Половина требований, которые приносят биллингу, ему не принадлежит. Разграничение экономит месяцы разработки.

Расчётное ядро отвечает за тарифы, начисления, счета, платежи и баланс. Личный кабинет показывает клиенту его баланс, документы и историю. Учётная система принимает проводки и закрывает период. Аналитика считает выручку, отток и доход с клиента.

Работа с клиентом живёт в отдельном контуре. Индивидуальные условия, история переговоров, продления и апсейл ведут в CRM под процесс компании, а биллинг получает оттуда согласованные параметры сделки и превращает их в начисления.

Граница между кабинетом и биллингом обычно спорная. Практическое правило: расчёт и хранение сумм всегда на стороне биллинга, кабинет только отображает. Как только кабинет начинает считать сам, появляется второй источник истины и расхождения между тем, что видит клиент, и тем, что уходит в бухгалтерию.

Как только личный кабинет начинает считать суммы сам, у компании появляется второй источник истины. Расхождение после этого находит клиент.

Готовая платформа или своя разработка

Вариантов четыре, и комбинация встречается чаще одного чистого решения.

Вариант Когда выигрывает Чем платите
Учёт в таблицах Меньше сотни клиентов, один тариф, счета выставляют руками Растёт линейно с числом клиентов и упирается в человека
Модуль платёжного провайдера Простые подписки без пакетов и лимитов Логика ограничена возможностями провайдера, переезд болезненный
Готовая платформа биллинга Типовая модель тарификации, стандартные документы Подстройка процессов под чужую логику, зависимость от вендора
Своё расчётное ядро Нестандартная тарификация, свои правила округления и пересчёта Дороже на старте, дальше развивается по вашим требованиям

Условие выбора формулируется одним вопросом. Если тарифная модель совпадает с типовой и меняться не будет, готовая платформа выигрывает. Если тарификация и есть конкурентное преимущество продукта, её отдают в чужую систему только один раз — и потом переносят обратно.

Сколько стоит

Смету задают три параметра. Сложность тарифной модели, число внешних систем в контуре и требование пересчётов задним числом.

По нашим работам ориентиры такие. Расчётное ядро под процесс компании обходится от 1,7 млн ₽, бэкенд и веб-часть с личным кабинетом — от 1 млн ₽, отдельный личный кабинет с балансом и документами — от 800 тыс. ₽, интеграция с платёжным провайдером, кассой или учётной системой — от 150 тыс. до 1,5 млн ₽ за каждую. Точную цифру считаем по вашей тарифной модели: оценка проекта бесплатная.

Порядок бюджета можно прикинуть заранее — бесплатный калькулятор оценки собирает вилку по составу работ за несколько минут.

Посчитаем ваш биллинг

Расскажите про тарифы, расчётный период и системы, с которыми всё должно сходиться. В ответ пришлём состав работ, смету и срок по этапам.

Получить консультацию

Пять дорогих ошибок

Правила округления не описаны в требованиях. Каждый разработчик решает сам, и в трёх местах системы получаются три разные суммы.

Начисления редактируют на месте. История теряется, объяснить клиенту старый счёт невозможно, корректирующих документов нет.

Списание без ключа идемпотентности. Первый же сбой сети приводит к двойным списаниям и массовым возвратам.

Тариф зашит в код. Изменение цены становится релизом, а старые клиенты живут набором исключений.

Про сценарий неуспешного платежа вспоминают после запуска. Поддержка принимает решения вручную, и клиентов отключают по-разному.

С чего начать

Первое — описать тарифную модель словами, до любой разработки. Что считается единицей потребления, из чего складывается период, как ведут себя пакеты и лимиты, что происходит при переходе между тарифами в середине периода.

Второе — зафиксировать арифметику. База неполного периода, знак и сторона округления, порядок применения скидки и налога. Один документ на страницу снимает половину будущих расхождений с бухгалтерией.

Третье — составить список внешних систем контура: платёжный провайдер, касса, учётная система, кабинет клиента, аналитика. Этот список определяет и срок, и большую часть сметы.

С чего начать биллинг: описать тарифную модель, зафиксировать арифметику, составить список внешних систем

Обсудим ваш продукт?

Разберём тарифную модель, покажем места будущих расхождений и предложим порядок работ. Оценка бесплатная.

Обсудить проект

Часто задаваемые вопросы

Приём платежей — это одна операция: списать сумму через провайдера. Биллинг решает, какой должна быть эта сумма. Он собирает события потребления, применяет к ним тариф, пакет и скидку, считает период, формирует счёт, ведёт баланс лицевого счёта и обеспечивает документы. Платёжный модуль закрывает последний шаг цепочки, а всё, что до него, остаётся вашей задачей.

Если тарифная модель типовая — подписка с несколькими планами без сложных пакетов, — обычно можно, и это быстрее. Своя разработка оправдана там, где тарификация нестандартная: пакеты с переносом остатка, индивидуальные условия под каждого крупного клиента, свои правила округления, пересчёты задним числом. Ещё один аргумент — когда именно модель тарификации и отличает вас от конкурентов.

Период, попавший на смену ставки, делят на части и к каждой применяют свою ставку. Правило деления задаёт бухгалтерия, а система должна уметь его выполнить. Для этого ставка хранится параметром с датой действия. Отдельно решают, указана ли цена в тарифе с налогом или без — от этого зависит, чья сумма меняется при следующем пересмотре ставки.

Да. Каждое списание считается отдельным расчётом с физическим лицом, поэтому чек формируется на каждое из них. Из наименования в чеке должно быть понятно, за что заплатили. Для юридических лиц порядок другой: там счёт, акт и счёт-фактура вместо фискального чека.

Расчётное ядро с одной моделью тарификации, кабинетом и одним платёжным провайдером обычно укладывается в квартал. Гибридная тарификация с пакетами, лимитами, пересчётами и несколькими внешними системами занимает от полугода. Срок задаёт не количество экранов, а число правил в тарифной модели и число систем, с которыми надо сойтись до копейки.

Разработка с Code Pilots

Code Pilots — студия заказной разработки полного цикла: веб- и мобильные продукты со сложной бизнес-логикой, интеграциями и высокими нагрузками. В биллинге мы делаем расчётную часть целиком. Описываем тарифную модель вместе с вашей командой, собираем расчётное ядро с неизменяемой историей начислений, строим личный кабинет с балансом и документами, подключаем платёжных провайдеров, онлайн-кассу и учётную систему.

Границы проговариваем сразу. Процессинг, лицензируемую платёжную деятельность, бухгалтерское и налоговое сопровождение ведут другие участники. Наша часть — логика расчёта, данные под неё и обмены с системами, где эти деньги должны сойтись.

Внутри — аналитики с отраслевой экспертизой, дизайнеры, backend- и мобильные разработчики, QA и DevOps, middle+ и senior. Цену и срок фиксируем до старта. Пришлите описание тарифов и список систем, с которыми биллинг должен сходиться: по этим двум вещам уже видно объём работ. Обсудить проект →

Обсудим проект?

Заполните форму или напишите нам
на airmail@code-pilots.ru
Нажимая на кнопку, вы даете согласие на обработку персональных данных и соглашаетесь с политикой конфиденциальности.

Спасибо!

Спасибо за сообщение, мы свяжемся
с вами в ближайшее время!
success