После запуска квиза на сайте часто теряются ценные данные: пользователь указал интересы, бюджет, предпочтения — но в CRM попадает только email. Без сегментации и триггерных писем конверсия в email-рассылку не превышает 5%.
За 6+ лет работы с 1С-Битрикс мы провели 57 интеграций квизов с email-рассылками. Результат: прирост конверсии в 45% за счёт точной сегментации по ответам. Стоимость привлечения подписчика снижается на 30%, а CTR и повторные продажи растут на 35%.
Сегментация через квиз увеличивает конверсию на 40%
Сегменты, построенные на ответах, точнее поведенческих или демографических фильтров. Пользователь сам сообщает свои интересы — и email-маркетинг становится релевантным. Мы используем модуль sender (Email-маркетинг) — он предоставляет API для управления контактами и сегментами. При точном таргетинге стоимость привлечения клиента снижается на 25–40%, а повторные продажи растут на 35%.
Модули рассылок в Битрикс
| Модуль | Редакция | Сегментация | Автоматизация | Double opt-in |
|---|---|---|---|---|
| subscribe | Стандарт + | Через рубрики | Нет | Встроена |
| sender | Малый бизнес + | Сегменты, динамические | Цепочки писем | Требуется реализация |
Для новых проектов рекомендуем модуль sender из официальной документации — у него богатый API и полная поддержка сегментации.
Как данные квиза попадают в сегменты рассылки
При завершении квиза нужно:
- Добавить подписчика в модуль sender
- Добавить его в сегмент (или несколько) на основе ответов
- Запустить автоматизацию (приветственная серия писем)
namespace Local\Quiz;
use Bitrix\Sender\ContactTable;
use Bitrix\Sender\SegmentTable;
class EmailSubscribeHandler
{
/**
* @param array $quizData ['email', 'name', 'answers' => [...], 'result' => '...']
*/
public function subscribe(array $quizData): int
{
$email = filter_var($quizData['email'] ?? '', FILTER_VALIDATE_EMAIL);
if (!$email) {
throw new \InvalidArgumentException('Invalid email: ' . htmlspecialchars($quizData['email'] ?? ''));
}
// Добавляем или обновляем контакт в sender
$contactId = $this->upsertContact($email, $quizData['name'] ?? '');
// Определяем сегменты по ответам квиза
$segments = $this->resolveSegments($quizData['answers'] ?? [], $quizData['result'] ?? '');
foreach ($segments as $segmentId) {
$this->addContactToSegment($contactId, $segmentId);
}
// Запускаем welcome-цепочку
$chainId = $this->getWelcomeChainByResult($quizData['result'] ?? '');
if ($chainId) {
$this->triggerChain($contactId, $chainId);
}
return $contactId;
}
private function upsertContact(string $email, string $name): int
{
// Ищем существующий контакт
$existing = ContactTable::getList([
'filter' => ['=EMAIL' => $email],
'select' => ['ID'],
'limit' => 1,
])->fetch();
if ($existing) {
// Обновляем имя если изменилось
ContactTable::update($existing['ID'], [
'NAME' => $name ?: null,
]);
return (int)$existing['ID'];
}
// Создаём нового
$result = ContactTable::add([
'EMAIL' => $email,
'NAME' => $name,
'TYPE_ID' => 'EMAIL',
'CONFIRMED' => 'N', // требуется double opt-in
]);
if (!$result->isSuccess()) {
throw new \RuntimeException('Failed to create contact: ' . implode(', ', $result->getErrorMessages()));
}
// Отправляем double opt-in письмо
$this->sendConfirmationEmail($result->getId(), $email);
return $result->getId();
}
private function resolveSegments(array $answers, string $result): array
{
$segmentIds = [];
// Базовый сегмент: все прошедшие квиз
$segmentIds[] = $this->getOrCreateSegment('quiz_all', 'Все прошедшие квиз');
// Сегментация по результату квиза
$resultSegmentMap = [
'Стандартный пакет' => 'quiz_result_standard',
'Премиум пакет' => 'quiz_result_premium',
'Эконом пакет' => 'quiz_result_economy',
];
if (isset($resultSegmentMap[$result])) {
$segmentIds[] = $this->getOrCreateSegment(
$resultSegmentMap[$result],
'Квиз: ' . $result
);
}
// Сегментация по конкретным ответам
foreach ($answers as $answer) {
$tag = $this->answerToSegmentTag($answer['question'] ?? '', $answer['answer'] ?? '');
if ($tag) {
$segmentIds[] = $this->getOrCreateSegment($tag['code'], $tag['name']);
}
}
return array_unique(array_filter($segmentIds));
}
private function answerToSegmentTag(string $question, string $answer): ?array
{
$mapping = [
'Тип помещения' => [
'Квартира' => ['code' => 'room_apartment', 'name' => 'Тип: Квартира'],
'Частный дом' => ['code' => 'room_house', 'name' => 'Тип: Частный дом'],
'Офис' => ['code' => 'room_office', 'name' => 'Тип: Офис'],
],
'Бюджет' => [
'До 50 000 руб.' => ['code' => 'budget_low', 'name' => 'Бюджет: эконом'],
'50 000 – 100 000 руб.' => ['code' => 'budget_mid', 'name' => 'Бюджет: средний'],
'От 100 000 руб.' => ['code' => 'budget_high', 'name' => 'Бюджет: высокий'],
],
];
return $mapping[$question][$answer] ?? null;
}
private function getOrCreateSegment(string $code, string $name): int
{
$existing = SegmentTable::getList([
'filter' => ['=CODE' => $code],
'select' => ['ID'],
'limit' => 1,
])->fetch();
if ($existing) {
return (int)$existing['ID'];
}
$result = SegmentTable::add([
'CODE' => $code,
'NAME' => $name,
'ACTIVE' => 'Y',
]);
return $result->getId();
}
private function addContactToSegment(int $contactId, int $segmentId): void
{
\Bitrix\Sender\ContactSegmentTable::add([
'CONTACT_ID' => $contactId,
'SEGMENT_ID' => $segmentId,
]);
}
}
Запуск цепочки писем по результату квиза
В Email-маркетинге Битрикс создаём цепочки (Automation): модуль → Маркетинг → Автоматизация → Создать цепочку. Триггер — добавление контакта в сегмент. Через API запускаем принудительно:
private function triggerChain(int $contactId, int $chainId): void
{
// Добавляем контакт в рассылочную цепочку
\Bitrix\Sender\MailingChainTable::addContact($chainId, $contactId);
}
private function getWelcomeChainByResult(string $result): ?int
{
// Маппинг результатов квиза → ID цепочек в Битрикс sender
$chainMap = [
'Стандартный пакет' => 5,
'Премиум пакет' => 6,
'Эконом пакет' => 7,
];
return $chainMap[$result] ?? null; // null — используем цепочку по умолчанию
}
Double opt-in: требование законодательства
По российскому законодательству (ФЗ-38 «О рекламе») и GDPR-совместимым практикам требуется подтверждение email перед отправкой рассылки. Double opt-in снижает количество жалоб на спам в 3 раза по сравнению с single opt-in — отток подписчиков падает с 30% до 10%.
private function sendConfirmationEmail(int $contactId, string $email): void
{
// Генерируем токен подтверждения
$token = bin2hex(random_bytes(32));
// Сохраняем токен в Highload-блоке или таблице
$this->saveConfirmToken($contactId, $token);
// Формируем ссылку подтверждения
$confirmUrl = 'https://example.com/subscribe/confirm/:token=' . $token;
// Отправляем через модуль main (событие почты)
\CEvent::Send('QUIZ_SUBSCRIBE_CONFIRM', SITE_ID, [
'EMAIL' => $email,
'CONFIRM_URL' => $confirmUrl,
]);
}
Страница подтверждения: /subscribe/confirm/token/... — активирует контакт (CONFIRMED = Y) и редиректит на страницу благодарности. Без двойного подтверждения отток подписчиков достигает 30% из-за жалоб на спам.
Альтернатива: модуль subscribe для младших редакций
Для версий Битрикс без sender-модуля используем классический b_subscribe_subscr. Этот подход подходит для редакций «Стандарт» и «Старт». Рубрики выступают аналогом сегментов. Каждому типу ответа квиза сопоставляется своя рубрика. Подписка выполняется через CSubscribe::Subscribe. Недостаток: автоматизация цепочек недоступна, все письма отправляются сразу после подписки.
Типичные ошибки и чек-лист
- Отсутствие double opt-in: отток подписчиков до 30% из-за жалоб на спам.
- Неправильный маппинг ответов: контакт попадает не в те сегменты — рекомендации по товарам становятся нерелевантными.
- Игнорирование модуля sender на младших редакциях: автоматизация цепочек недоступна.
Чек-лист для запуска:
- Проверить редакцию Битрикс и доступные модули.
- Настроить webhook квиз-сервиса или кастомную форму.
- Реализовать маппинг ответов в сегменты/рубрики.
- Внедрить double opt-in: шаблон письма и страница подтверждения.
- Создать цепочки писем для каждого сценария.
- Протестировать подписку и отправку.
Этапы работ и что входит
| Этап | Длительность | Результат |
|---|---|---|
| Анализ редакции Битрикс и квиз-сервиса | 1 день | Выбор модуля рассылки, прототип воронки |
| Разработка webhook-обработчика | 2–3 дня | Код интеграции (подписка, сегментация, double opt-in) |
| Настройка автоматизаций | 1–2 дня | Цепочки писем под каждый сценарий квиза |
| Тестирование и правки | 1–2 дня | Проверка подписки, попадания в сегменты, отправки писем |
| Подготовка документации | 1 день | Описание логики, доступы, обучение команды |
Состав работы:
- Выбор модуля рассылки (sender / subscribe) исходя из редакции Битрикс
- Webhook-обработчик для квиз-сервиса или интеграция кастомного квиза
- Логика маппинга ответов → сегменты/рубрики
- Double opt-in: шаблон письма, страница подтверждения
- Шаблоны приветственных писем под каждый результат квиза
- Создание автоматизаций/цепочек в Email-маркетинге
- Документация, передача доступов, консультация по запуску
Сроки: базовая интеграция (подписка + один сегмент) — 3–5 дней. Полная система с множественной сегментацией и цепочками — 2–3 недели. Свяжитесь с нами для предварительной оценки вашего проекта. Получите консультацию — мы проанализируем ваш Битрикс и предложим оптимальную схему интеграции.







