Skip to Content

Метрики

Где в админке

  • Список и карточка метрики: /billable-metric/*.
  • Журнал событий: /metric-events/*.

Типы метрик (логика API)

ТипНазначение
Limit meteredЛимит потребления по подписке; при превышении новое событие может быть отклонено
Charge meteredУчёт usage; стоимость считается по тарифу на плане (фикс за единицу или ступени)
Charge recurringНачисления по метрике в логике цикла (в т.ч. особые режимы агрегации, например max per day)

Точные числовые константы типов в коде API — в пакете метрик бэкенда; в документации для интеграции важнее семантика и привязка к плану.

Создание метрики

  1. Создайте метрику в админке или через API (metricNew).
  2. Укажите имя, описание, тип агрегации (сумма, последнее значение, максимум и т.д. — в зависимости от доступных полей в UI).
  3. Для limit metered при необходимости задайте период сброса и группу лимитов (см. ниже).
  4. При необходимости задайте скрипт постобработки (см. Шаблоны и скрипты).

Limit metered: период сброса

Для метрик типа limit metered usage считается внутри окна сброса. Поле limitResetPeriod задаётся при создании/редактировании метрики (metricNew / metricEdit) или в карточке метрики в админке.

ЗначениеОкно
subscription_periodБиллинг-период подписки (по умолчанию, обратная совместимость)
hourКалендарный час (:00:59)
dayКалендарный день (00:0023:59)
weekКалендарная неделя (ISO, с понедельника)
calendar_monthКалендарный месяц

Границы часа, дня, недели и месяца — календарные, не скользящие. Timezone: user → merchant → UTC.

Metric Limit Grants (докупка пакетов, ручные гранты) работают только при limitResetPeriod = subscription_period.

В ответе userMetric для каждой limit-метрики в limitStats возвращаются limitResetPeriod, windowStart, windowEnd, windowResetsAt — чтобы продукт мог показать «осталось до сброса».

Limit group (несколько лимитов — один API-вызов)

Если нужны разные окна сброса одновременно (например, 1 000 в час, 10 000 в день, 100 000 в месяц), создайте несколько limit metered метрик с общим limitGroupCode:

ПолеНазначение
limitGroupCodeОбщий код группы (slug: [a-z0-9_], до 64 символов)
limitGroupRoleprimary — принимает события через API; member — только учёт лимита

Правила:

  • В группе ровно один primary; member-метрики не принимают metricNewEvent напрямую.
  • У всех метрик группы одинаковые aggregationType и aggregationProperty.
  • Лимит на плане задаётся отдельно для каждой метрики группы.
  • Продукт шлёт один metricNewEvent с metricCode primary-метрики; BillBill атомарно проверяет все лимиты группы.

В админке: режим None (отдельная метрика) или In group с выбором группы из dropdown (GET /merchant/metric/limit_group/list).

Пошаговый рецепт с grants и докупкой пакетов: Токены и докупка пакетов.

Привязка к плану

На карточке плана задайте:

  • лимиты — какая метрика и какой потолок;
  • metered charge — цена за единицу или ступенчатый тариф (graduated);
  • recurring charge — правила рекуррентного начисления по метрике.

Данные сериализуются в структуру плана (поле уровня metricCharge в модели плана).

Отправка событий с вашего бэкенда

Используйте Merchant API metricNewEvent (или эквивалент в вашей версии клиента):

  • идентификатор метрики;
  • пользователь и контекст подписки;
  • значение инкремента / свойства агрегации;
  • при необходимости внешний идемпотентный ключ события.

События попадают в журнал; накопленное значение участвует в расчёте счёта.

Ограничения

  • Для лимитных метрик соблюдайте лимит до отправки тяжёлых операций у себя, иначе API вернёт ошибку при превышении.
  • События на member-метрику в limit group отклоняются — используйте код primary.
  • Скользящие окна (rolling 24h) в текущей версии не поддерживаются; доступны только календарные периоды из таблицы выше.
  • Частота событий и пики нагрузки — согласуйте с лимитами облака (см. Ошибки и dunning).

Если вам нужны ограничения без отправки usage в BillBill (например, retention или feature flags), используйте Policy-квоты, а не metered-метрики.