Перейти к содержанию

Создание и редактирование акции

Форма акции — основной инструмент маркетолога: в ней задаются механика и размер вознаграждения, тип события, приоритет, период действия, условия применения, ограничения и настройки начисляемых баллов. Форма открывается в режиме создания (кнопка «Создать акцию» в каталоге) или редактирования (строка каталога либо «Редактировать» на странице акции) и в обоих случаях сохраняет всё одним запросом к REST API.

Кто может работать с формой

Создание и изменение акций требуют роли LOYALTY_PROMOTION_WRITE, просмотр — LOYALTY_PROMOTION_READ. Запуск акции — отдельное право LOYALTY_PROMOTION_ACTIVATE: без него кнопка «Запустить» недоступна (см. «Жизненный цикл и арбитраж»). Поле «Метки» показывается только при праве LOYALTY_PROMOTION_LABEL_READ. Списки групп акций, типов событий и значений условий приходят из справочников формы и доступны с правом чтения акций. Для отдельных полей нужны права на чтение смежных справочников: теги клиента — LOYALTY_TAG_READ, метки в условии «Участие в акциях» — LOYALTY_PROMOTION_LABEL_READ, уровни — LOYALTY_TIER_READ, субсчета баллов и курс валюты баллов — LOYALTY_DICTIONARY_READ. Все вызовы проверяются на стороне сервиса.

Структура формы

Шапка. Заголовок повторяет название акции (у новой — «Новая акция»; обновляется, когда фокус уходит с поля «Название»). Под заголовком — «Код: PR-NNNNN» (у новой акции — «—», код присваивает сервер при первом сохранении), «Версия: N», статус акции и тег «В архиве» у архивной. Справа — индикатор «Заполнено» (доля заполненных обязательных элементов) и, у сохранённой акции, панель действий (см. «Действия в шапке»).

Вкладка Назначение
«Общие данные» Название, код, метки, группа акций, период проведения, приоритет, совмещение, описание
«Механика» Тип события, механика и её параметры, срок жизни и тип начисляемых баллов
«Условия» Кому и на какие покупки применяется акция — две зоны «Акция применяется, если» / «Не применяется, если»
«Ограничения» Четыре необязательных ограничения: бюджет, общий лимит, лимит участий на клиента, максимум баллов

Правая колонка (только чтение, править — на вкладках слева):

  • «Расход бюджета» — появляется, если на вкладке «Ограничения» включён бюджет и указана сумма: полоса расхода и пояснение «По линии версий акции, не по текущей версии». У новой акции расход нулевой.
  • «Превью акции» — чек-лист «Готово к запуску: N из 6» по строкам «Механика», «Период», «Условия», «Приоритет», «Совмещение», «Ограничения». Строки «Механика», «Период» и «Приоритет» подсвечены как обязательные, пока соответствующий элемент не заполнен: «не выбрана — обязательное поле» у механики (строка остаётся подсвеченной и при пустом обязательном параметре механики), «не задан — обязательное поле» у периода и приоритета. «Условия», «Совмещение» и «Ограничения» без значений показывают «все события акции», «совместимая — по умолчанию» и «нет».

Нижняя панель закреплена внизу формы: «Отмена» (возврат в каталог), подсказка «Заполните обязательные поля (N)», «Сохранить» и «К запуску →». Обе кнопки сохраняют акцию и открывают её страницу; сам запуск выполняется кнопкой «Запустить» (см. «Жизненный цикл и арбитраж»). «К запуску →» недоступна, если в условиях остались удалённые из справочника значения, — с пояснением «В условиях есть удалённые значения справочника — замените или уберите их.»

Вкладка «Общие данные»

