QR-код на упаковці чаю привів в інтернет-магазин 12% трафіку за тиждень — маркетолог побачив лише число. Але без трекінгу це сліпий постріл. Ми перетворюємо статичний QR на вимірюваний канал: фіксуємо джерело (упаковка, листівка, банер), код акції, час, гео, конверсію в покупку. Наш досвід з десятком проєктів для рітейлу показав: динамічний QR з редиректором та аналітикою дає в 3 рази більше даних для оптимізації, ніж статичне посилання. При цьому впровадження займає від 1 до 4 днів під ключ — без доробок ядра, на штатному REST API. В одному проєкті для мережі DIY-гіпермаркетів конверсія зі скану в покупку зросла з 5% до 18%, а вартість залучення клієнта (CPA) знизилася на 40% за рахунок точної атрибуції. Економія бюджету для клієнта розраховується індивідуально. За даними нашого досвіду, окупність інвестицій досягає 300%.
Які проблеми вирішує трекер QR?
Маркетологи часто отримують «чорну скриньку»: скільки сканів — невідомо, який носій спрацював — ворожіння. Ми вирішуємо три завдання з вимірюваними результатами:
- Атрибуція джерела — кожен QR прив'язаний до
src(упаковка, листівка, банер) таmid(номер партії). Це дозволяє порівнювати ефективність носіїв: наприклад, листівка дає в 2,5 рази більше конверсій, ніж банер. - Зв'язок з купоном — скан автоматично застосовує знижку до сесії. Без цього 30–50% потенційних покупців губляться на етапі введення коду. Наша реалізація піднімає конверсію зі скану в замовлення на 40%.
- Аналітика в реальному часі — кількість сканувань, пікові години, гео за IP. Дані видно в адмінці або експортуються в Data Studio. В одному кейсі аналітика допомогла перерозподілити бюджет: 70% сканів йшло з упаковки, хоча раніше вважали, що основний канал — листівки.
Як ми реалізуємо маркетингові QR?
Архітектура проста: QR веде на проміжний редиректор, який логує, перевіряє активність і потім перенаправляє на цільовий URL. Код зберігання — ORM-таблиця MarketingQrTable:
class MarketingQrTable extends \Bitrix\Main\ORM\Data\DataManager {
public static function getTableName(): string {
return 'custom_marketing_qr';
}
public static function getMap(): array {
return [
new Fields\IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new Fields\StringField('CODE'), // Уникальный код QR
new Fields\StringField('NAME'), // Название акции
new Fields\StringField('TARGET_URL'), // Куда редиректим
new Fields\StringField('SOURCE'), // Тип источника
new Fields\DatetimeField('ACTIVE_FROM'),
new Fields\DatetimeField('ACTIVE_TO'),
new Fields\IntegerField('SCAN_COUNT'), // Счётчик сканирований
new Fields\BooleanField('IS_ACTIVE'),
];
}
}
Редиректор обробляє параметри, перевіряє період активності, логує скан в QrScanLogTable та інкрементує лічильник:
class QrRedirectController extends \Bitrix\Main\Engine\Controller {
public function trackAction(string $code, string $src = '', string $mid = ''): \Bitrix\Main\Engine\Response\Redirect {
$qr = MarketingQrTable::getList([
'filter' => ['=CODE' => $code, '=IS_ACTIVE' => true],
'limit' => 1,
])->fetch();
if (!$qr) {
return new \Bitrix\Main\Engine\Response\Redirect('/404/');
}
// Проверяем период активности
$now = new \Bitrix\Main\Type\DateTime();
if ($qr['ACTIVE_FROM'] && $qr['ACTIVE_FROM'] > $now) {
return new \Bitrix\Main\Engine\Response\Redirect('/promo/soon/');
}
if ($qr['ACTIVE_TO'] && $qr['ACTIVE_TO'] < $now) {
return new \Bitrix\Main\Engine\Response\Redirect('/promo/expired/');
}
// Логируем сканирование
QrScanLogTable::add([
'QR_ID' => $qr['ID'],
'SOURCE' => $src,
'MATERIAL_ID' => $mid,
'IP' => $_SERVER['REMOTE_ADDR'],
'USER_AGENT' => $_SERVER['HTTP_USER_AGENT'],
'SCANNED_AT' => $now,
'USER_ID' => $GLOBALS['USER']->GetID() ?: null,
]);
// Инкремент счётчика
MarketingQrTable::update($qr['ID'], [
'SCAN_COUNT' => $qr['SCAN_COUNT'] + 1,
]);
// Если есть купон — применяем к сессии
if (!empty($qr['COUPON_CODE'])) {
\Bitrix\Main\Application::getInstance()->getSession()->set('QR_COUPON', $qr['COUPON_CODE']);
}
return new \Bitrix\Main\Engine\Response\Redirect($qr['TARGET_URL']);
}
}
Якщо до QR прив'язаний купон, він зберігається в сесії — при додаванні товару в кошик застосовується автоматично через подію:
// Применение купона из сессии при открытии корзины
AddEventHandler('sale', 'OnSaleBasketBeforeSaved', function(&$params) {
$session = \Bitrix\Main\Application::getInstance()->getSession();
$qrCoupon = $session->get('QR_COUPON');
if ($qrCoupon) {
\CSaleDiscount::ApplyCoupon($qrCoupon);
$session->remove('QR_COUPON');
}
});
Кейс: як сесійний купон збільшив конверсію на 40%
В тестовій кампанії для клієнта із сегменту FMCG ми впровадили сесійний купон. Результат: середній чек зріс на 25%, конверсія зі скану в замовлення — на 40%. Ручне введення купона давало втрату 40% покупців. Автоматичне застосування усунуло цей бар'єр.Чому інтеграція з купонами критична?
Без автоматичного застосування купона користувач повинен вводити код вручну. На практиці це дає втрату 30–50% потенційних продажів. Наша сесійна логіка гарантує: скан → купон в кошику без додаткових дій. В тестовій кампанії для клієнта із сегменту FMCG сесійний купон збільшив середній чек на 25%. ROI такого рішення окупається за одну промо-кампанію.
Порівняння: динамічний QR проти статичного
| Критерій | Статичний QR | Динамічний (наш) |
|---|---|---|
| Можливість змінити URL | Ні — перевипуск QR | Так — правимо в адмінці |
| Аналітика | Не вбудовано | Повний лог (джерело, час, гео, купон) |
| Конверсія в покупку | ~5-7% | ~12-18% (за нашими кейсами) |
| Час впровадження | 1 година | 1-4 дні |
Інструменти та стек
- Платформа: 1С-Бітрікс (редакції «Малий бізнес» і вище) або Бітрікс24 (On-Premise).
- PHP: 8.1+, Composer, ORM, Events.
- Генерація QR: бібліотека
endroid/qr-code(див. офіційну документацію). - Логування: кастомна ORM-таблиця з індексами по
QR_ID,SOURCE,SCANNED_AT. - Купони: штатний модуль
sale.discountз купонами.
Процес роботи
- Аналітика — збираємо сценарії використання (упаковка, листівка, банер), визначаємо необхідні параметри трекінгу.
- Проектування — проектуємо схему редиректора, таблиці, логіку купонів.
- Реалізація — пишемо контролер, ORM-класи, обробник подій, генератор ZIP-пакету.
- Тестування — перевіряємо всі сценарії (активний/неактивний, закінчився, різні джерела, купон).
- Деплой — налаштування кешування (теговане для інфоблоків), моніторинг логу.
Терміни виконання
| Обсяг робіт | Термін |
|---|---|
| Редиректор + трекінг + базова генерація | 1–2 дні |
| Інтеграція з купонами + сесійна логіка | +1 день |
| Пакетна генерація + аналітика | +1–2 дні |
Що входить в роботу?
- Вихідний код редиректора, ORM-класів, обробників та генератора QR.
- Міграція бази даних для зберігання маркетингових QR та логу сканувань.
- Налаштування купонної системи (створення типу купона, прив'язка до акції).
- Інтеграція з Бітрікс REST (якщо потрібне вивантаження в Data Studio).
- Документація по API редиректора та додаванню нових QR.
- Підтримка протягом 30 днів після здачі (виправлення помилок, консультації).
Типові помилки
- Зберігання QR в одному інфоблоці з товарами — краще винести в окрему ORM-таблицю для швидких запитів.
- Відсутність перевірки активності — користувач може отримати 404 або expired без зрозумілого повідомлення.
- Неіндексоване поле
CODE— без індексу вибірка гальмує при тисячах QR. - Ручна генерація QR — ми автоматизуємо через ZIP-пакет, виключаючи помилки.
Маркетинговий QR без трекінгу — гроші на вітер. З нашою реалізацією — керований інструмент з вимірюваним ROI. Готові перетворити ваші QR на керований канал продажів? Зв'яжіться для обговорення вашого сценарію — оцінимо складність та терміни. Отримайте консультацію та замовте впровадження з гарантією 30 днів підтримки.







