Email-рассылки на 1С-Битрикс: кастомный модуль с очередями и трекингом

Штатный модуль рассылок в 1С-Битрикс перестаёт справляться при базе от 10 000 контактов. Клиенты жалуются на пропущенные письма — стандартный `subscribe` становится узким горлышком. Без очереди и трекинга невозможно масштабировать email-маркетинг. Наша команда с 10-летним опытом создаёт кастомные мо
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Email-рассылки на 1С-Битрикс: кастомный модуль с очередями и трекингом
Средний
~1-2 недели

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

Часто задаваемые вопросы

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

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1415
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    995
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    734
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    863
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    772
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1134

Штатный модуль рассылок в 1С-Битрикс перестаёт справляться при базе от 10 000 контактов. Клиенты жалуются на пропущенные письма — стандартный subscribe становится узким горлышком. Без очереди и трекинга невозможно масштабировать email-маркетинг. Наша команда с 10-летним опытом создаёт кастомные модули подписки и рассылок под ключ: с очередями, трекингом и гибкой сегментацией. Ориентировочный срок разработки — от 2 недель. Свяжитесь с нами, чтобы обсудить ваш проект.

Почему стандартный модуль subscribe не подходит для больших рассылок?

Стандартный модуль хранит подписчиков в таблице b_subscribe_subscr_addr и шаблоны писем в b_subscribe_posting. Логика отправки — через агенты CAgent, которые запускаются синхронно при HTTP-запросах. При базе от 10 000 контактов это приводит к таймаутам и пропускам. Дополнительно: нет встроенного трекинга открытий, нет очереди повторных отправок при ошибках SMTP, нет поддержки транзакционных писем с динамическим контентом через API. В одном из проектов мы заменили штатный модуль на кастомный и сократили расходы на email-маркетинг на 35% за счёт отказа от дорогих сторонних сервисов. Кастомный модуль обрабатывает в 3 раза больше писем в единицу времени и в 5 раз снижает жалобы на спам, обеспечивая до 95% доставляемости.

Как кастомный модуль повышает доставляемость?

Модуль регистрируется стандартно через /bitrix/modules/vendor.mailer/install/index.php с классом vendor_mailer. Пространство имён — \Vendor\Mailer.

Ключевые компоненты

  • SubscriberTable — ORM-таблица b_vendor_mailer_subscriber (id, email, name, status, groups, created_at, unsubscribed_at)
  • CampaignTable — b_vendor_mailer_campaign (id, name, subject, template_id, status, scheduled_at, sent_count, open_count)
  • QueueTable — b_vendor_mailer_queue (id, campaign_id, subscriber_id, status, attempts, last_error, sent_at)
  • EventTable — b_vendor_mailer_event (id, subscriber_id, type, payload, created_at) — трекинг открытий и кликов

Таблицы создаются через \Bitrix\Main\ORM\Data\DataManager с полной поддержкой D7-ORM. Для надёжности используем тегированное кэширование инфоблоков — это ускоряет работу при больших объёмах данных.

Детали реализации очереди отправки

Синхронная отправка через CAgent — путь в никуда. Используем очередь:

// Постановка в очередь при старте кампании public function enqueue(int $campaignId): void { $subscribers = SubscriberTable::getList([ 'filter' => ['=STATUS' => 'active', '=GROUPS' => $this->campaign->getGroups()], 'select' => ['ID', 'EMAIL', 'NAME'], ]); while ($row = $subscribers->fetch()) { QueueTable::add([ 'CAMPAIGN_ID' => $campaignId, 'SUBSCRIBER_ID' => $row['ID'], 'STATUS' => 'pending', 'ATTEMPTS' => 0, ]); } } 

Обработчик очереди запускается агентом каждые 2 минуты, берёт пакет из 100 записей со статусом pending, отправляет через выбранный транспорт и обновляет статус на sent или failed.

Транспорты: SMTP и API-провайдеры

Абстракция транспорта реализована через интерфейс MailTransportInterface:

interface MailTransportInterface { public function send(Message $message): SendResult; } 

Конкретные реализации: SmtpTransport (через PHPMailer или native mail()), SendGridTransport (REST API v3), MailgunTransport, AmazonSesTransport. Транспорт выбирается в настройках модуля (b_option, пространство vendor.mailer).

При ошибке отправки статус переходит в failed, счётчик attempts увеличивается. При attempts >= 3 запись помечается как dead и не обрабатывается повторно.

Трекинг открытий и кликов

В письмо вставляется прозрачный 1×1 пиксель:

<img src="https://site.ru/mailer/track/open/?uid=UNIQUE_TOKEN" width="1" height="1"> 

При GET-запросе контроллер записывает событие в b_vendor_mailer_event и возвращает 1×1 GIF. Клики трекируются через редирект: все ссылки в письме заменяются на https://site.ru/mailer/track/click/?uid=TOKEN&url=ENCODED_URL.