Поле Обяз. Описание
Название да Отображаемое имя акции, до 255 символов. Уникально между акциями (без учёта регистра и пробелов по краям); версии одной акции делят одно имя. Занятое имя — ошибка под полем «Акция с таким названием уже существует»
Код — Присваивается сервером (PR-NNNNN), только чтение; рядом — кнопка «Скопировать код», доступная и в режиме чтения
Метки нет Метки из справочника «Метки акций». У новой акции уходят вместе с созданием; у сохранённой меняются сразу отдельной операцией в любом статусе — «Метки можно менять в любом статусе — они не влияют на начисления»
Группа акций нет Значение из справочника групп акций promotion-group (ведётся в «Справочниках»). Список берётся из справочников формы, отдельного права на справочники не нужно; в акции хранится код группы. Сохранённая группа, снятая с публикации, показывается с тегом «Значение в архиве» и новым акциям не предлагается
Период проведения да Дата и время начала и окончания в часовом поясе программы — под полем подсказка со смещением пояса, например «Часовой пояс: UTC+3». Без выбора времени подставляются 00:00 и 23:59 — весь выбранный день включительно. Конец не может быть раньше начала
Приоритет (меньше — выше) да Целое число от 1. Значения по умолчанию нет — приоритет задаётся осознанно: он решает, какая из пересекающихся акций сработает
Совмещение с другими акциями нет «Совмещается» (STACKABLE, по умолчанию) или «Только одна» (EXCLUSIVE)
Описание нет Цель акции для маркетолога («Опишите цель акции»). На начисления не влияет; пустое или из одних пробелов сохраняется как отсутствующее

Границы периода включительны

Акция применяется к событию, если момент события не раньше startsAt и не позже endsAt. Точное время позволяет, например, запустить акцию в 18:00 или закончить в полдень. Время, введённое в форме, трактуется в часовом поясе программы, а не браузера. Сервер отклоняет период, у которого конец не позже начала (422 promotion_period_invalid).

Изменение 26.3.0: приоритет обязателен

Раньше пустой приоритет заменялся значением 100, и все такие акции оказывались равноправными. Теперь форма без приоритета не сохраняется, а POST и PUT /v1/promotions без поля priority отвечают 400 validation_failed. Сохранённые ранее акции не меняются.

Вкладка «Механика»

Поле Обяз. Описание
Тип события да Значение справочника типов событий event-type; у новой акции — «Покупка». Сохранённый тип, снятый с публикации, остаётся в поле с тегом «Значение в архиве»
Тип вознаграждения (механика) да Механика из справочника механик («Что получит клиент»). Предлагаются только механики с заведёнными параметрами. Смена механики очищает введённые параметры
Срок жизни начисляемых баллов нет Сколько дней живут баллы, начисленные акцией: целое от 1 до 36 500 («Срок жизни — целое число дней от 1 до 36 500»). Пустое поле — баллы сгорают по общим правилам; серым в поле показан действующий срок
Тип начисляемых баллов нет Субсчёт, в который акция начисляет баллы. По умолчанию — «Акционные баллы»; в списке — активные субсчета справочника (код субсчёта общий для всех валют). Начисление идёт в субсчёт с выбранным кодом в валюте баллов программы. Сохранённый субсчёт, который больше не принимает начисления, показывается с тегом «Значение в архиве»
Параметры механики зависит от механики Поля, описанные у выбранной механики, — блок «Параметры механики — ‹механика›» (или несколько блоков по группам параметров)

Тип события. Сейчас движок исполняет только событие покупки, поэтому в поставке справочник содержит один тип — «Покупка». Тип события и механика друг от друга не зависят: выбор одного не ограничивает другое. Код вне справочника или неопубликованная запись отклоняются 422 promotion_event_type_invalid — ошибка показывается у поля «Тип события».

