Автоматизация email-рассылок по данным квиз-формы в 1С-Битрикс

Запустили квиз на сайте, но ценные данные об интересах клиентов теряются, а в CRM попадает лишь email? Мы автоматизируем передачу ответов из квиз-формы в 1С-Битрикс и настраиваем умные email-рассылки с сегментацией по этим данным. Наша команда реализует проект под ключ — от интеграции до настройки триггерных писем, обеспечивая стабильную работу и последующую поддержку.

Автоматизация email-рассылок по данным квиз-формы в 1С-Битрикс

Email-рассылкиСредний~1-2 недели
Часто задаваемые вопросы

После запуска квиза на сайте часто теряются ценные данные: пользователь указал интересы, бюджет, предпочтения — но в 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 и полная поддержка сегментации.

Как данные квиза попадают в сегменты рассылки

При завершении квиза нужно:

  1. Добавить подписчика в модуль sender
  2. Добавить его в сегмент (или несколько) на основе ответов
  3. Запустить автоматизацию (приветственная серия писем)
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' => 'Тип: Офис'],
            ],
            'Бюджет' => [
                'До $450–650.' => ['code' => 'budget_low', 'name' => 'Бюджет: эконом'],
                '$500–1k.' => ['code' => 'budget_mid', 'name' => 'Бюджет: средний'],
                'От $900–1.3k.' => ['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 на младших редакциях: автоматизация цепочек недоступна.

Чек-лист для запуска:

  1. Проверить редакцию Битрикс и доступные модули.
  2. Настроить webhook квиз-сервиса или кастомную форму.
  3. Реализовать маппинг ответов в сегменты/рубрики.
  4. Внедрить double opt-in: шаблон письма и страница подтверждения.
  5. Создать цепочки писем для каждого сценария.
  6. Протестировать подписку и отправку.

Этапы работ и что входит

Этап Длительность Результат
Анализ редакции Битрикс и квиз-сервиса 1 день Выбор модуля рассылки, прототип воронки
Разработка webhook-обработчика 2–3 дня Код интеграции (подписка, сегментация, double opt-in)
Настройка автоматизаций 1–2 дня Цепочки писем под каждый сценарий квиза
Тестирование и правки 1–2 дня Проверка подписки, попадания в сегменты, отправки писем
Подготовка документации 1 день Описание логики, доступы, обучение команды

Состав работы:

  • Выбор модуля рассылки (sender / subscribe) исходя из редакции Битрикс
  • Webhook-обработчик для квиз-сервиса или интеграция кастомного квиза
  • Логика маппинга ответов → сегменты/рубрики
  • Double opt-in: шаблон письма, страница подтверждения
  • Шаблоны приветственных писем под каждый результат квиза
  • Создание автоматизаций/цепочек в Email-маркетинге
  • Документация, передача доступов, консультация по запуску

Сроки: базовая интеграция (подписка + один сегмент) — 3–5 дней. Полная система с множественной сегментацией и цепочками — 2–3 недели. Свяжитесь с нами для предварительной оценки вашего проекта. Получите консультацию — мы проанализируем ваш Битрикс и предложим оптимальную схему интеграции.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1543
  • Разработка веб-сайта для компании ФИКСПЕР
    Разработка веб-сайта для компании ФИКСПЕР
    1060
  • Разработка виджета онлайн-записи на прием для медицинского центра
    Разработка виджета онлайн-записи на прием для медицинского центра
    837
  • Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    928
  • Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    865
  • Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1223