Битрикс24

Рассылка в Битрикс24 с учётом часовых поясов

Рассылка в Битрикс24 с учётом часовых поясов

Задача пришла от клиента, который работает с лидами по всей стране — от Калининграда до Владивостока. Сценарий простой: менеджер отбирает по фильтру партию лидов (обычно около тысячи), переводит их в стадию воронки, и бизнес-процесс генерирует каждому персональный документ и отправляет письмо.

В таком виде у сценария было три проблемы:

  1. Письма уходили в неудобное время. Запуск в 16:00 по Москве означал, что во Владивостоке письмо приходило в 23:00. Запуск вечером приводил к письмам глубокой ночью.
  2. Выходные никто не учитывал. Письмо, пришедшее в субботу утром, к понедельнику терялось среди других.
  3. Тысяча писем уходила одним залпом. Это бьёт по лимитам почтового сервера, повышает шанс попасть в спам и создаёт пиковую нагрузку на генерацию документов.

Всё это мы решили штатными средствами облачного Битрикс24 — без внешних серверов и платных приложений.

Как устроено решение

Ключевая идея: каждая копия бизнес-процесса сама рассчитывает, когда ей проснуться. При массовом переводе в стадию запускается тысяча независимых процессов, общей очереди между ними нет, поэтому распределение по времени закладывается в логику каждого из них.

Схема алгоритма расчёта времени отправки

1. Настройки — в Списке, а не в коде процесса

Параметры рассылки меняются от кампании к кампании: до которого часа отправлять сегодня, с какого часа начинать на следующий день, на сколько минут растянуть отправку, какой шаблон документа использовать, от чьего имени слать письмо.

Зашивать это в бизнес-процесс — значит каждый раз звать администратора в дизайнер. Поэтому мы вынесли все параметры в универсальный Список: один элемент работает как «пульт управления». Менеджер открывает обычную форму, видит текущие значения, правит их и сохраняет. Процесс в самом начале читает этот элемент и дальше работает только с полученными значениями.

Важное правило для пользователей: настройки меняются до перевода лидов в стадию. Уже запущенные процессы своё время отправки к этому моменту рассчитали.

2. Время лида

У каждого лида есть поле с часовым поясом, заданным как смещение от Москвы. Процесс берёт текущее время портала, прибавляет смещение и получает «который сейчас час у клиента».

Отдельно пришлось позаботиться о лидах с незаполненным поясом: пустое значение ломает расчёты дат. Простое «значение по умолчанию» у переменной не помогает — оно перезаписывается пустотой при присвоении, поэтому ноль подставляется прямо в формуле. Такие лиды считаются по московскому времени.

3. Три окна времени

Дальше процесс смотрит на час у клиента:

  • рано утром или ночью (раньше часа начала) — отправка сегодня, как только у клиента наступит час начала;
  • в рабочее время (раньше часа окончания) — отправка сразу;
  • вечером — отправка завтра в час начала по времени клиента.

Время отправки всегда привязывается к часовому поясу портала. Если вы хотите письмо в 7:00 у клиента, нужно пересчитать это время в часовой пояс портала (обычно МСК), вычтя разницу поясов. Частая ошибка — сложить вместо вычитания: из‑за этого время сдвигается на двойную разницу и письмо уходит не вовремя

4. Перенос с выходных

После выбора окна отправки процесс проверяет, на какой день недели — снова по времени клиента — пришлась отправка. Если это суббота или воскресенье, отправка переносится на понедельник в час начала. Проверка стоит одна на все три ветки, поэтому корректно отрабатывает и запуск рассылки в пятницу вечером, и запуск в выходной.

5. Индивидуальный слот: убираем «залп»

Чтобы письма не уходили одновременно, к рассчитанному времени каждому лиду добавляется сдвиг на 0…N минут, где N — «окно рассылки» из настроек. Номер минуты вычисляется как остаток от деления ID лида на размер окна.