Настройки начисляемых баллов. Поля «Срок жизни начисляемых баллов» и «Тип начисляемых баллов» появляются после выбора механики. У механики, которая баллы не начисляет (например, «1+1=3» — она выдаёт единицы товара), оба поля недоступны с подсказкой «Эта механика баллы не начисляет — настройки баллов к ней не применяются».

  • Пустой срок означает «как в программе»: срок партии определяется при начислении по цепочке — срок выбранного субсчёта, затем срок уровня клиента, затем базовый срок валюты баллов. Внутри пустого поля серым показан действующий срок: «Срок субсчёта: 30 дней», «Срок субсчёта: до ДД.ММ.ГГГГ», «Общий срок: 365 дней», «Общий срок: зависит от уровня клиента» или «Общий срок: не сгорают». Подробнее о сроках — «Сгорание баллов».
  • Заданный срок закрепляет срок за баллами этой акции независимо от субсчёта и уровня.
  • Субсчёт должен существовать в валюте баллов программы и принимать начисления, иначе 422 promotion_points_subaccount_invalid («Этот тип баллов недоступен — выберите другой»). Субсчёт «Акционные баллы» предлагается всегда, даже если его ещё нет. Субсчета описаны в разделе «Субсчета баллов».

Параметры механики. Форма показывает только параметры, описанные у механики в справочнике: числовые (процент, деньги, целое, дробное — с единицей и границами), переключатели, списки, поля категорий, артикулов и сегментов. Значения по умолчанию из справочника подставляются в поля. Награда задаётся одним из параметров — отдельного поля «значение вознаграждения» нет. Обязательный параметр без значения не даёт сохранить форму («{название} — обязательно»). Денежные параметры вводятся в рублях (баллы — в баллах) и уходят на сервер в минорных единицах.

  • «1+1=3» настраивается фразой: «За покупку [N] шт товара клиент дополнительно получает ещё [M] шт по стоимости [1] ₽ за штуку». Какой именно товар участвует, задаётся на вкладке «Условия».
  • У существующей акции на механике без параметров вместо блока параметров — плашка «Настройки этой механики ещё не заведены — акцию на ней пока не собрать. Обратитесь к администратору».

Подробности расчёта по каждой механике — в разделе «Механики начисления».

Вкладка «Условия»

Вкладка разделена на две зоны: «Акция применяется, если» и «Не применяется, если»; каждую можно свернуть заголовком. Каждый критерий включается чекбоксом; выключенный критерий не ограничивает (серый текст «все категории», «все товары», «все клиенты», «не учитывается» и т. п.).

Зона Критерии
Обе зоны «Категории товаров», «Артикулы (SKU)», «Регион», «Город», «Магазин», «Мерчант», «Канал продаж», «Сегменты клиентов», «Участие в акциях», «Теги клиента», «Сумма чека»
Только «Акция применяется, если» «Статус клиента», «Уровень клиента», «Баланс баллов»

Какие строки показывать и в каком порядке, задаёт администратор на экране «Администрирование → Настройка акции» (коробочные критерии там можно только скрыть и переставить); там же заводятся дополнительные условия со своими подписями и подсказками — они показываются в зонах после коробочных под заголовком «Дополнительные условия». Условие, которое скрыли в настройке, в существующей акции остаётся серой строкой с тегом «Скрыто в настройке» и продолжает действовать.

Значения перечней выбираются из справочников с поиском на сервере; длинный список сворачивается в чипсу «+N», его можно скопировать («Скопировать список») или очистить («Очистить список»), а вставленный через «;» список проверяется по справочнику. «Сумма чека» задаётся в рублях с копейками; диапазоны двух зон не должны пересекаться.

Правила критериев, работу с удалёнными значениями и то, как условия проверяются при покупке, описывает раздел «Условия акции».

Вкладка «Ограничения»

Четыре ограничения фиксированным списком, сгруппированные по тому, на что смотрит счётчик: «На всю акцию» (бюджет, общий лимит участий), «На одного клиента» (лимит участий) и «На одно начисление» (максимум баллов). Каждое ограничение — фраза с чекбоксом, например «Акция может раздать не более [N] ₽». Значения снятого чекбокса остаются в форме, но на сервер не уходят. Подробно — в разделе «Ограничения и лимиты акции».

