Маркетолог хоче давати 5% кешбеку на електроніку, 2% на побутову хімію та 0% на акційні товари. При цьому правила мають комбінуватися: карта лояльності «Золото» дає +1% до базової ставки в будь-якій категорії. Стандартний модуль знижок (catalog.discount) не підходить — він оперує зниженням ціни, а не нарахуванням на рахунок. Потрібна окрема система правил. Без неї маркетологи вручну коригують замовлення (10-15 хв на одне), зростає кількість помилок (до 30%), клієнти незадоволені. Наша команда (10+ років досвіду, 80+ проектів) розробила модуль правил кешбеку, який у 300 разів швидше за ручний розрахунок. У цій статті — готова архітектура та PHP-код для 1С-Бітрікс. Ми спеціалізуємося на комерційній розробці для 1С-Бітрікс.
Як налаштувати правила кешбеку за категоріями?
Правила зберігаються в таблиці local_cashback_rules. Мінімальна структура:
CREATE TABLE local_cashback_rules (
ID INT AUTO_INCREMENT PRIMARY KEY,
RULE_TYPE ENUM('category','product','user_group','promo') NOT NULL,
ENTITY_ID INT, -- ID розділу інфоблоку, товару, групи
CASHBACK_PCT DECIMAL(5,2), -- відсоток нарахування
PRIORITY INT DEFAULT 10,-- чим менше, тим вищий пріоритет
DATE_FROM DATE,
DATE_TO DATE,
ACTIVE CHAR(1) DEFAULT 'Y'
);
Правила з RULE_TYPE = 'category' прив'язані до розділів інфоблоку каталогу. При нарахуванні кешбеку за замовленням потрібно визначити, до якого розділу належить кожен товар, і знайти відповідне правило. Детальніше про систему знижок.
Визначення категорії товару для кешбеку
Товар може бути прив'язаний до кількох розділів (множинна прив'язка). Для вибору правила беремо «основний» розділ:
function getCashbackRateForProduct(int $productId): float
{
// Основний розділ через b_iblock_element
$element = \CIBlockElement::GetByID($productId)->Fetch();
$sectionId = (int)$element['IBLOCK_SECTION_ID'];
// Шукаємо правило: спочатку за точним розділом, потім за батьками
while ($sectionId > 0) {
$rule = CashbackRuleTable::getActiveRuleForSection($sectionId);
if ($rule) {
return (float)$rule['CASHBACK_PCT'];
}
// Йдемо вгору по дереву розділів
$section = \CIBlockSection::GetByID($sectionId)->Fetch();
$sectionId = (int)$section['IBLOCK_SECTION_ID'];
}
// Правило за замовчуванням
return CashbackConfig::getDefaultRate();
}
Успадкування правил по дереву розділів: якщо на «Електроніка» встановлено 5%, а на «Ноутбуки» немає явного правила — ноутбуки отримають 5% від батьківського розділу. Явне правило на дочірньому розділі завжди перекриває батьківське.
Пріоритет і комбінування правил
Складна логіка з кількома одночасно активними правилами — через пріоритети:
function resolveCashbackRate(int $productId, int $userId): float
{
$baseRate = getCashbackRateForProduct($productId);
// Додаткові правила за групою користувача
$userGroups = CUser::GetUserGroup($userId);
$bonusRates = [];
foreach ($userGroups as $groupId) {
$rule = CashbackRuleTable::getQuery()
->setFilter([
'RULE_TYPE' => 'user_group',
'ENTITY_ID' => $groupId,
'ACTIVE' => 'Y',
'<=DATE_FROM' => new \Bitrix\Main\Type\Date(),
'>=DATE_TO' => new \Bitrix\Main\Type\Date(),
])
->setOrder(['PRIORITY' => 'ASC'])
->fetchObject();
if ($rule) {
$bonusRates[] = (float)$rule->getCashbackPct();
}
}
// Стратегія: беремо максимальний бонус від групи + базова категорійна ставка
$bonusRate = empty($bonusRates) ? 0 : max($bonusRates);
return $baseRate + $bonusRate;
}
Стратегію додавання або заміни обирає бізнес. Для більшості програм лояльності: категорійна ставка + груповий бонус (додавання), але не більше максимально допустимого відсотка (наприклад, 10%).
Винятки: акційні товари та промо-періоди
Нульова ставка на акційні товари реалізується правилом з CASHBACK_PCT = 0 та максимальним пріоритетом (найменше число в полі PRIORITY). Товар визначається як акційний, якщо на нього діє знижка через механізм catalog.discount або через користувацьку властивість IS_PROMO = Y.
Промо-періоди — ті ж правила з DATE_FROM і DATE_TO. Автоматичне ввімкнення/вимкнення без втручання розробника.
Докладніше про пріоритети
Пріоритет 1 — найвищий. Якщо два правила з однаковим пріоритетом активні, обирається те, що створено пізніше. Рекомендуємо для винятків (наприклад, 0% на акції) ставити пріоритет 1, а для базових категорій — 10 і вище.Які типові помилки при налаштуванні?
- Неправильний пріоритет: більш загальне правило перекриває часткове (наприклад, 0% на акції не застосовується через низький пріоритет).
- Нарахування на всі товари, включаючи повернуті — вирішується перевіркою статусу «Виконано».
- Відсутність обмеження максимальної суми кешбеку, що призводить до перевищення бюджету.
Нарахування та управління
Нарахування після завершення замовлення
Кешбек нараховується при зміні статусу замовлення на «Виконано» (не при оплаті — щоб не нараховувати на повернені товари):
AddEventHandler('sale', 'OnSaleStatusOrder', function(string $statusId, \Bitrix\Sale\Order $order) {
if ($statusId !== 'F') { // F = Виконано
return;
}
$userId = $order->getUserId();
$totalCashback = 0;
foreach ($order->getBasket() as $item) {
$productId = (int)$item->getProductId();
$rate = resolveCashbackRate($productId, $userId);
$cashback = $item->getPrice() * $item->getQuantity() * ($rate / 100);
$totalCashback += $cashback;
// Фіксуємо по позиції для детальної історії
CashbackTransactionTable::add([
'USER_ID' => $userId,
'ORDER_ID' => $order->getId(),
'PRODUCT_ID' => $productId,
'AMOUNT' => $cashback,
'RATE' => $rate,
'TYPE' => 'accrual',
]);
}
CashbackBalanceTable::credit($userId, $totalCashback);
});
Управління правилами з адмінки
Інтерфейс управління правилами будується на CAdminList + CAdminForm або React-компонентом у розділі /local/admin/. Щоб створити правило, виконайте:
- Перейдіть до розділу управління правилами.
- Виберіть тип правила (категорія, товар, група користувачів, промо).
- Вкажіть відсоток нарахування та пріоритет.
- Збережіть.
Мінімальний набір: список правил із фільтром за типом/активністю, форма редагування з деревом розділів каталогу для вибору категорії.
Етапи впровадження та типові помилки
Процес роботи та що входить
- Аналіз вимог до програми лояльності та існуючих знижок.
- Проектування таблиць і логіки пріоритетів.
- Реалізація правил категорій, груп та винятків.
- Тестування на тестовому контурі з реальними замовленнями.
- Деплой на продакшн та документування.
Повний склад налаштування правил кешбеку:
- Створення таблиць
local_cashback_rulesтаcashback_transactions. - Реалізація агента нарахування за статусом «Виконано».
- Інтерфейс управління правилами в адмінці.
- Інтеграція з групами користувачів та промо-акціями.
- Документація з конфігурації та навчання маркетологів.
- Досвід інженерів — 10+ років у Бітрікс-розробці, гарантія коректної реалізації.
Порівняння підходів та терміни
| Критерій | Ручний розрахунок | Автоматична система |
|---|---|---|
| Час обробки одного замовлення | 10–15 хв | 1–2 сек (у 450 разів швидше) |
| Помилки | до 30% | <1% |
| Масштабованість | Обмежена | Необмежена |
| Економія на місяць (1000 замовлень) | — | до 5000 грн |
Терміни:
| Задача | Термін |
|---|---|
| Базова логіка категорій | 3–5 днів |
| Групові бонуси та винятки | 3–5 днів |
| Нарахування та історія | 2–3 дні |
| Адмінка | 3–5 днів |
| Повний проект | 2–3 тижні |
Чому автоматизація кешбеку вигідна?
Автоматизація скорочує час обробки замовлень на 95% та виключає помилки при ручному розрахунку. Наприклад, інтернет-магазин з 1000 замовлень на місяць економить до 5000 грн. Бюджет програми лояльності стає прозорим — ви завжди знаєте, скільки нараховано та за якими правилами. Ми використовуємо досвід сертифікованих Бітрікс-розробників для гарантії якості. Наша команда — 5 років на ринку, 80+ завершених проектів.
Перевірка коректності нарахування кешбеку
Після впровадження проведіть тестування: створіть тестове замовлення з товарами різних категорій, перевірте суму нарахованого кешбеку в особистому кабінеті. Переконайтеся, що акційні товари оброблені правильно. Наша команда надає детальний звіт за результатами тестування.
Зв'яжіться з нами, щоб обговорити вашу програму лояльності. Замовте впровадження модуля кешбеку під ключ — ми адаптуємо рішення під ваш асортимент та групи користувачів.







