מעקב אחר קודי QR לקמפיינים שיווקיים ב-1C-Bitrix
קוד QR על אריזת תה הניע 12% מהתנועה לחנות מקוונת תוך שבוע—המשווק ראה רק את המספר. אבל ללא מעקב, זה ירייה עיוורת. אנו הופכים QR סטטי לערוץ מדיד: אנו לוכדים את המקור (אריזה, פלייר, באנר), קוד קופון, זמן, מיקום גיאוגרפי והמרה לרכישה. הניסיון שלנו עם תריסר פרויקטים קמעונאיים מראה: QR דינמי עם מפנה וניתוח נתונים נותן פי 3 יותר נתונים לאופטימיזציה מאשר קישור סטטי. והיישום אורך 1 עד 4 ימים במפתח מלא—ללא שינויי ליבה, באמצעות REST API הסטנדרטי. בפרויקט אחד לרשת חנויות עשה-זאת-בעצמך, ההמרה מסריקה לרכישה גדלה מ-5% ל-18%, ועלות הרכישה (CPA) ירדה ב-40% בזכות ייחוס מדויק. לפי הניסיון שלנו, ROI מגיע ל-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'), ]; } } המפנה מעבד פרמטרים, בודק תקופת פעילות, מתעד את הסריקה ב-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'), ]; } } ומגדיל את המונה:
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 סטטי
| קריטריון | QR סטטי | QR דינמי (שלנו) |
|---|---|---|
| יכולת לשנות URL | לא—יש להנפיק QR מחדש | כן—עריכה בלוח הניהול |
| ניתוח נתונים | לא מובנה | לוג מלא (מקור, זמן, מיקום, קופון) |
| המרה לרכישה | ~5-7% | ~12-18% (לפי המקרים שלנו) |
| זמן יישום | שעה | 1-4 ימים |
כלים וטכנולוגיות
- פלטפורמה: 1C-Bitrix (מהדורת "Small Business" ומעלה) או Bitrix24 (On-Premise).
- PHP: 8.1+, Composer, ORM, אירועים.
- יצירת QR: ספריית
QrScanLogTable(ראה תיעוד רשמי). - רישום: טבלת ORM מותאמת עם אינדקסים על
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']); } },// Применение купона из сессии при открытии корзины 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'); } });,endroid/qr-code. - קופונים: מודול
QR_IDמובנה עם קופונים.
תהליך עבודה
- ניתוח—איסוף תרחישי שימוש (אריזה, פלייר, באנר), קביעת פרמטרי מעקב נדרשים.
- עיצוב—עיצוב סכמת המפנה, טבלאות, לוגיקת קופונים.
- יישום—כתיבת הבקר, מחלקות ORM, מטפל אירועים, מחולל חבילות ZIP.
- בדיקות—אימות כל התרחישים (פעיל/לא פעיל, פג תוקף, מקורות שונים, קופון).
- פריסה—הגדרת מטמון (מטמון מתויג לבלוקי מידע), ניטור לוגים.
לוחות זמנים
| היקף עבודה | זמן |
|---|---|
| מפנה + מעקב + יצירה בסיסית | 1–2 ימים |
| שילוב קופונים + לוגיקת סשן | +יום אחד |
| יצירה בכמות + ניתוח נתונים | +1–2 ימים |
מה כלול?
- קוד מקור של המפנה, מחלקות ORM, מטפלים ומחולל QR.
- מיגרציית מסד נתונים לאחסון קודי QR שיווקיים ולוגי סריקה.
- הגדרת מערכת קופונים (יצירת סוג קופון, קישור למבצע).
- אינטגרציה עם Bitrix REST (אם נדרש ייצוא ל-Data Studio).
- תיעוד API למפנה ולהוספת קודי QR חדשים.
- תמיכה ל-30 יום לאחר המסירה (תיקוני באגים, ייעוץ).
טעויות נפוצות
- אחסון קודי QR באותו בלוק מידע כמו מוצרים—עדיף להשתמש בטבלת ORM נפרדת לשאילתות מהירות.
- חוסר בדיקת פעילות—המשתמש עלול לקבל 404 או פג תוקף ללא הודעה ברורה.
- שדה
SOURCEללא אינדקס—ללא אינדקס, שאילתות בחירה מואטות עם אלפי קודי QR. - יצירת QR ידנית—אנו הופכים זאת לאוטומטי באמצעות חבילת ZIP, ומבטלים שגיאות הקלדה.
קודי QR שיווקיים ללא מעקב הם כסף לרדת לטמיון. עם היישום שלנו, זה כלי ניתן לניהול עם ROI מדיד. מוכנים להפוך את קודי ה-QR שלכם לערוץ מכירות ניתן לניהול? צרו קשר כדי לדון בתרחיש שלכם—נעריך מורכבות ולוחות זמנים. קבלו ייעוץ והזמינו יישום עם אחריות תמיכה ל-30 יום.