Проверки при сохранении

Форма считает обязательными четыре элемента: название, механику вместе с её обязательными параметрами, период (обе границы) и приоритет; пока они не заполнены, кнопки сохранения недоступны. Кроме того, форма проверяет значения включённых ограничений и критериев условий. Если проверка не прошла, акция не сохраняется: форма открывает вкладку с первой ошибкой и показывает сообщение «Акция не сохранена: проверьте выделенные поля».

Сервер проверяет запрос независимо от интерфейса:

Проверка Код ошибки
Нет name, mechanicCode, startsAt, endsAt или priority; срок жизни баллов вне 1–36 500; условие уровня прежним ключом params.conditions.client.level или элемент levels не вида {configId: число, code} 400 validation_failed
Механика не найдена в справочнике 404 mechanic_not_found_in_promotion
Конец периода не позже начала 422 promotion_period_invalid
Не задан обязательный параметр механики (например, процент у «Кэшбэка»), в том числе при пустом или отсутствующем params 422 promotion_param_required
Числовой параметр — не число / меньше минимума / больше максимума 422 promotion_param_type / promotion_param_min / promotion_param_max
Тип события вне справочника или не опубликован 422 promotion_event_type_invalid
Срок жизни, тип баллов или область списания у механики, которая баллы не начисляет 422 promotion_points_settings_not_applicable
Субсчёта нет в валюте баллов программы или он не принимает начисления 422 promotion_points_subaccount_invalid
Пустое или повторённое значение области списания, больше 1000 значений 422 promotion_redemption_scope_invalid
Название занято другой акцией 409 promotion_name_taken
Ошибка в ограничениях 422 invalid_budget, invalid_max_bonus, invalid_max_count, invalid_period, invalid_participation_window, invalid_total_limit — см. «Ограничения и лимиты»
Бюджет задан, а курс валюты баллов нулевой или выражен не в базовой валюте 422 currency_zero_rate / 422 currency_rate_currency_invalid
Ошибка в условиях criteria (незнакомое условие, пустые значения, неверный диапазон, пересечение зон, значение не найдено) 422 promotion_criterion_* — см. «Условия акции»
Уровень в условии «Уровень клиента» не найден в указанной конфигурации 422 promotion_level_unknown
Ошибка в условиях аудитории 422 promotion_audience_invalid — см. «Условия акции»
Удалённая метка при создании 422 unknown_label
Метки в запросе правки 400 promotion_labels_not_accepted
Акцию уже нельзя править на месте 409 promotion_not_editable

«Кэшбэк» без процента больше не сохраняется

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

Ошибки полей подсвечиваются у поля на своей вкладке (ограничения — на «Ограничениях», условия — на «Условиях», тип события и настройки баллов — на «Механике»), и форма переключается на эту вкладку. Ошибки без своего поля показываются сообщением в шапке формы: promotion_not_editable — «Акция уже запущена или применялась — изменить её нельзя. Создайте новую версию акции.», отказ проверки тела (validation_failed) — «Проверьте заполнение полей».

Сохранение

Действие Метод и путь Право
Создать акцию (черновик) POST /v1/promotions LOYALTY_PROMOTION_WRITE
Изменить акцию PUT /v1/promotions/{id} LOYALTY_PROMOTION_WRITE
Получить акцию GET /v1/promotions/{id} LOYALTY_PROMOTION_READ

Пример тела запроса на создание:

{
  "mechanicCode": "CASHBACK",
  "name": "Весенний кешбэк на кофе",
  "group": "SEASONAL",
  "eventType": "PURCHASE",
  "description": "Рост частоты покупок кофе у лояльных клиентов",
  "startsAt": "2026-10-01T00:00:00+03:00",
  "endsAt": "2026-10-31T23:59:59+03:00",
  "params": {
    "cashbackPercent": 5,
    "conditions": { "client": { "status": "ACTIVE", "levels": [{ "configId": 1, "code": "GOLD" }] } }
  },
  "pointsLifetimeDays": 90,
  "pointsSubaccountCode": "PROMO",
  "priority": 50,
  "stacking": "STACKABLE",
  "maxBonusMinor": 50000,
  "budgetMinor": 10000000,
  "participationLimit": { "maxCount": 1, "period": "DAY", "periodAmount": 1, "periodMode": "CALENDAR" },
  "totalLimit": 10000,
  "criteria": [
    { "code": "product-category", "mode": "INCLUDE", "values": ["coffee"] },
    { "code": "check-amount", "mode": "INCLUDE", "range": { "fromMinor": 30000 } }
  ],
  "audience": {
    "include": { "customerTags": { "match": "ANY", "tagIds": [101] }, "participation": [] },
    "exclude": { "customerTags": null, "participation": [] }
  },
  "labelIds": [7]
}
Поле Назначение
mechanicCode, name, startsAt, endsAt, priority Обязательные поля
eventType Тип события — код опубликованной записи справочника event-type. При создании без поля — PURCHASE. Движок поле пока не читает: акция применяется к событиям покупки
params Значения параметров механики (награда — один из них) и conditions.client — условия по клиенту: статус, уровни levels (пары {configId, code}: код уровня уникален только внутри конфигурации программы), баланс
value Для механик с параметром-наградой не используется: ставку сервер выводит из params (cashbackPercent, pointsPerUnit, multiplier, giftMinor). Форма передаёт поле пустым (null)
criteria Условия акции списком записей {code, mode, values}; сумма чека — {"code": "check-amount", mode, range} в минорных единицах; у дополнительных условий — ещё method. Прежние scope и params.minCheckMinor/maxCheckMinor условий не задают
group, description Группа и описание, необязательные
stacking STACKABLE (по умолчанию) или EXCLUSIVE
pointsLifetimeDays, pointsSubaccountCode Срок жизни (1–36 500 дней) и субсчёт начисляемых баллов. Без субсчёта у механики, начисляющей баллы, сохраняется PROMO («Акционные баллы»)
pointsRedemptionScope Область списания баллов акции — список {kind, value}, kind: PRODUCT, CATEGORY, MERCHANT, STORE; пусто — без ограничений. Сервер хранит её и записывает на партию баллов при начислении, но при списании пока не проверяет. В форме поля нет
maxBonusMinor, budgetMinor, participationLimit, totalLimit Ограничения — см. «Ограничения и лимиты»
audience Условия аудитории (теги клиента и участие в акциях) — см. «Условия акции»
labelIds / labels Метки первой версии — только при создании: существующие по id (так передаёт форма) или значениями (так передают интеграции; недостающие заводятся при праве LOYALTY_PROMOTION_LABEL_WRITE)

Изменение 26.3.0: тело акции — полная замена

POST и PUT принимают акцию целиком. Отсутствующее ограничение означает «ограничения нет»: без budgetMinor, maxBonusMinor, totalLimit или participationLimit сохранение снимает соответствующее ограничение; то же относится к pointsLifetimeDays, pointsSubaccountCode и pointsRedemptionScope. Интеграция, которая читает акцию и отправляет её обратно, не зная о новых полях, затрёт их. Исключения:

  • criteria и audience, отсутствующие или null в PUT, условия не трогают; очистить условия — передать пустой список criteria: [] и пустые зоны include и exclude. Форма всегда передаёт оба поля;
  • eventType, отсутствующий в PUT, сохранённый тип события не меняет;
  • params.conditions.client без ключа levels сохранённый список уровней не стирает; снять его — явным levels: [];
  • метки в PUT не принимаются (400 promotion_labels_not_accepted) — у сохранённой акции они меняются операциями POST /v1/promotions/bulk-label-assign и bulk-label-remove.

