При запуске массовой email-рассылки лендинг на конструкторе лёг — сервер не выдержал 5 000 одновременных посетителей. Промо-сайт на 1С-Битрикс с кэшированием nginx FastCGI и инфоблоками выдерживает такие пики без потери конверсии. Собственная CMS даёт полный контроль: от вёрстки до интеграции с CRM. Один развёрнутый кейс: для клиента из телеком-сектора мы сделали промо-страницу, которая за 3 дня привлекла 12 000 лидов — средняя стоимость лида снизилась на 30%. Маркетологи сэкономили 40% бюджета за счёт отказа от внешних сервисов аналитики.
Технически промо-сайт на Битрикс — это одностраничник с секциями, формами захвата и интеграцией с Битрикс24 через REST API. Используем инфоблоки v2.0 для контента, hl-блоки для статистики A/B-тестов, тегированное кэширование для скорости. Такой подход в 5 раз быстрее типового лендинга на конструкторе при пиковых нагрузках.
Когда промо на Битрикс, а не на конструкторе
- Основной сайт уже на Битрикс — промо размещается на поддомене или в папке, используя тот же шаблон и кэш. Интеграция занимает 2 часа.
- Нужна CRM без прослоек — формы сразу создают лиды в Битрикс24 через 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. В шаблоне — switch по 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-форма, форма в конце, exit-intent popup. Все отправляют запрос на один обработчик:
\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-метки сохраняются в cookies на 30 минут через JS и передаются в лид. Доступны поля UTM_SOURCE, UTM_MEDIUM, UTM_CAMPAIGN, UTM_TERM, UTM_CONTENT — используем их. Как указано в документации REST API, метод CCrmLead::Add позволяет создать лид за один запрос.
Как реализовать таймер обратного отсчёта?
Таймер до конца акции — ключевой элемент конверсии. Реализуем на JS с серверным временем:
// Дата из настроек инфоблока, без хардкода $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 тест позволяет сравнить варианты страницы без внешних сервисов. Делим посетителей через cookie:
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; Результаты пишем в отдельную таблицу b_local_promo_ab_stats с полями PROMO_ID, VARIANT, VIEWS, CONVERSIONS. После 1 000 посетителей на вариант видна статистическая значимость — можно выбрать лучший.
Когда A/B тест считается завершённым?
После накопления 1 000 посетителей на вариант можно оценить статистическую значимость. Если разница конверсии превышает 5%, вариант-лидер считается победителем.Кэширование и производительность
Промо-сайт может получить пиковую нагрузку: 10 000 посетителей в час от рассылки. Настраиваем:
- Полностраничное кэширование через nginx FastCGI cache для анонимных пользователей. Отдача страницы — 0.002 с.
- Cache-Control: public, max-age=3600 для статики.
- Прогрев кэша после каждого деплоя.
- Rate limiting AJAX-запросов (nginx
limit_req_zone).
Как запустить промо-сайт за 5 шагов?
- Фиксация целей и аудит текущего сайта.
- Проектирование архитектуры инфоблоков и интеграций.
- Разработка шаблона, форм, таймера, A/B-теста.
- Нагрузочное тестирование и настройка кэширования.
- Запуск и передача инструкции редактору.
Что входит в работу
| Этап | Описание |
|---|---|
| Анализ и ТЗ | Фиксация целей, аудит текущего сайта, подбор шаблона |
| Проектирование | Архитектура инфоблоков, схема интеграций с CRM |
| Разработка | Вёрстка, программирование компонентов, форм, таймеров |
| Тестирование | Проверка на пиковых нагрузках, UTM-аналитика, A/B тест |
| Запуск и обучение | Настройка кэширования, передача доступов, инструкция для редакторов |
Наша команда имеет 5+ лет опыта в разработке на Битрикс и более 50 реализованных промо-сайтов. Гарантируем качество и фиксируем сроки в договоре. Оцените ваш проект — получите консультацию инженера. Свяжитесь с нами для расчёта стоимости.
Сроки разработки
| Вариант | Состав | Срок |
|---|---|---|
| Лендинг по готовому макету | Верстка + форма + лид в CRM | 3–5 дней |
| С редактируемым контентом | + Инфоблок секций, управление через админку | 5–8 дней |
| Полнофункциональный промо | + Таймер, A/B тест, аналитика UTM | 8–14 дней |
Стоимость рассчитывается индивидуально и фиксируется в договоре.







