Налаштування тригера зниження ціни на переглянутий товар 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування тригера зниження ціни на переглянутий товар 1С-Бітрікс
Проста
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Налаштування тригера зниження ціни на переглянутий товар 1С-Бітрікс

Користувач переглянув товар кілька разів і не купив — явний сигнал зацікавленості. Автоматичне зниження ціни через 24–48 годин після перегляду або додавання персонального купона конвертує таких користувачів краще, ніж стандартні email-розсилки. У Bitrix це реалізується через модуль маркетингу та обробник подій.

Фіксація переглядів

Перегляди товару записуються до таблиці HL-блока. Стандартний модуль статистики (b_stat_page_event) не підходить — потрібен зв'язок конкретного користувача з конкретним товаром:

// /local/lib/Tracking/ProductViewTracker.php
namespace Local\Tracking;

class ProductViewTracker
{
    public static function track(int $userId, int $productId): void
    {
        if ($userId <= 0) return; // тільки авторизованих

        $conn = \Bitrix\Main\Application::getConnection();

        // Upsert: оновлюємо лічильник і дату останнього перегляду
        $conn->queryExecute("
            INSERT INTO b_uts_product_view
                (UF_USER_ID, UF_PRODUCT_ID, UF_VIEW_COUNT, UF_LAST_VIEW, UF_TRIGGER_SENT)
            VALUES
                ({$userId}, {$productId}, 1, NOW(), 'N')
            ON DUPLICATE KEY UPDATE
                UF_VIEW_COUNT = UF_VIEW_COUNT + 1,
                UF_LAST_VIEW  = NOW()
        ");
    }
}

Викликати в компоненті картки товару, у result_modifier.php:

// /local/templates/.default/components/bitrix/catalog.element/main/result_modifier.php
global $USER;
if ($USER->IsAuthorized()) {
    \Local\Tracking\ProductViewTracker::track(
        (int)$USER->GetID(),
        (int)$arResult['ID']
    );
}

Агент-тригер

Агент запускається раз на годину, шукає користувачів із відповідними умовами та застосовує знижку:

namespace Local\Marketing;

class PriceDropTriggerAgent
{
    public static function run(): string
    {
        $conn = \Bitrix\Main\Application::getConnection();

        // Товари, переглянуті 2+ рази, без покупки, 24+ годин тому
        $candidates = $conn->query("
            SELECT pv.UF_USER_ID, pv.UF_PRODUCT_ID, pv.UF_VIEW_COUNT
            FROM b_uts_product_view pv
            LEFT JOIN b_sale_basket sb
                ON sb.USER_ID = pv.UF_USER_ID
                AND sb.PRODUCT_ID = pv.UF_PRODUCT_ID
                AND sb.ORDER_ID IS NOT NULL
            WHERE pv.UF_VIEW_COUNT  >= 2
              AND pv.UF_LAST_VIEW   < DATE_SUB(NOW(), INTERVAL 24 HOUR)
              AND pv.UF_TRIGGER_SENT = 'N'
              AND sb.ID IS NULL
            LIMIT 50
        ");

        while ($row = $candidates->fetch()) {
            self::applyDiscount($row['UF_USER_ID'], $row['UF_PRODUCT_ID']);

            // Позначаємо, щоб не застосовувати повторно
            $conn->queryExecute("
                UPDATE b_uts_product_view
                SET UF_TRIGGER_SENT = 'Y'
                WHERE UF_USER_ID = {$row['UF_USER_ID']}
                  AND UF_PRODUCT_ID = {$row['UF_PRODUCT_ID']}
            ");
        }

        return '\Local\Marketing\PriceDropTriggerAgent::run();';
    }

    private static function applyDiscount(int $userId, int $productId): void
    {
        // Створюємо персональний купон через модуль маркетингу
        $couponCode = 'VIEW_' . strtoupper(substr(md5($userId . $productId . time()), 0, 8));

        \CCatalogDiscountCoupon::Add([
            'DISCOUNT_ID'    => VIEWED_PRODUCT_DISCOUNT_ID, // ID заздалегідь створеної знижки 10%
            'CODE'           => $couponCode,
            'ONE_TIME'       => 'Y', // одноразовий
            'ACTIVE'         => 'Y',
            'ACTIVE_FROM'    => new \Bitrix\Main\Type\DateTime(),
            'ACTIVE_TO'      => \Bitrix\Main\Type\DateTime::createFromTimestamp(time() + 86400 * 3),
            'MAX_USE'        => 1,
        ]);

        // Прив'язуємо купон до користувача через HL-блок
        PersonalCouponRepository::save($userId, $productId, $couponCode);

        // Email користувачу
        self::sendEmail($userId, $productId, $couponCode);
    }
}

Знижка через модуль маркетингу

Базова знижка створюється один раз через адміністративний інтерфейс (Маркетинг → Знижки) або через API:

\CCatalogDiscount::Add([
    'NAME'        => 'Персональна знижка на переглянутий товар',
    'LID'         => SITE_ID,
    'ACTIVE'      => 'Y',
    'VALUE'       => 10, // знижка 10%
    'VALUE_TYPE'  => 'P',
    'COUPON_TYPE' => 'U', // тільки з купоном
    'SORT'        => 300,
    'PRIORITY'    => 1,
]);

Ідентифікатор цієї знижки прописується в константу VIEWED_PRODUCT_DISCOUNT_ID.

Термін зберігання даних

Записи про перегляди очищаються агентом раз на тиждень: видаляємо записи старші за 30 днів із надісланим тригером. Таблиця не розростається до неприйнятних розмірів.

Конфігурація Термін
Трекінг + агент + email + купон 3–5 днів
+ аналітика конверсії тригера +2 дні