Форма не передаёт pointsRedemptionScope: сохранение акции из интерфейса снимает область списания, заданную через API.

Ответ по одной акции, кроме полей запроса, содержит id, code, status, archived, rootId, revision, авторов createdBy/updatedBy, labels, статистику applications и bonusMinor (по этой версии), расход бюджета budgetSpentMinor, счётчики участий totalUsed (по линии версий) и versionUsed (по этой версии), признак editable, статус согласования approvalStatus и согласующих approvers, признак boundToConfig (акция входит в программу лояльности), условия criteria (у записи — подпись label и признак hiddenInRegistry) и audience со ссылками вида {id, value, resolved}. После сохранения интерфейс открывает страницу акции.

sequenceDiagram
    participant U as Маркетолог
    participant UI as «Акции»
    participant API as Loyalty
    U->>UI: Заполняет форму и нажимает «Сохранить» или «К запуску →»
    UI->>UI: Проверка обязательных полей, ограничений и условий
    UI->>API: POST /v1/promotions (или PUT /v1/promotions/{id})
    API->>API: Проверка механики, периода, параметров, типа события, настроек баллов, ограничений, условий
    API-->>UI: 201 Created / 200 OK (акция)
    UI->>U: Страница акции

Редактирование и версии

Правка на месте зависит не только от статуса, но и от того, применялась ли акция. Готовое решение сервер отдаёт в поле editable, и интерфейс по нему открывает форму для правки или только для чтения — с плашкой по состоянию акции:

Состояние Правка на месте Плашка режима чтения
Черновик, Запланирована да (в том числе черновик новой версии) —
Пауза без применений этой версии да —
Пауза с применениями, Активна нет «Запущенная акция не редактируется. Чтобы изменить правила, создайте новую версию.»
Завершена нет «Завершённая акция не редактируется. Чтобы повторить её, сохраните копию.»
Любой статус в архиве нет «Акция в архиве и не редактируется.»

В режиме чтения по-прежнему доступны копирование кода, поле «Метки» и панель действий в шапке (например, «Создать новую версию» у активной акции). Каталог открывает нередактируемую акцию сразу на странице акции, а не в форме.

Изменение 26.3.0: применявшаяся пауза не правится

Раньше PUT /v1/promotions/{id} пропускал любую акцию на паузе. Теперь пауза с хотя бы одним применением отклоняется 409 promotion_not_editable; то же правило действует для отдельного ресурса PUT/DELETE /v1/promotions/{id}/participation-limit.

Если в инсталляции включено согласование запуска, содержательная правка возвращает согласование в статус «В работе», а запланированную акцию — в черновик (см. «Согласование запуска»).

Чтобы изменить работающую или применявшуюся акцию, создаётся новая версия — кнопка «Создать новую версию» в шапке формы или «Новая версия» на странице акции (POST /v1/promotions/{id}/revise, для статусов «Активна» и «Пауза» вне архива). В шапке формы действие подтверждается окном «Создать новую версию акции?» с номером будущей версии и кнопкой «Создать версию»; на странице акции версия создаётся сразу. В обоих случаях новая версия открывается в форме. Новая версия — черновик в той же линии версий (rootId); она получает параметры, тип события, настройки баллов, лимит участий, условия и метки исходной версии, а согласование начинается заново. Текущая версия продолжает действовать до запуска новой. Ранее выполненные начисления не пересчитываются, а израсходованный бюджет и участия считаются по всей линии. Завершённая акция новую версию не получает (409 promotion_not_revisable) — повторить её можно копией. Статусы и переходы описаны в разделе «Жизненный цикл и арбитраж».

Сохранить как