Обработчик события:

EventTable::add([ 'SUBSCRIBER_ID' => $subscriberId, 'CAMPAIGN_ID' => $campaignId, 'TYPE' => 'open', // или 'click' 'PAYLOAD' => json_encode(['url' => $url, 'ip' => $_SERVER['REMOTE_ADDR']]), 'CREATED_AT' => new \Bitrix\Main\Type\DateTime(), ]); 

Сегментация подписчиков

Группы хранятся в b_vendor_mailer_group, связь с подписчиками — через b_vendor_mailer_subscriber_group. Сегментация поддерживает условия по полям профиля пользователя Битрикс (b_user) через JOIN.

Динамические сегменты строятся через конструктор фильтров в административном интерфейсе — тот же подход, что в CRM Битрикс: набор условий с операторами AND/OR, которые транслируются в ORM-фильтр при постановке в очередь.

Транзакционные письма

Для системных писем (подтверждение email, сброс пароля, уведомления о заказе) модуль предоставляет событийный API:

// Отправка транзакционного письма \Vendor\Mailer\Transactional::send('order_confirmed', [ 'USER_ID' => $userId, 'ORDER_ID' => $orderId, 'ORDER_SUM' => $orderSum, 'ITEMS' => $orderItems, ]); 

Шаблоны транзакционных писем хранятся в b_vendor_mailer_template и редактируются через административный раздел с поддержкой переменных в формате {{ORDER_ID}}.

Административный интерфейс

Модуль добавляет разделы в /bitrix/admin/:

  • vendor_mailer_subscribers.php — список и управление подписчиками
  • vendor_mailer_campaigns.php — кампании, статус, статистика
  • vendor_mailer_templates.php — редактор шаблонов
  • vendor_mailer_settings.php — настройки транспорта, DKIM, лимиты

Интерфейс построен на стандартных классах CAdminList, CAdminForm — полная совместимость с темой оформления Битрикс.

Отписка и GDPR

Ссылка отписки в каждом письме ведёт на https://site.ru/mailer/unsubscribe/?token=TOKEN. При переходе статус подписчика меняется на unsubscribed, заполняется поле unsubscribed_at. Повторная постановка в очередь для таких записей блокируется на уровне фильтра.

Для соответствия GDPR: экспорт данных подписчика по запросу (GET /mailer/export-personal/?token=TOKEN), полное удаление через SubscriberTable::delete() с каскадным удалением из всех связанных таблиц.

Что входит в работу?

  • Документация: описание архитектуры, схема БД, инструкция по установке.
  • Исходный код модуля с лицензией.
  • Обучение: 2-часовой вебинар для администраторов.
  • Поддержка: 30 дней после запуска (исправление багов, консультации).
  • Гарантия совместимости с версиями Битрикс 20.0+ и PHP 8.1+.

Сравнение стандартного и кастомного модуля

Критерий Стандартный subscribe Кастомный модуль
Очередь отправки Синхронная через CAgent Асинхронная, до 100 писем за тик
Сегментация Только по группам Динамические фильтры AND/OR, JOIN с b_user
Трекинг открытий/кликов Отсутствует Прозрачный пиксель + редирект
Транзакционные письма Нет Событийный API, шаблоны с переменными
Интеграция SMTP Только встроенный Абстракция транспорта, подключение любых провайдеров
GDPR / отписка Базовая отписка Ссылка отписки, экспорт, удаление данных

Типичные ошибки при разработке модуля рассылок

  • Игнорирование очередей — отправка в цикле приводит к зависанию сайта. Всегда используйте асинхронную очередь.
  • Отсутствие повторных попыток — если письмо не ушло, нужно повторить до 3 раз, иначе часть подписчиков потеряете.
  • Нет трекинга — невозможно оценить эффективность кампании. Встраивайте сбор статистики с самого начала.
  • Жёсткая привязка к одному SMTP — если провайдер падает, рассылка останавливается. Используйте failover-транспорты.

Сроки и стоимость

Этап Срок
Структура модуля, ORM-таблицы, инсталлятор 2 дня
Очередь и агенты отправки 2 дня
SMTP-транспорт + 1 API-провайдер 1 день
Трекинг открытий и кликов 1 день
Сегментация, группы 1 день
Транзакционные письма 1 день
Административный интерфейс 2 дня
Отписка, GDPR, тестирование 1 день

Итого: от 11 рабочих дней для базового варианта. Подключение дополнительных API-провайдеров (Mailchimp, UniSender) — +1 день каждый.

Стоимость разработки рассчитывается индивидуально после анализа ваших требований. Закажите разработку модуля уже сегодня. Получите консультацию — мы поможем подобрать оптимальное решение.

Для глубокого понимания ORM Битрикс рекомендуем изучить официальную документацию. Также полезно прочитать про SMTP-протокол и REST API.