Это решение выглядит неочевидным, но у него важные плюсы: оно не требует общего счётчика между процессами (а значит, нет гонок при одновременном старте) и хорошо работает, даже когда ID отобранных лидов идут вразнобой — остатки от деления распределяются практически равномерно. При тысяче лидов и окне в 200 минут получается в среднем пять писем в минуту.

Одна особенность облака: пауза бизнес-процесса просыпается не в точную минуту, а при ближайшем проходе планировщика — на практике раз в 5–10 минут. Поэтому реальная картина — небольшие пачки писем с интервалом в несколько минут. Размер пачки регулируется шириной окна.

6. Документ и письмо

После паузы процесс генерирует документ по шаблону, ID которого тоже берётся из Списка. Перед отправкой временно назначает ответственным сотрудника, у которого есть доступ к нужной почте. Это нужно, чтобы письмо ушло корректно: иначе система попробует отправить его от имени запустившего процесс сотрудника — и если у него нет доступа к этой почте, будет ошибка. Отправляет письмо и возвращает прежнего ответственного.

С ответственным связан подводный камень, который мы нашли при аудите исходной версии процесса: прежний ответственный сохранялся в глобальную переменную. Она одна на все тысячу запусков, и каждый следующий её перезаписывал — после паузы всем лидам вернулся бы ответственный последнего стартовавшего. Решение — обычная переменная процесса, своя у каждой копии.

Что получилось

  • Каждый клиент получает письмо в рабочее время по своему часовому поясу.
  • Письма не приходят в выходные.
  • Тысяча писем растягивается на заданное окно вместо одного залпа: почтовый сервер не упирается в лимиты, генерация документов идёт равномерно.
  • Менеджер управляет рассылкой через обычную форму Списка — без доступа к дизайнеру бизнес-процессов и без участия администратора.

Что можно развить

  • Праздники. Сейчас проверяются только суббота и воскресенье. Дизайнер бизнес-процессов умеет работать с производственным календарём портала — следующий шаг переносить отправку и с праздничных дней.
  • Несколько кампаний одновременно. Если завести элемент Списка на каждую кампанию и привязывать к нему лиды, можно вести параллельные рассылки с разными настройками и сохранять историю.
  • Выбор шаблона по названию. Вместо ввода ID — выпадающий список шаблонов, который автоматически синхронизируется с генератором документов через REST.

Если в вашем Битрикс24 есть похожая задача — массовые действия, которые нужно растянуть во времени или привязать к часовым поясам клиентов, — напишите нам. Разберём текущий бизнес-процесс и предложим решение на штатных инструментах.

Читать далее

Не все письма сразу: 7 способов распределить рассылку в Битрикс24 по времени и ящикам

Не все письма сразу: 7 способов распределить рассылку в Битрикс24 по времени и ящикам

Статья

Когда бизнес-процесс запускается на сотнях лидов разом, письма уходят одним залпом и с одного адреса. Разбираем семь способов распределить отправку по времени и почтовым ящикам: как устроен каждый, где он ломается и когда его выбирать.

Читать
Как собрать вебхук внутри бизнес-процесса Битрикс24 без внешнего сервера

Как собрать вебхук внутри бизнес-процесса Битрикс24 без внешнего сервера

Статья

Связать два портала Битрикс24 можно без отдельного сервера: бизнес-процесс сам отправляет REST-запросы, получает ответы и обновляет карточки. Разбираем, как собрать такой вебхук, почему внутри batch значения кодируются дважды и где всё ломается.

Читать
Мультиязычный сайт на CMS Ghost: как разделить дизайн, переводы и оперативные данные

Мультиязычный сайт на CMS Ghost: как разделить дизайн, переводы и оперативные данные

Статья

Когда мы переносили собственный корпоративный сайт с конструктора на Ghost CMS, перед нами встала задача, знакомая многим компаниям, работающим на несколько стр

Читать