Кнопка «Сохранить как…» в шапке формы («Сохранить как» на странице акции) создаёт независимую копию — новый черновик с новым кодом и отдельной линией версий («Сохранить как — копия акции»). По умолчанию имя — «‹название› (копия)»; имя копии тоже должно быть свободным. Копия переносит параметры, тип события, настройки баллов, описание, ограничения, условия и условия аудитории, но не метки и не статистику: счётчики бюджета и участий у неё свои. Условие, скрытое в настройке акции, в копию не переносится — после копирования по каждому такому условию выводится предупреждение «Условие «‹название›» скрыто в настройке акции и не перенесено в копию». Копия открывается в форме.

Копия против новой версии

Новая версия продолжает жизненный цикл существующей акции (общий rootId, общие счётчики), а «Сохранить как» порождает отдельную акцию без связи с оригиналом.

Действия в шапке

У сохранённой акции в шапке формы — панель действий. Она видна только при праве LOYALTY_PROMOTION_WRITE; каждое действие подтверждается своим окном.

Кнопка Когда показывается Окно подтверждения
«Создать новую версию» Активна, Пауза (вне архива) «Создать новую версию акции?» → «Создать версию»
«Запустить» Черновик (при включённом согласовании — только согласованный), Пауза; без права LOYALTY_PROMOTION_ACTIVATE кнопка недоступна «Запуск акции» → «Да, запустить»
«Отменить запуск» Запланирована «Отмена запуска акции» → «Да, отменить запуск»
«Приостановить» Активна «Приостановка акции» → «Да, приостановить»
«Сохранить как…» всегда «Сохранить как — копия акции» → «Сохранить»
«Архивировать» / «Разархивировать» вне архива / в архиве «Архивирование акции» / «Возврат из архива»
«Удалить» Черновик, Запланирована «Удаление акции» → «Да, удалить» (с пометкой «Действие необратимо»)

Если у акции есть дополнительные условия, чья переменная за последние 7 дней не приходила в покупках, окно запуска предупреждает: «Переменная «‹переменная›» за последние 7 дней не приходила в покупках — условие «‹условие›» может не сработать». Это предупреждение, а не запрет.

Удаление акции, которая входит в программу лояльности, недоступно с пояснением «Акция входит в программу лояльности. Снимите привязку в настройках программы, затем удалите».

Страница акции

Страница акции показывает её в режиме просмотра: ID и код (с копированием), «Тип» — код группы акций (без подписи из справочника), метки (их можно менять здесь же), дату создания, механику, период с точным временем, параметры механики с подписями и единицами из справочника, приоритет, совмещение, «Максимальное количество баллов», «Бюджет, ₽», условия строками по критериям (в порядке настройки акции) и номер версии с группой версий.

  • Бюджет. Если бюджет задан, под суммой — полоса расхода «Израсходовано N из M ₽». От 80 % полоса предупреждающая, при полном расходе — «Бюджет исчерпан: израсходовано N из M ₽».
  • Условия. Каждое условие — строка с критерием и значениями; значения зоны «Не применяется, если» — после «кроме:». Удалённые значения — красными чипсами. Если условий нет — «Без ограничений».
  • Согласование. Если в инсталляции включено согласование запуска, рядом со статусом акции — статус согласования, а страница делится на вкладки «Общие данные» и «Согласование» (см. «Согласование запуска»).
  • Действия: «Редактировать» (если акция правится на месте), «Запустить» (при праве запуска — для черновика, при включённом согласовании только согласованного, и для паузы; недоступна при удалённых значениях в условиях), «Приостановить», «Новая версия», «Сохранить как», «Архивировать». «Запустить», «Приостановить», «Новая версия» и «Архивировать» здесь выполняются сразу, без окна подтверждения; «Отменить запуск», «Разархивировать» и «Удалить» доступны в шапке формы и в каталоге.

Идемпотентность

Создание и изменение акции — операции над конфигурацией, а не денежные проводки. Заголовок Idempotency-Key, обязательный для начислений и списаний, к ним не применяется: повторный POST создаёт отдельный черновик (или получает 409 promotion_name_taken из-за занятого имени), а изменения вносятся адресно по id через PUT.

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