כאשר הושק קמפיין דוא"ל המוני, דף הנחיתה באתר בונה אתרים קרס — השרת לא יכול היה להתמודד עם 5,000 מבקרים בו-זמנית. אתר פרומו על 1C-Bitrix עם מטמון nginx FastCGI ובלוקי מידע מתמודד עם עומסים כאלה מבלי לאבד המרות. CMS מותאם אישית נותן שליטה מלאה: מהעיצוב ועד אינטגרציית CRM. מקרה קונקרטי אחד: עבור לקוח בתחום התקשורת, בנינו דף פרומו שמשך 12,000 לידים ב-3 ימים — העלות הממוצעת לליד ירדה ב-30%. אנשי השיווק חסכו 40% מהתקציב על ידי ביטול שירותי אנליטיקה חיצוניים.
מבחינה טכנית, אתר פרומו על Bitrix הוא אתר חד-עמוד עם סעיפים, טפסי לכידת לידים, ואינטגרציה עם Bitrix24 דרך REST API. אנו משתמשים בבלוק מידע v2.0 לתוכן, בלוקים בעלי עומס גבוה לסטטיסטיקת בדיקות A/B, ומטמון מתויג למהירות. גישה זו מהירה פי 5 מדף נחיתה טיפוסי על בונה אתרים בעומסי שיא.
מתי להשתמש בפרומו על Bitrix במקום בונה אתרים
- האתר הראשי כבר על Bitrix — הפרומו ממוקם בתת-דומיין או בתיקייה, תוך שימוש באותו תבנית ומטמון. האינטגרציה אורכת שעתיים.
- נדרש CRM ללא מתווכים — טפסים יוצרים לידים ב-Bitrix24 מיד דרך ה-API, תוך לכידת תגי UTM.
- הפרומו ישמש שוב ושוב (קמפיינים, אירועים) — התוכן משתנה דרך פאנל הניהול ללא מפתח.
- נדרשת בדיקת A/B עם כלים מובנים — אין צורך בשירותים חיצוניים.
ארכיטקטורת אתר פרומו
שתי גישות:
-
תבנית נפרדת באתר הראשי. צור תבנית
/local/templates/promo_EVENTNAME/— מעטפת מינימלית ללא ניווט. הדף/promo/event-name/index.phpמתחבר אליה דרך$APPLICATION->SetTemplate(). -
אתר נפרד בהגדרת ריבוי אתרים. אם הפרומו נמצא בתת-דומיין
promo.example.ru— צור אתר חדש בפאנל הניהול (Настройки → Сайты → Список сайтов). תבנית משלו, הגדרות ואירועי דוא"ל משלו.
סעיפים הניתנים לעריכה דרך בלוק מידע
כדי לאפשר לאנשי שיווק לשנות תוכן, אנו מציבים בלוקים דרך בלוק המידע promo_sections.
מאפייני אלמנט: סוג סעיף (hero, features, testimonials, cta, faq), רקע, טקסט CTA. בתבנית, החלף על SECTION_TYPE:
$sections = \CIBlockElement::GetList( ['SORT' => 'ASC'], ['IBLOCK_ID' => PROMO_SECTIONS_IBLOCK_ID, 'ACTIVE' => 'Y', 'PROPERTY_PROMO_ID' => $promoId], false, false, ['ID', 'NAME', 'CODE', 'DETAIL_TEXT', 'PROPERTY_SECTION_TYPE', 'PROPERTY_BG_IMAGE', 'PROPERTY_CTA_TEXT', 'PROPERTY_CTA_URL'] ); while ($section = $sections->GetNext()) { $sectionType = $section['PROPERTY_SECTION_TYPE_VALUE']; $sectionFile = __DIR__ . '/sections/' . $sectionType . '.php'; if (file_exists($sectionFile)) { include $sectionFile; } } טפסי לכידת לידים
באתר הפרומו, ישנן מספר נקודות המרה: טופס hero, טופס תחתון, חלון קופץ ליציאה. כולם שולחים בקשות למטפל אחד:
\Bitrix\Main\Loader::includeModule('crm'); $promoId = htmlspecialchars($_POST['promo_id'] ?? ''); $name = htmlspecialchars(trim($_POST['name'] ?? '')); $phone = htmlspecialchars(trim($_POST['phone'] ?? '')); $email = htmlspecialchars(trim($_POST['email'] ?? '')); $source = htmlspecialchars($_POST['form_position'] ?? 'unknown'); // hero | bottom | popup if (empty($phone) && empty($email)) { echo json_encode(['error' => 'Укажите телефон или email']); exit; } $lead = new \CCrmLead(false); $leadId = $lead->Add([ 'TITLE' => 'Промо: ' . $promoId . ' — ' . $name, 'NAME' => $name, 'PHONE' => [['VALUE' => $phone, 'VALUE_TYPE' => 'WORK']], 'EMAIL' => [['VALUE' => $email, 'VALUE_TYPE' => 'WORK']], 'SOURCE_ID' => 'WEB', 'SOURCE_DESCRIPTION' => 'Промо: ' . $promoId . ', форма: ' . $source, 'UTM_SOURCE' => $_COOKIE['utm_source'] ?? '', 'UTM_MEDIUM' => $_COOKIE['utm_medium'] ?? '', 'UTM_CAMPAIGN' => $_COOKIE['utm_campaign'] ?? '', ]); echo json_encode(['success' => (bool)$leadId]); תגי UTM נשמרים בעוגיות למשך 30 דקות דרך JavaScript ומועברים לליד. השדות $sections = \CIBlockElement::GetList( ['SORT' => 'ASC'], ['IBLOCK_ID' => PROMO_SECTIONS_IBLOCK_ID, 'ACTIVE' => 'Y', 'PROPERTY_PROMO_ID' => $promoId], false, false, ['ID', 'NAME', 'CODE', 'DETAIL_TEXT', 'PROPERTY_SECTION_TYPE', 'PROPERTY_BG_IMAGE', 'PROPERTY_CTA_TEXT', 'PROPERTY_CTA_URL'] ); while ($section = $sections->GetNext()) { $sectionType = $section['PROPERTY_SECTION_TYPE_VALUE']; $sectionFile = __DIR__ . '/sections/' . $sectionType . '.php'; if (file_exists($sectionFile)) { include $sectionFile; } } , \Bitrix\Main\Loader::includeModule('crm'); $promoId = htmlspecialchars($_POST['promo_id'] ?? ''); $name = htmlspecialchars(trim($_POST['name'] ?? '')); $phone = htmlspecialchars(trim($_POST['phone'] ?? '')); $email = htmlspecialchars(trim($_POST['email'] ?? '')); $source = htmlspecialchars($_POST['form_position'] ?? 'unknown'); // hero | bottom | popup if (empty($phone) && empty($email)) { echo json_encode(['error' => 'Укажите телефон или email']); exit; } $lead = new \CCrmLead(false); $leadId = $lead->Add([ 'TITLE' => 'Промо: ' . $promoId . ' — ' . $name, 'NAME' => $name, 'PHONE' => [['VALUE' => $phone, 'VALUE_TYPE' => 'WORK']], 'EMAIL' => [['VALUE' => $email, 'VALUE_TYPE' => 'WORK']], 'SOURCE_ID' => 'WEB', 'SOURCE_DESCRIPTION' => 'Промо: ' . $promoId . ', форма: ' . $source, 'UTM_SOURCE' => $_COOKIE['utm_source'] ?? '', 'UTM_MEDIUM' => $_COOKIE['utm_medium'] ?? '', 'UTM_CAMPAIGN' => $_COOKIE['utm_campaign'] ?? '', ]); echo json_encode(['success' => (bool)$leadId]); , UTM_SOURCE, UTM_MEDIUM, UTM_CAMPAIGN זמינים — אנו משתמשים בהם. כפי שמצוין בתיעוד REST API, השיטה UTM_TERM יוצרת ליד בבקשה אחת.
איך ליישם טיימר ספירה לאחור?
טיימר המוביל לסוף מבצע הוא אלמנט המרה מרכזי. אנו מיישמים אותו עם JavaScript וזמן בצד השרת:
// Дата из настроек инфоблока, без хардкода $promoEndDate = \COption::GetOptionString('promo', 'end_date'); echo '<script>window.PROMO_END_DATE = "' . $promoEndDate . '";</script>'; function startCountdown(endDateStr) { const endDate = new Date(endDateStr); const timer = setInterval(() => { const now = new Date(); const diff = endDate - now; if (diff <= 0) { clearInterval(timer); document.getElementById('timer').textContent = 'Акция завершена'; return; } const days = Math.floor(diff / 86400000); const hours = Math.floor((diff % 86400000) / 3600000); const minutes = Math.floor((diff % 3600000) / 60000); const seconds = Math.floor((diff % 60000) / 1000); document.getElementById('timer-days').textContent = String(days).padStart(2, '0'); document.getElementById('timer-hours').textContent = String(hours).padStart(2, '0'); document.getElementById('timer-minutes').textContent = String(minutes).padStart(2, '0'); document.getElementById('timer-seconds').textContent = String(seconds).padStart(2, '0'); }, 1000); } למה להוסיף בדיקת A/B?
בדיקות A/B מאפשרות לך להשוות גרסאות דף ללא שירותים חיצוניים. אנו מפצלים מבקרים דרך עוגיה:
if (!isset($_COOKIE['promo_variant'])) { $variant = rand(0, 1) ? 'A' : 'B'; setcookie('promo_variant', $variant, time() + 86400 * 30, '/'); } else { $variant = $_COOKIE['promo_variant']; } $templateFile = __DIR__ . '/variants/' . $variant . '.php'; include $templateFile; התוצאות נכתבות לטבלה נפרדת UTM_CONTENT עם שדות CCrmLead::Add, // Дата из настроек инфоблока, без хардкода $promoEndDate = \COption::GetOptionString('promo', 'end_date'); echo '<script>window.PROMO_END_DATE = "' . $promoEndDate . '";</script>'; , function startCountdown(endDateStr) { const endDate = new Date(endDateStr); const timer = setInterval(() => { const now = new Date(); const diff = endDate - now; if (diff <= 0) { clearInterval(timer); document.getElementById('timer').textContent = 'Акция завершена'; return; } const days = Math.floor(diff / 86400000); const hours = Math.floor((diff % 86400000) / 3600000); const minutes = Math.floor((diff % 3600000) / 60000); const seconds = Math.floor((diff % 60000) / 1000); document.getElementById('timer-days').textContent = String(days).padStart(2, '0'); document.getElementById('timer-hours').textContent = String(hours).padStart(2, '0'); document.getElementById('timer-minutes').textContent = String(minutes).padStart(2, '0'); document.getElementById('timer-seconds').textContent = String(seconds).padStart(2, '0'); }, 1000); } , if (!isset($_COOKIE['promo_variant'])) { $variant = rand(0, 1) ? 'A' : 'B'; setcookie('promo_variant', $variant, time() + 86400 * 30, '/'); } else { $variant = $_COOKIE['promo_variant']; } $templateFile = __DIR__ . '/variants/' . $variant . '.php'; include $templateFile; . לאחר 1,000 מבקרים לכל גרסה, המובהקות הסטטיסטית הופכת גלויה — ניתן לבחור בגרסה הטובה יותר.
מתי בדיקת A/B נחשבת שהושלמה?
לאחר צבירת 1,000 מבקרים לכל גרסה, ניתן להעריך מובהקות סטטיסטית. אם הפרש ההמרה עולה על 5%, הגרסה המובילה מוכרזת כמנצחת.מטמון וביצועים
אתר פרומו עלול להתמודד עם תנועת שיא: 10,000 מבקרים בשעה מניוזלטר. אנו מגדירים:
- מטמון דף מלא דרך nginx FastCGI cache למשתמשים אנונימיים. זמן אספקת דף — 0.002 שניות.
- Cache-Control: public, max-age=3600 לנכסים סטטיים.
- חימום מטמון לאחר כל פריסה.
- הגבלת קצב לבקשות AJAX (nginx
b_local_promo_ab_stats).
איך להשיק אתר פרומו ב-5 צעדים?
- הגדר מטרות ובצע ביקורת על האתר הנוכחי.
- תכנן את ארכיטקטורת בלוק המידע והאינטגרציות.
- פתח את התבנית, הטפסים, הטיימר ובדיקת ה-A/B.
- בדיקת עומס והגדרת מטמון.
- השקה ומסירת הוראות עריכה.
מה כלול בעבודה
| שלב | תיאור |
|---|---|
| ניתוח ומפרט | הגדרת מטרות, ביקורת על האתר הנוכחי, בחירת תבנית |
| עיצוב | ארכיטקטורת בלוק מידע, תוכנית אינטגרציית CRM |
| פיתוח | עיצוב, תכנות רכיבים, טפסים, טיימרים |
| בדיקות | בדיקת עומס שיא, אנליטיקת UTM, בדיקת A/B |
| השקה והדרכה | הגדרת מטמון, מתן גישה, הוראות עריכה |
לצוות שלנו ניסיון של 5+ שנים בפיתוח Bitrix ומעל 50 אתרי פרומו שנמסרו. אנו מבטיחים איכות וקובעים מועדים בחוזה. קבל ייעוץ מהנדס להערכת הפרויקט שלך. צור קשר להערכת עלות.
לוחות זמנים לפיתוח
| אפשרות | היקף | לוח זמנים |
|---|---|---|
| דף נחיתה מעיצוב מוכן | עיצוב + טופס + ליד ל-CRM | 3–5 ימים |
| עם תוכן ניתן לעריכה | + סעיפי בלוק מידע, ניהול פאנל ניהול | 5–8 ימים |
| פרומו מלא | + טיימר, בדיקת A/B, אנליטיקת UTM | 8–14 ימים |
העלות מחושבת באופן אישי ונקבעת בחוזה.







