ЦЕНООБРАЗОВАНИЕ И НАЧИСЛЕНИЯ
Ступенчатая цена: считать весь объём или каждую ступень отдельно
Одинаковые границы и ставки могут дать разные счета. Проверьте, пересчитывается ли весь объём по новой цене, какие подразделения объединяются и как меняется результат после исправления количества.
Одинаковые ставки ещё не означают одинаковый счёт
В предложении указано: до 100 единиц по 10, далее по 8, после 200 по 6. Смысл слова «далее» нужно уточнить. Новая ставка может применяться ко всему объёму либо только к единицам внутри следующего диапазона. При одном и том же количестве итог получится разным.
Stripe называет эти модели volume-based и graduated. В первой весь объём оценивается по достигнутой ступени; во второй суммы отдельных диапазонов складываются. Stripe: tiered pricing. Ниже используются собственные учебные ставки, а не цены провайдера или SABSUS.
Сначала согласуйте модель и единицу. Она может означать единицу товара, пользователя, подтверждённую операцию или другое определённое количество. Одинаковое число 180 в разных единицах не позволяет сравнить предложения.
Учебные условия и границы ступеней
Все суммы условные, в одной валюте, без налогов, скидок, фиксированной платы и минимума. Количество q — целое неотрицательное число подтверждённых единиц одного вида за выбранный период. При нуле в этой базовой модели переменная сумма равна нулю.
Устанавливаем три диапазона:
- единицы с 1 по 100 включительно: ставка 10;
- с 101 по 200 включительно: ставка 8;
- начиная с 201: ставка 6.
Это одна таблица ставок для двух разных функций. Диапазон «101–200» содержит ровно 100 единиц. Количество 100 относится к первой ступени, 200 — ко второй. Не должно быть пропуска или двойного включения на границе.
У слова «период» тоже есть конкретный смысл. Для примера это один согласованный месячный интервал, а количество берётся из выбранного реестра подтверждённых единиц. Мы не предполагаем, что любой биллинг использует именно такой способ накопления: активные пользователи, пиковое количество и сумма событий могут быть разными базами.
Volume: одна ставка на весь объём
При q = 180 достигнута вторая ступень. Все 180 оцениваются по 8, итог равен 1 440. При q = 250 используется ставка 6 для всех единиц: 250 × 6 = 1 500.
В этой модели сто первая единица меняет ставку не только для себя. При 100 итог составляет 1 000, при 101 — 808. Увеличение количества на одну уменьшило общую сумму на 192. Аналогично 200 дают 1 600, а 201 — 1 206, то есть на 394 меньше.
Это следствие выбранной функции с данными ставками, а не ошибка сложения. Stripe отдельно отмечает, что общий итог volume pricing может уменьшаться при переходе ступени. Stripe: volume-based pricing.
Перед использованием проверьте такие скачки с коммерческим владельцем. Понятие «больше объём — ниже цена единицы» не отвечает на вопрос, допустимо ли резкое уменьшение всей суммы. Если предполагается плавное увеличение оплаты, нужно выбрать и проверить соответствующие условия, а не исправлять отдельные счета вручную.
Graduated: каждый диапазон считает свою часть
При q = 180 первые 100 стоят 1 000, следующие 80 — 640. Сумма равна 1 640. При q = 250 первые 100 дают 1 000, следующие 100 — 800, последние 50 — 300. Всего 2 100.
Удобная формула для неотрицательного целого q:
10 × min(q, 100) + 8 × min(max(q − 100, 0), 100) + 6 × max(q − 200, 0).
При переходе от 100 к 101 итог увеличивается с 1 000 до 1 008. От 200 к 201 — с 1 800 до 1 806. На этих границах прибавляется стоимость новой единицы; старые диапазоны не переоцениваются.
Для 250 средняя цена единицы равна 2 100 / 250 = 8,4. Она не равна последней ставке 6. Следующая единица в той же ступени добавит 6, но применять эти 6 ко всему уже набранному объёму нельзя: это незаметно переключит модель на volume.
Сравните одинаковые объёмы по обеим функциям
В контрольном наборе q = 99 обе модели дают 990; при 100 — 1 000. На 101 они расходятся: 808 против 1 008. Для 180 это 1 440 против 1 640; для 200 — 1 600 против 1 800; для 201 — 1 206 против 1 806; для 250 — 1 500 против 2 100.
Разница не является подтверждённой экономией для конкретного клиента, пока не проверены остальные условия: допустимая единица, период, состав услуги и обязательные платежи. Самая низкая сумма одной строки не доказывает выгодность полного предложения.
В API Stripe способ расчёта выделен в tiers_mode отдельно от самих ступеней. Stripe: Price object. Это полезный принцип требования к данным: хранить только границы и ставки недостаточно, нужна ещё версия функции, которая их использует.
Уровень объединения меняет сумму
Предположим, два подразделения одной организации использовали по 90 единиц. Если по условиям каждое считается отдельно, оба остаются на первой ступени: 900 + 900 = 1 800 в любой из двух моделей.
Если согласован общий объём организации 180, результат volume равен 1 440, graduated — 1 640. Сумма фактических единиц не изменилась; изменилось основание группировки. Экономический эффект нельзя приписывать снижению потребления.
Укажите ключ объединения: договор, организация, площадка, продукт, валюта и период. Не объединяйте разные юридические стороны, тарифы или месяцы только ради достижения меньшей ставки. Право на общий пул должно следовать действующим условиям.
При смене структуры клиента сохраняйте исторический ключ. Текущая принадлежность площадки к новой организации не должна пересчитывать прошлую ступень без подтверждённого основания и версии корректировки.
Коррекция количества не равна числу единиц по последней ставке
Рассмотрим независимую проверку до окончательного утверждения расчёта. В реестре было 180, но подтверждённая корректировка исключила 81 ошибочно включённую единицу. Правильное количество стало 99. Условия требуют заново оценить исправленный период по той же функции.
В volume прежний итог 1 440 меняется на 990; уменьшение составляет 450. Формула 81 × 8 = 648 неверна для такой переоценки: оставшиеся 99 теперь относятся к первой ступени со ставкой 10.
В graduated прежние 1 640 также меняются на 990; уменьшение равно 650. Его можно восстановить как 80 единиц второй ступени по 8 плюс одна первой по 10: 640 + 10 = 650. Вычитать 81 по последней ставке тоже нельзя.
Это учебное правило исправления ещё проверяемого расчёта. Для уже выставленного документа, возврата товара или позднего изменения периода порядок определяется условиями и разрешённым процессом. Не переписывайте прошлый счёт молча и не превращайте вычисленную разницу в подтверждённый денежный возврат.
Фиксированная плата и минимум требуют отдельных формул
Допустим, в другом варианте к переменной сумме добавляется одна фиксированная плата 150 за период. При десяти единицах переменная часть равна 100, итог — 250. Если вместо этого установлен минимальный итог 150, сумма равна max(150, 100) = 150. Это разные условия.
При нулевом объёме базовая переменная функция даёт ноль, но итог с фиксированной платой либо таким минимумом — 150. Нулевой счёт нельзя обещать только потому, что клиент ничего не использовал.
Отдельные реализации допускают фиксированные суммы внутри самих ступеней. Это ещё одна конструкция, которую нельзя приравнивать к одной общей месячной плате. В расчёте должны быть перечислены все применённые элементы, а не только красивое среднее «за единицу».
Данные и приёмочные проверки
Храните исходные события и их устойчивые идентификаторы, единицу, период, ключ объединения, подтверждённое количество, версию ступеней и способ расчёта. Для результата нужны количество и сумма каждого диапазона либо выбранная единая ставка, дополнительные платы, минимум и окончательный итог.
Повтор одного события не добавляет объём. Позднее событие получает проверяемую принадлежность периоду и статус корректировки. Если источник недоступен, количество остаётся неподтверждённым: его нельзя заменить нулём ради готового счёта.
- Границы 0, 99, 100, 101, 200 и 201 дают ожидаемые результаты.
- При 180 получаются 1 440 для volume и 1 640 для graduated.
- При 250 graduated даёт 2 100 и средние 8,4, а не 1 500 по последней ставке.
- Два отдельных объёма по 90 отличаются от согласованного общего 180.
- Исправление 180 до 99 даёт уменьшение 450 или 650 согласно модели.
- Фиксированные 150 отличаются от минимального итога 150.
- Повторный импорт, смена периода и новый тариф не переписывают историю без основания.
Для SABSUS обсудите требования через заказы, документы и финансы. Ступенчатое начисление, объединение объёма и пересчёт необходимо подтвердить в выбранной конфигурации. Оценка цены подписки помогает отдельно проверить состав полного предложения.
Частые вопросы
Ставка последней ступени применяется ко всему количеству?
В volume — по выбранной модели да. В graduated она применяется только к единицам соответствующего диапазона.
Почему больше единиц иногда даёт меньший итог?
При volume новая низкая ставка переоценивает весь объём. Проверяйте переходы до утверждения условий.
Можно объединить несколько точек ради общей ступени?
Только при соответствующем согласованном основании. Уровень агрегации является частью условий, а не технической мелочью отчёта.
Источники
- Stripe: tiered pricing — различие volume и graduated и возможность скачка общей суммы.
- Stripe: Price object — отдельное хранение способа расчёта и ступеней.
Источники проверены 9 октября 2026 года. Ставки и правила примеров вымышлены.