Событийные действия / Триггерные рассылки¶
Описание событыйных действий¶
Введение¶
Событийные действия предназначены для автоматизации реакции системы в ответ на те или иные события происходящие с пользователем или вызванные его действиями.
Для задания автоматической реакции системы на те или иные действия/бездействия пользователя создайте "Последовательность" описывающую что ("Действия") в ответ на какие события ("События") в каком порядке ("Шаги", "Варианты") должно происходить.
На каждом Шаге последовательности можно задать несколько сценариев развития событий создав несколько Вариантов описав какие События активируют какой вариант (один вариант могут активировать несколько разных действий) и задать какие Действия (одно или несколько) должны быть выполнены в каждом из вариантов.
Как простой частный случай с помощью событийных действий можно реализовать триггерные рассылки (автоответчики) - задайте на первом шаге условие начала последовательности и как действие - первое высылаемое письмо. На следующий шагах задавайте интервал времени до высылки следующего письма и его высылку в действиях.
Для придания автоответчику интеллектуальности можно, например, сочетать события "Клик" и "Прошло время" для выбора какое из писем высылать далее, действия "Изменить данные" что бы учитывать на какое из высланных писем пользователь среагировал, действия "Завершить последовательность" что бы прекратить высылать подписчику письма при отсутствии интереса, действие "Перейти на другую последовательность" что бы сменить тематику в зависимости от его реакции.
В более сложных случаях можно организовать автоматические напоминания о забытых корзинах в интернет-магазинах, автоматическое изменение статуса покупателя в зависимости от числа покупок и даже квест-игры по электронной почте.
Обработка событий¶
Каждое событие произошедшее в системе асинхронно проверяется не подходит ли оно в какой-либо последовательности к её первому шагу или к текущему шагу уже находящегося на последовательности пользователя.
Проверка производится путём просмотра всех условий каждого из вариантов шага. Если в данном варианте шага событие подходит к одному из условий, то дальнейший поиск в данном шаге последовательности прекращается и выполняются все действия описанные в том варианте к которому подошло событие после чего пользователь переходит на следующий шаг последовательности как описано ниже.
Событие может подойти к нескольким последовательностям и сработает во всех сразу куда подошло.
Подходящее событие может быть проигнорировано если пользователь или последовательно находятся в состоянии паузы.
Подходящее событие может не вызвать начало прохождения пользователем последовательности если этому мешают настройки разовости и закрытости последовательности.
Удаление идентификатора подписчика из системы приведёт к прекращению его обработки во всех последовательностях. Однако не сразу, а при очередной обработке событий связанных с удалённым идентификатором.
Если у последовательности установлен тип адресов отличный от any, то она будет принимать события только для адресов подходящего типа.
Прохождение последовательности¶
Каждый шаг последовательности имеет свой уникальный номер - целое положительное число. Он не обязан возрастать от шага к шагу - он назначается вами, вам и решать как нумеровать.
Обязательно наличие шага номер 1 - с него начинается прохождение последовательности.
Когда событие вызывает срабатывание одного из вариантов на том шаге последовательности на котором находится подписчик, то выполняются соответствующие этому варианту действия и подписчик переходит на шаг последовательности заданный в параметре next сработавшего варианта. (если, конечно, в действиях не было действия "Уйти на другую последовательность", "Завершить прохождение последовательности")
Это позволяет организовать самую сложную логику ветвлений при прохождении последовательности.
Ограничения:
-
номер шага - целое положительное число
-
должен быть шаг 1 - прохождение начинается в него
-
все next должны ссылаться на существующие шаги в новой версии устанавливаемой sequence.steps.set (ошибка missing_step)
-
вариант может ссылаться на свой собственный шаг
-
next вариантов последнего шага (да и прочих тоже, впрочем) могут быть 0 - это завершение последовательности
-
не должно быть шагов на которые ни кто не ссылается (ошибка orphan_step). ссылка на самого себя не в счёт
-
не должно быть изолированных групп шагов на которые не попасть начиная проход с шага 1 (ошибка orphan_isolat)
Свойства последовательности¶
Тип адресов¶
Принимаются только для указанного типа адресов если только не установлено any
Однократность¶
Можно ли ещё раз начать прохождение последовательности, если она уже была пройдена или проходится в данный момент.
Параллельность¶
В данный момент не реализовано !
Можно ли одновременно проходить последовательность несколько раз и если можно, то при запуске нового прохождения прервать ли текущие
Список исключений¶
Группа-список участники которой не попадут на последовательность даже если произошло нужное событие.
Закрытость¶
Новые участники не могут начать последовательность при наступлении подходящих событий.
Однако новый участник может быть добавлен вызовом sequence.member.start
Это полезно для тестирования. Отметьте последовательность закрытой на время её создания и тестирования, что бы ни кто из обычных пользователей не мог случайно начать её прохождение. А тестовых пользователей вы можете добавить через sequence.member.start
Ни как не влияет на прохождение последовательности уже имеющимися участниками.
Пауза¶
События не учитываются и значит ни кто не продвигается по последовательности и не начинает её. Пропущенные события теряются.
Проверки по головам или по телам¶
Если настройка установлена "по головам" (по умолчанию), то проверки и манипуляции с прохождением производятся только для указанного головы.
Если настройка установлена "по телам",то :
Манипуляции над членством в очереди по телам:
-
sequence.member.pause/resume/stop - меняет прохождение всех голов имеющих тоже тело что и голова указанная в запросе
-
действие sequence.stop с указанием sequence - останавливает прохождение всех голов имеющих тоже тело что и голова проходящая триггер
-
действие sequence.stop без указания sequence - игнорирует bydataset и останавливает только проходящюу голову. если надо таки по dataset, то надо указать в sequence свой собственный номер
Проверки прохождения по телам:
-
onlyonce = 1 - не получится запустить на триггер ни какую голову тела если уже есть голова (головы) этого тела завершившие прохождение
-
параллельное прохождение - не получится запустить на триггер ни какую голову тела если уже есть голова (головы) этого тела совершающие прохождение
Если установить bydataset = 1 уже при работающем триггере, то может сложиться ситуации когда несколько голов одного тела проходят триггер - ничего не случится - они пойдут как шли
Если установить bydataset = 1 уже при работающем триггере у которого onlyonce =1, то может сложиться ситуации когда одна или несколько голов одного тела проходят триггер хотя уже есть завешившие прохождение от того же теля - ничего не случится - они пойдут как шли
Статистика работы и участники последовательности¶
Статистика работы последовательности доступна через объект sequence.* вызова Универсальной Статистики stat.uni.
Например, можно узнать сколько подписчиков на каких шагах последовательности находятся или как они её завершили. Получить список находящихся на конкретном шаге.
Данные прохождения¶
Прохождение участника по последовательности сопровождается набором данных которые называются "Данные прохождения"
В них автоматически хранятся данные от последнего события каждого типа (если такое событие их вообще имеет). Например, номер заказ из события "Новый заказ" модуля "Продажи".
Так же, в них возможно хранение произвольных данных через запись действием member.update. Например, запись отметки по какому из нескольких возможных вариантов прошёл ранее участник для последующего далее выбора какого-то варанта действий или использования в письме.
Данные прохождения доступны:
-
в событии
member.matchчерезmember.sequence_dataдля участия в условиях сравнения -
в действии
member.updateчерез ключmember.sequence_data- можно переписывать данные изmember.sequence_dataв другие ключи/анкеты подписчика и можно менять данные вmember.sequence_data.store -
в действии
send.letterкак параметрsequence_dataпередаваемый черезextra
Структура Данных прохождения:
{
"event" : { -- по типам. данные последнего события каждого типа
"ecom.price_down" : {
данные специфичные для такого события
}
,"ecom.order_placed" : {
данные специфичные для такого события
}
}
,"last_event" : {
"event : "ecom.order_placed" -- тип последнего события записанного в event
............. -- копия данных последнего события записанного в event
}
,'store' => произвольные данные которые можно писать действиями триггера
}
Данные прохождения удаляются при завершении прохождения последовательности.
События¶
Никогда¶
Событие которое никогда не произойдёт.
Основное назначение - быть на первом шаге в последовательности которая используется не сама по себе, а как последовательность на которую переходят из других последовательностей.
Можно так же использовать, например, для временного отключения одного из вариантов действий на шаге без его удаления.
Иначе¶
Событие-затычка для member.match
Не может быть на первом шаге
Если на шаге ни у одного варианта нет событий кроме member.match и never, то должен быть вариант с единственным событием - else - который сработает если не сработает ни один member.match
Второй вариант использования - шаг с единственным вариантом с единственным условием - else - срабатывает сразу как до него доходит подписчик. Назначение - общие действия нескольких шагов.
Вероятностный выбор¶
Не может быть на первом шаге
На шаге может быть от 1 до нужного числа Вероятностных событий.
Сумма вероятностей всех событий во всех вариантах на одном шаге должна равняться 100 и на шаге не должно быть ожидаемых событий других типов.
При переходе на шаг вычисляется случайное число от 1 до 100 которое указывает какое из событий random будет считаться произошедшим с учётом указанной у них вероятности.
Процент равный 0 - способ временно отключить вариант.
{
"type" : "random" -- вероятностное событие
,"probability" : "процент вероятности срабатывания" - цело число от 0 до 100
}
Новая регистрация без необходимости подтверждения¶
Происходит когда пользователь первый раз вносится в базу и на это от него не требуется подтверждения регистрации.
Обратите внимание, что это событие должно быть в последовательности только первым и в другой позиции просто не сработает никогда по логике.
{
"type" : "member.new.no-confirm"
,"origin.id" : "номер источника" -- не обязательно. по умолчанию любой
}
Новая регистрация c требованием подтверждения¶
Происходит когда пользователь первый раз вносится в базу и от него требуется подтверждение регистрации.
Обратите внимание, что это событие должно быть в последовательности только первым и в другой позиции просто не сработает никогда по логике.
{
"type" : "member.new.confirm"
,"origin.id" : "номер источника" -- не обязательно. по умолчанию любой
}
Подтверждение регистрации¶
Происходит когда пользователь подтверждает регистрацию.
Не важно каким путём - по ссылке подтверждения, апи-вызов, заполнение формы.
Самостоятельное удаление регистрации¶
Заменено на unsub.all. Используйте новое событие.
Отписка от всего¶
Происходит когда пользователь отписывается (т.е. запрещает дальнейшую высылку ему чего-либо) с занесением в стоп-лист.
Отписка по отправителю¶
Происходит когда пользователь отписывается при активной настройке "Отписка по отправителю" с занесением в стоп-лист по отправителю.
{
"type" : "unsub.sender"
,"sender" : "адрес отправителя" -- при указании адреса - только при отписке от отправителя с данным адресом
-- пусто или параметр не указан - то срабатывает при любой отписке по отправителю
,"addr_type" : "тип адреса" -- не обязательно, если отсутствует или пусто, то автоопределение между email и msisdn
}
Отписка по тематике¶
Происходит когда пользователь отписывается от конкретной тематики с занесение в группу-список отписавшихся для этой тематики
{
"type" : "unsub.topic"
,"unsub_list" : "код группы-списка тематической отписки" -- не обязательно, если отсутствует или пусто, то срабатывает на любую тематическую отписку
,"unsub_topic.name" : "название группы" -- при вызове get
}
Прошло времени¶
Не может быть в списке у вариантов первого действия последовательности.
Происходит когда с момента попадания на данных шаг прошёл указанный интервал времени равный указанному количеству дней, часов и минут.
{
"type" : "time.elapsed"
--Срабатывает от момента попадания на шаг через указанно число дней часов и минут.
,"interval" : "DDDDD hh:mm" или "hh:mm" или "mm"
-- DDDDD - до пяти цифр количества дней
-- hh - количество часов
-- mm - количество минут
-- Срабатывает от момента попадания на шаг через указанное число дней в указанное время дня. Если указано 0 дней, а указанное время сегодня уже прошло, то срабатывает сразу. Для другого поведения при 0 дней есть time.happened hh:mm
,"interval" : "DDDDD @ hh:mm"
}
Точное время¶
Не может быть в списке у вариантов первого действия последовательности.
Происходит когда текущее время совпало с заданными ожидаемыми.
Зачем ? Например удобно накопить желающих начать какой либо курс и разом начать его в удобный день высылкой первого письма.
Можно указать:
- год, месяц, день и время - сработает раз
- день и время - сработает раз в месяц если в нём есть такой день
- только время - сработает раз в день
- день недели - сработает раз в неделю в 0 часов 0 минут
- день недели и время - сработает раз в неделю в указанный момент
{
"type" : "time.happened"
,"weekday" : "номер дня недели" или [ номер, ...]
-- не обязательно при наличии time
-- 1-6 - Пн-Сб, 7 - Вс
-- вызов sequence.steps.set дополнительно принимает 0 как Вс, но при записи преобразует в 7
,"time" : "дата и время" -- не обязательно при наличии weekday
-- YYYY - год
-- ММ - месяц
-- DD - день
-- hh - час
-- mm - минута
-- Время перехода на наг проверяется на соответствие указанному, и при не соответствии происходит ожидание, когда по прошествии времени условие будет соблюдено.
-- Если на шаге есть другие условия они тоже проверяются и могут сработать вместо этого, тогда прохождение последовательности идёт далее не ожидая соблюдения данного условия.
-- Везде в описаниях фраза "указанное время" обозначает "как только при очередной обработке событий указанное время наступило". Если при переходе на шаг указанное время уже прошло (даже немного), то это ожидание его повтора.
-- Везде при описании интервалов "срабатывает" это или при переходе на шаг ждёт начала указанного интервала, если время перехода на шаг не подходит или сразу же, если время перехода на шаг удовлетворяет интервалу.
-- Срабатывание дня недели аналогично интервалу - день недели ожидается или срабатывает сразу, если сегодня это он.
-- Допустимые сочетания дня недели, даты и времени:
-- Срабатывает в указанное время указанной даты
-- "YYYY-MM-DD hh:mm"
-- Срабатывает в каждом месяце в указанное время в день, вычисляемый с конца месяца (номер последнего дня - L, начиная с 0)
-- "LDD hh:mm" -- дней с конца месяца, от L00 до L27
-- -- позволяет не заботится сколько в конкретном месяце дней
-- -- L пишется слитно с DD, DD от 00 до 27 - осталось целых дней до конца месяца
--
-- -- L00 - последний день месяца
-- -- L01 - пред-последний день месяца
-- -- L02 - пред-пред-последний день месяца
-- -- и так до L27
--
-- Срабатывает один раз в любой момент в интервале начиная с указанного времени указанной даты и до второго указанного времени. Срабытывает при первой же возможности. Если второе время ранее первого, то это обозначает длительность интервала "до такого-то времени завтра"
-- "YYYY-MM-DD hh:mm - hh:mm"
-- Срабатывает один раз в любой момент в интервале начиная с указанного времени указанной даты и до второй даты и её времени. Срабытывает при первой же возможности. Если вторая дата-время ранее первой даты-времени, то это обозначает длительность интервала до второй даты-времени в следующем месяце
-- "YYYY-MM-DD hh:mm - DD hh:mm"
-- Аналогично вариантам с "-", но указывается длительность интервала: "актуально столько-то дней, часов, минут"
-- "YYYY-MM-DD hh:mm + hh:mm"
-- "YYYY-MM-DD hh:mm + DD hh:mm"
-- Срабатывает в указанное время указанного дня каждый в каждом месяце
-- "DD hh:mm"
-- Срабатывает каждый месяц один раз в любой момент в интервале начиная с указанного времени указанного дня и до второго указанного времени. Срабытывает при первой же возможности. Если второе время ранее первого, то это обозначает длительность интервала "до такого-то времени завтра"
-- "DD hh:mm - hh:mm"
-- Срабатывает каждый месяц один раз в любой момент в интервале начиная с указанного времени указанного дня и до второй даты и её времени. Срабытывает при первой же возможности. Если вторая дата-время ранее первой даты-времени, то это обозначает длительность интервала до второй даты-времени в следующем месяце
-- "DD hh:mm - DD hh:mm"
-- Аналогично вариантам с "-", но указывается длительность интервала
-- "DD hh:mm + hh:mm"
-- "DD hh:mm + DD hh:mm"
-- Срабатывает в указанное время указанного дня каждый день
-- "hh:mm"
-- Срабатывает каждый день один раз в любой момент в интервале начиная с указанного времени и до второго указанного времени. Срабытывает при первой же возможности. Если второе время ранее первого, то это обозначает длительность интервала "до такого-то времени завтра"
-- "hh:mm - hh:mm"
-- Аналогично варианту с "-", но указывается длительность интервала
-- "hh:mm + hh:mm"
-- Срабатывает каждый раз каждую неделю при наступлении указанного дня (дней недели). Обычно это чуть позже 00:00.
-- weekday
-- [weekday1, weekday2..] -- указание списка дней массивом "weekday":[1,2,3,4,5,6,7]
-- Срабатывает каждый раз каждую неделю при наступлении указанного дня (дней недели) и указанного времени.
-- weekday + "hh:mm"
-- [weekday1, weekday2..] + "hh:mm"
-- Срабатывает каждый раз каждую неделю при наступлении указанного дня (дней недели) и указанного интервала времени. Срабатывает при первой же возможности. Если второе время ранее первого, то это обозначает длительность интервала "до такого-то времени завтра"
-- weekday + "hh:mm - hh:mm"
-- [weekday1, weekday2..] + "hh:mm - hh:mm"
-- Аналогично варианту с "-", но указывается длительность интервала
-- weekday + "hh:mm + hh:mm"
-- [weekday1, weekday2..] + "hh:mm + hh:mm"
}
Время сейчас¶
Не может быть в списке у вариантов первого действия серии.
Проверяется сразу при переходе на шаг. Срабатывает если при переходе на шаг текущее время (день недели/год/месяц/день/час) совпали с заданными ожидаемыми.
На шаге должны быть предусмотрены другие варианты действий иначе, если совпадения не будет, пользователь застрянет на этом шаге навечно. Или в варианте с событием "Время сейчас" должны быть альтернативные события которые могут продвинуть пользователя дальше
Зачем ? Например, недельный цикл писем. Присоеденившийся в Пн получает по одному письму в день. Присоеденившийся по вторник - сразу письма за понедельник и вторник и далее по одному в день. Присоеденившийся в среду - три письма и далее по одному в день. Присоеденившийся в чертверг и позже - ждут понедельника (событие time.happened) и начинают получать дождавшись.
{
"type" : "time.now"
"weekday" : "номер дня недели" или [ номер, ...]
-- не обязательно при наличии time
-- 1-6 - Пн-Сб, 7 - Вс
-- вызов sequence.steps.set дополнительно принимает 0 как Вс, но при записи преобразует в 7
,"time" : "дата и время" -- не обязательно при наличии weekday
-- YYYY - год -- текущий, если не задан
-- ММ - месяц
-- DD - день
-- hh - час
-- mm - минута
,"op": "<=" | "!=" | "==" | ">=" | "in" | "!in" -- операция сравнения текущего времени с предполагаемым в условии
-- операция сравнения при указании временного промежутка: "in" | "!in"
-- Аналогично time.happened, но время перехода на шаг проверяется на соответствие указанному и при не соотвствии условие не срабатывает и всё, не происходит ожидания когда по прошествии времени условие будет соблюдено.
-- На на шаге должный быть другие условия которые не дадут прохождению зависнуть из-за того что данное условие не соблюдено.
-- При указании списка дней недели и операции == - срабатывет любой из списка если он сегодня
-- При указании списка дней недели и операции != - срабатывет если ни один из списка не сегодня
-- Допустимые сочетания дня недели, даты и времени, операции:
--
-- "YYYY-MM-DD hh:mm" - "<=" | ">="
-- "YYYY-MM-DD hh:mm - hh:mm" - "in" | "!in"
-- "YYYY-MM-DD hh:mm - DD hh:mm" - "in" | "!in"
-- "YYYY-MM-DD hh:mm + hh:mm" - "in" | "!in"
-- "YYYY-MM-DD hh:mm + DD hh:mm" - "in" | "!in"
-- "DD hh:mm" - "<=" | ">="
-- "DD hh:mm - hh:mm" - "in" | "!in"
-- "DD hh:mm - DD hh:mm" - "in" | "!in"
-- "DD hh:mm + hh:mm" - "in" | "!in"
-- "DD hh:mm + DD hh:mm" - "in" | "!in"
-- "hh:mm" - "<=" | ">="
-- "hh:mm - hh:mm" - "in" | "!in"
-- "hh:mm + hh:mm" - "in" | "!in"
-- "LDD hh:mm" - "<=" | ">="
-- weekday - "<=" | "==" | "!=" | ">="
-- [weekday1, weekday2..] - "==" | "!="
-- weekday + "hh:mm" - "<=" | ">="
-- weekday + "hh:mm - hh:mm" - "in" | "!in"
-- weekday + "hh:mm + hh:mm" - "in" | "!in"
-- С операциями ">=" или "<=" может содержать условие weekday только для одного конкретного дня недели, оно не должно быть массивом дней.
}
Клик по ссылке¶
Происходит когда пользователь нажимает на ссылку в высылаемых ему письмах.
Рассылки должны выпускаться с преобразованием ссылок для учёта переходов, иначе клик системой замечен не будет. Не забудьте включить учёт переходов в шаблоне.
Клик по определённой ссылке в письме обычной рассылки ("свободный клик") приведёт к наступления события "Клик" во всех последовательностях где такое событие ожидается на первом шаге для этой ссылки и где состояние настроек последовательности позволяет ему начать её прохождение.
В результате свободного клика для кликнувшего пользователя в каждой начатой им последовательности будут выполнены предписанные там действия и он перейдёт на следующий шаг.
Клик по определённой ссылке из письма высланного пользователю при исполнении действия "Выслать письмо" ("связанный клик") приведёт к событию "Клик" только в той последовательности из которой было выслано письмо и только если на текущем шаге пользователя ожидается такой клик. Состояние настроек последовательности или пользователя может повлиять на учёт клика.
В результате связанного клика для кликнувшего пользователя будут выполнены предписанные на его текущем шаге действия и он продвинется на следующий шаг.
Другим словами - событие "Клик по ссылке" НА первом шаге сработает только, если оно произошло в письме высланном обычной рассылкой.
А событие "Клик по ссылке" НЕ на первом шаге сработает только, если оно произошло в письме ранее высланном с этой же последовательности.
Если от события "Клик по ссылке" вы хотите поведения "и когда-то ранее переходил по такой-то ссылке", то это реализуется с помощью события "Данные совпадают" с фильтром отбора по Универсальной Статистике по условию перехода по интересующей ссылке.
Чтения письма¶
Происходит когда фиксируется чтение письма высланного ранее в данной последовательности или в любой другой (параметр "any").
Чтение обычных рассылок событие не генерируют.
Если у последовательности более одного действия "Выслать письмо", то параметр draft позволяет, при желании, различать какое именно из высланых писем было прочитано.
{
"type" : "read"
,"draft" : "номер черновика" -- или пусто если не требуется
,"any" : 0|1 -- 0 - срабатывает только в своей последовательности, 1 - в любой
,"draft.name" : "название черновика" -- при вызове get
,"draft.channel" : "канал черновика" -- при вызове get
}
Доставка письма¶
Только для personal и при наличии в выпуске параметраsequence_event : 1
Только окончательный статус когда точно или доставлено или нет.
{
"type" : "deliv"
,"draft" : "номер черновика или null если не проверять"
,"any" : 0|1 -- 0 - срабатывает только в своей последовательности, 1 - в любой
,"status" : null - любой
1 - успешно
-1 - не успешно
-ххх - конкретный неуспешный статус
}
Изменение данных¶
Первый вариант.
Происходит когда при изменении данных пользователя удовлетворяются (или не удовлетворяются - в зависимости от параметра *.not) условия обоих фильтров если заданы оба и единственного фильтра, если задан один.
Фильтр БЫЛО проверяет данные до изменения. Фильтр СТАЛО - после изменений. Должен быть указан одни любой или оба фильтра сразу.
Если указан только фильтр БЫЛО, то пользователь удовлетворяет условия события, если его старые данные (до изменения) прошли проверку успешно, а новые (после изменения) - НЕ успешно. Т.е. данныепересталипопадать под условие.
Если указан только фильтр СТАЛО, то пользователь удовлетворяет условия события, если его старые данные (до изменения) прошли проверку НЕ успешно, а новые (после изменения) - успешно. Т.е. данныесталипопадать под условие.
Если указаны ОБА фильтра, то пользователь удовлетворяет условия события, если его старые данные (до изменения) успешно прошли проверку по фильтру БЫЛО, а новые (после изменения) успешно прошли проверку по фильтру СТАЛО. Т.е. старые данныепересталипопадать под условие БЫЛО и новыесталипопадать под условие СТАЛО.
{
"type" : "member.change"
---------
-- фильтр "БЫЛО. может отсутствовать при наличии фильтра "СТАЛО"
,"was.not" : 0|1 -- 0 - фильтр соблюдён если пользователь удовлетворяет условию
-- 1 - фильтр соблюдён если пользователь НЕ удовлетворяет условию
-- и одно из:
,"was.group" : "код группы"
,"was.group.name" : "название группы" -- только при вызове get
,"was.group.addr_type" : "тип адресов группы" -- только в get
,"was.group.type" : "тип группы" -- только при вызове get
-- или
,"was.cond" : { единичное условие фильтра как в group.filter.set. при вызове get дополнительно aid.name и qid.name }
-- или
,"was.cond" : [ фильтр из несколько условии как в group.filter.set ]
---------
-- фильтр "СТАЛО". может отсутствовать при наличии фильтра "БЫЛО"
,"new.not" : 0|1 -- 0 - фильтр соблюдён если пользователь удовлетворяет условию
-- 1 - фильтр соблюдён если пользователь НЕ удовлетворяет условию
-- и одно из:
,"new.group" : "код группы"
,"new.group.name" : "название группы" -- только при вызове get
,"new.group.addr_type" : "тип адресов группы" -- только в get
,"new.group.type" : "тип группы" -- только при вызове get
-- или
,"new.cond" : { единичное условие фильтра как в group.filter.set. при вызове get дополнительно aid.name и qid.name }
-- или
,"new.cond" : [ фильтр из несколько условии как в group.filter.set ]
}
Второй вариант.
Происходит когда данные изменились, но не важно как - просто предыдущее значение не равно новому.
По умолчанию производится строчное сравнение значений.
{
"type" : "member.change"
,"as_number" : 0|1 -- не обязательно. сравнивать значения как числа.
-- и одно из:
,"field" : {
"aid" : "код анкеты"
,"qid" : "код вопроса"
-- при вызове get дополнительно aid.name и qid.name
}
--- или
,"field" : {
"datakey" : "ключи данных"
}
}
Расширенная информация об изменении данных¶
Данная возможность подключается через Службу поддержки
При использовании второго варианта разница между старым и новым состоянием данных при использовании второго варианта "Данные просто изменились" может быть использовано в выпуске письма, если среди действий на данном шаге триггера есть "выслать письмо" - описание найденной разницы передаётся в extra в параметре trigger.
trigger содержит массив описывающий каждое найденное изменение
Возможные варианты записей
Данные добавлены¶
В версии до изменения ключа данных не было, в новой - есть
Данные удалены¶
В версии до изменения ключ данных был, в новой - удалён
Данные изменены¶
Значение по ключу данных изменилось
Расширенное отслеживание изменений¶
Данная возможность подключается через Службу Поддержки
При использовании второго варианта кроме отслеживания изменений всего ключа данных можно отслеживать изменение его компонентов если это массив или объект. extra.trigger будет содержать по записи на каждый изменившийся компонент.
Если используется расширенное сравнение, а тип данных до и после не сопоставим (например был массив, а стал объект), то изменение не будет засчитано так как не нет способа сопоставления элементов (какой ключ объекта выбрать для сравнения с элементом N массива ?)
Тестовый пример
{
"a" : { --
"b" : [ -- a.b
{ -- a.b[0]
"c" : { -- a.b[0].с
"d" : "123" -- a.b[0].c.d
,"e" : "456" -- a.b[0].c.e
}
}
,{ -- a.b[1]
"c" : { -- a.b[1].с
"f" : "789" -- a.b[0].c.f
,"g" : "xyz" -- a.b[0].c.g
}
}
]
}
}
Просто сравнение ключей данных¶
Формат записи
Сравниваются значения до и после по ключуa.b
В тестовом примере будут сравнены состояния до и после для массива a.b и замечено изменение его содержимого
Сравнение компонентов ключей данных¶
Формат записи
Сравниваются эквивалентные компоненты до и после из ключаa.b
Для массива - с одинаковым индексом
Для объекта - с одинаковыми ключами
Для скаляра - изменение замечено не будет, так как скаляр не составной тип
В тестовом примере будут сравнены состояния до и после дляa.b[0]иa.b[1]
Сравнение пути в компонентах ключей данных¶
Формат записи
Сравниваются значения по ключу данныхсприменённому к эквивалентным компонентам до и после из ключаa.b
Если компонент скаляр - изменение замечено не будет, так как скаляр не может иметь внутри себя дополнительный уровень данных
В тестовом примере будут сравнены состояния до и после дляa.b[0]cиa.b[1].c
Если вам понадобился именно этот вариант сравнения, то возможно данные можно организовать как-то проще.
Сравнение субкомпонентов пути в компонентах ключей данных¶
Формат записи
Сравниваются между собой компоненты значения по ключу данныхсприменённому к эквивалентным компонентам до и после из ключаa.b
Если компонент скаляр - изменение замечено не будет, так как скаляр не может иметь внутри себя дополнительный уровень данных
В тестовом примере будут сравнены состояния до и после дляa.b[0]c.d,a.b[0]c.e,a.b[1].c.fиa.b[1].c.g
Если вам понадобился именно этот вариант сравнения, то скорее почти наверняка переусложнили структуру данных и стоит переделать
Совпадение данных¶
Происходит когда пользователь переходит на данных шаг и его текущие данные попадают (или при match.not = 1 - не попадают) под описанное условие.
Применение - условные ветвления.
На шаге должны бытьОБЯЗАТЕЛЬНОпредусмотрены другие альтернативные события (хотя бы else) которые могут продвинуть пользователя дальше. Иначе, если совпадения не будет, пользователь застрянет на этом шаге навечно.
{
"type" : "member.match"
,"match.not" : 0|1 -- 0 - совпадение если пользователь попал под условие
-- 1 - совпадение если пользователь НЕ попал под условие
-- одно из:
,"match.group" : "код группы"
,"match.group.name" : "название группы" -- только при вызове get
,"match.group.addr_type" : "тип адресов группы" -- только в get
,"match.group.type" : "тип группы" -- только при вызове get
-- или
,"match.cond" : { единичное условие фильтра как в group.filter.set. при вызове get дополнительно aid.name и qid.name }
-- или
,"match.cond" : [ фильтр из несколько условии как в group.filter.set ]
}
Форма заполнена¶
Происходит когда заполняется форма опросов.
В ситуациях когда заполнение формы не требует подтверждения происходят последовательно сразу два события: сначала form.filled и сразу за ним form_completed
Должны быть указаны form.id или origin.id или оба.
"type" : "form.filled"
,"form.id" : "код формы" -- null - любой, число - конкретно эта
,"origin.id" : "код источника" -- null - любой, число - конкретно этот
,"form.name" : название формы -- только при вызове get
,"origin.name" : название источника -- только при вызове get
Форма подтверждена¶
Происходит когда пользователь подтверждает заполнение формы опросов.
В ситуациях когда заполнение формы не требует подтверждения происходят последовательно сразу два события: сначала form.filled и сразу за ним form_completed
Должны быть указаны form.id или origin.id или оба.
"type" : "form.completed"
,"form.id" : "код формы" -- null - любой, число - конкретно эта
,"origin.id" : "код источника" -- null - любой, число - конкретно этот
,"form.name" : название формы -- только при вызове get
,"origin.name" : название источника -- только при вызове get
Целевая страница достигнута¶
Происходят когда пользователь достиг указанно целевой страницы
"type" : "target.achieved"
,"url" : "ссылка или маска ссылки" -- "*" заменяет любое количество символов, "?" - один символ
Команда Telegram-боту¶
Получена команда боту
"type" : "tg.command"
,"tg" : номер бота (т.е. номер authext) -- не обязательно, без указания в любом боте
,"tg.name" : "название бота" -- только в get
,"command" : "команда" -- null - любая команда, строка - конкретно эта
Текст Telegram-боту¶
Получена команда боту
"type" : "tg.text"
,"tg" : номер бота (т.е. номер authext) -- не обязательно, без указания в любом боте
,"tg.name" : "название бота" -- только в get
,"text" : "текст" -- null - любой, строка - конкретно эта номализованная и токенизированная строка совпадает с получено
Кнопка Telegram-боту¶
Получено нажатие кнопки бота
"type" : "tg.button" -- кнопка бота
,"tg" : номер бота (т.е. номер authext) -- не обязательно
,"tg.name" : "название бота" -- только в get
,"code" : "код_кнопки строка из callback_data" -- не обязательно
-- строка - конкретно эта
Действия¶
Ничего не делать¶
Выслать письмо¶
Пользователю высылается персонализированное письмо на основе черновика выпуска рассылки.
Кроме данных пользователя для использования в персонализации доступны данные прохождения.
Если по последовательности идёт контакт того же типа что и канал выпуска черновика, то сообщение будет отправлено ему.
Если нет, то среди всех голов контакта будет искаться подходящий под канал черновика.
Если таких найдено не будет, то просто ничего не будет отправлено, а прохождение пойдёт дальше своим чередом.
Для связки разных типов контактов заранее используйте member.head.attach
Обратите внимание, что не все каналы отправки имеют ответные действия (например в sms не будет чтений) или есть вероятность, что сообщение не будет выслано (нет головы нужного типа) то, для продолжения прохождения последовательности, необходимо это учитывать в условиях следующего шага - не ждать на следующем шаге событий которых быть не может.
Если требуется в тригере реагировать на переходы из высланного письма, то не забудьте в черновике включить учёт переходов.
{
"type" : "send.letter"
,"draft" : "код черновика рассылки" -- обязательно
-- черновик должен иметь заполненный адрес отправителя
,"draft.name" : "название черновика" -- только при вызове get
,"draft.channel" : "канал черновика" -- только при вызове get
,"basegroup.id" : "группа бота или сообщества" -- tg_xxxx
-- не обязательно
-- если указанно, то имеет приоритет над другими указаниями
-- иначе берётся из привязки последовательность obj_ref если она есть
-- иначе работает обычный приоритет выбора при выпуске
-- это позволяет из последовательности привяннойк одному боту отправлять сообщения в другой
,"basegroup.name" : "название группы" -- только при вызове get
,"basegroup.addr_type" : "тип адресов группы" -- только при вызове get
,"basegroup.type" : "тип группы" -- только при вызове get
}
Выслать письмо подтверждения¶
Используется вызов member.sendconfirm
Назначение параметров - аналогичное
{
"type" : "send.confirm"
,"letter" : "код черновика письма"
-- одно из
,'confirm' : 1 -- высылка писем для подтверждения внесения в базу
,'unsubcancel' : 1 -- высылка писем для удаления из глобального стоп-листа
,'unsubsendercancel' : 1 -- высылка писем для удаления из стоп-листа по отправителю. отправитель - тот что указан в черновике letter
,"letter.name" : "название черновика" -- только при вызове get
,"letter.channel" : "канал черновика" -- только при вызове get
}
Вызвать внешнюю ссылку¶
Указанная ссылка вызывается методом GET. Результат вызова игнорируется.
Вхождение символов EMAIL заменяется на адрес пользователя.
Так же можно подставлять данные пользователя используя команду подстановки как шаблонах выпусков [% anketa.XXX %]
Изменить данные¶
Данные пользователя изменяются указанным в формате образом или изменяется один ответ одной анкеты указанные прямо в описании.
В целом аналогично вызову member.update
{
"type" : "member.update"
,"fire_event" : 0 | 1 -- при выполнении записать событие Изменение Данных (member.change)
-- по умолчанию 0 - не записывать
-- по ключам данных DK
,"datakey" => [ массив команд аналогичный member.set ]
-- устаревшее по анкетам АВО
,"if_has" : что делать, если изменяемый пункт анкеты уже заполнен
-- "overwrite" - заменить старое значение новым из формата
-- "merge" - объединить старое и новое значения
-- "skip" - оставить старое значение
,"if_hasnt" : что делать, если изменяемый пункт анкеты ещё не заполнен
-- "set" - заполнить указанным в формате значением
-- "skip" - оставить пункт незаполненным
-- одно из
,"format" : "код формата"
,"format.name" : "название формата" -- только при вызове get
или
,"field" : {
"aid" : "код анкеты"
,"qid" : "код ответа"
,"answer" : "значение ответа используемое при заполнении"
,"aid.name" : "название анкеты" -- только при вызове get
,"qid.name" : "название анкеты" -- только при вызове get
}
,"track.info" : "дополнительная информация которая будет потом доступна в track.list/get" -- строка 1024 байта. не обязательно
}
Внести в группу-список¶
Вносит пользователя в указанную группу-список если его там ещё нет.
{
"type" : "group.in"
,"group" : "код группы"
,"group.name" : "название группы" -- только при вызове get
,"group.addr_type" : "тип адресов группы" -- только в get
,"group.type" : "тип группы" -- только при вызове get
}
Удалить из группы списка¶
Удаляет пользователя из указанной группы-списка если он там есть.
{
"type" : "group.out"
,"group" : "код группы"
,"group.name" : "название группы" -- только при вызове get
,"group.addr_type" : "тип адресов группы" -- только в get
,"group.type" : "тип группы" -- только при вызове get
}
Запустить параллельно ещё последовательность¶
Параллельно с текущей запускается указанная последовательность с участием этого пользователя.
Запуску могут помешать настройки запускаемой последовательности, но в текущей последовательности это ни на что не повлияет.
Выполнение указанной последовательности начинается с действий её шага 1. Условия её шага 1 не проверяются из-за того что участник начинает прохождение насильно. Последовательность должны иметь только одни вариант на шаге 1 иначе не понятно какой из нескольких вариантов выполнить.
{
"type" : "sequence.start"
,"sequence : "код последовательности" -- при отсутствии запускает саму себя ещё раз
,"sequence.name" : "название последовательности" -- только при вызове get
}
Остановить последовательность¶
Все участия пользователя в указанной последовательности (если имеются) принудительно завершаются.
{
"type" : "sequence.stop"
,"sequence : "код последовательности" -- при отсутствии останавливает саму себя
,"sequence.name" : "название последовательности" -- только при вызове get
}
Уйти в другую последовательность¶
Текущая последовательность принудительно завершается и запускается указанная новая последовательность с участием этого пользователя.
Запуску могут помешать настройки запускаемой последовательности, но в текущей последовательности это ни на что не повлияет.
Выполнение указанной последовательности начинается с действий её шага 1. Условия её шага 1 не проверяются из-за того что участник переводится туда насильно. Последовательность должны иметь только одни вариант на шаге 1 иначе не понятно какой из нескольких вариантов выполнить.
{
"type" : "sequence.goto"
,"sequence : "код последовательности" -- при отсутствии перезапускает саму себя
,"sequence.name" : "название последовательности" -- только при вызове get
}
Заменить голову¶
Действие заменяет у мембера проходящую по тригеру голову на его другую голову указанного типа.
Применение - уйти на триггер для других голов (например дождаться подписки на ТГ и уйти на тригер для ТГ).
Применение - в сложно-навороченных сценариях гонять по разным веткам разные типа голов.
Если тип текущей головы совпадает с целевой, то ничего не происходит и прохождение продолжается.
Если типы разные, и голов нового типа больше одной, то выбирается голова позже всего добавленная в систему (с большим id).
Если голов целевого типа нет, то, в зависимости от ignore_error, прохождение или останавливается с кодом -11 или продолжается.
Для голов типа tg, vk, pushapp, max обязательно указание в obj_ref номера внешней аутентификации которой должна соответствовать новая голова - при нескольких ботах, сообществах, приложениях навряд ли надо искать голову в любом из них.
После смены головы оставшиеся ещё не выполненные действия шага выполняются уже для новой головы.
Целевой тип головы ни как не сравнивается с ожидаемым типом головы для триггера (если установлен) - иначе не скомбинировать действия swap.head + sequence.goto и подобные.
Но начиная со следующего шага такая проверка производится и прохождение может встать из-за не совпадения типа голов.
{
"type" : "swap.head"
,"addr_type" : "email|msidn|..." -- целевой тип адреса
,"ignore_error" : 0|1 -- 0 - остановка прохождение с причиной -11 при ошибке , 1 - продолжаем. не обязательно. по умолчанию 0
,"obj_ref" : номер auth_ext -- обязателно для pushapp, tg, vk, max
}
Список последовательностей¶
{
"action" : "sequence.list"
-- параметры фильтрации, должен быть хотя бы один параметр
--
-- если выбрана последняя порция списка то ответ содержит "last_page" : 1
--
-- доступны поля
--
-- sequence.id -- идентификатор последовательности
-- sequence.addr_type -- тип адресов
-- sequence.name -- название последовательности
-- sequence.alias -- альтернативный идентификатор последовательности
-- sequence.parallel -- параллельность последовательности
-- sequence.onlyonce -- последовательность однократна
-- sequence.closed -- закрытость для новых участников
-- sequence.pause -- остановка последовательности
-- sequence,bydataset -- проверки прохождения
-- sequence.create.date -- дата-время создания -- (Ys)
-- sequence.update.date -- дата-время последнего изменения -- (Ys)
-- sequence.dictnode -- номер узла словаря
-- sequence.reltype -- число
-- sequence.relref -- число
,"filter" : [ фильтр в синтаксисе stat.uni ]
,"order" : [ сортировка ответа в синтаксисе stat.uni ]
,"skip" : количество пропускаемых записей от начала списка -- по умолчанию 0
,"first" : количество выбираемых записей после skip -- по умолчанию 50, не более 50
}
ответ
Создать последовательность¶
{
"action" : "sequence.create"
,"name" : "название последовательности" -- обязательно
,"addr_type" : "any|email|sms|viber|push|vk|tg|vknotify|pushapp|max" -- тип адресов которые принимает последовательность
-- any - любые
,"alias" : "альтернативный идентификатор" -- не обязательно. не должен начинаться с цифры и не должен содержать пробелы
-- может использоваться во всех местах где требуется указать код последовательности
,"onlyonce" : 0 | 1 -- последовательность однократна. по умолчанию 0
-- 0 - нет
-- 1 - да
,"parallel" : -1 | 0 | +1 -- параллельность последовательности. по умолчанию 0.
-- *В данный момент не реализовано и всегда 0 !*
-- 0 - нет
-- +1 - да
-- -1 - да, с прерыванием текущих
,"closed" : 0 | 1 -- закрытость для новых участников. по умолчанию 0
-- 0 - нет
-- 1 - да
,"pause" : 0 | 1 -- остановка последовательности. по умолчанию 0
-- 0 - нет
-- 1 - да
,"bydataset" : 0|1 -- проверки прохождения. по умолчанию 0
-- 0 - как обычно - по указанной голове
-- 1 - проверки и манипуляции проводить для тела указанной головы
,'exclude_list" : "код группы-списка или группы-фильтра исключения из последовательности" - не обязательно
-- участник подходящий под группу молча не начинает прохождение последовательности
-- из-за наступления события или из-за перехода с другой последовательности
-- при ручном загоне на последовательность через sequence.member.start можно указать игнорирование
-- исключает независимо от exclude_filter
,'exclude_filter" : [ код фильтра как group.filter.set ] или null - не обязательно
-- участник подходящий под фильтр молча не начинает прохождение последовательности
-- из-за наступления события или из-за перехода с другой последовательности
-- при ручном загоне на последовательность через sequence.member.start можно указать игнорирование
-- исключает независимо от exclude_list
,"obj_ref" : номер внешней аутентификации -- не обязательно
-- в данный момент применимо только при addr_type = tg
-- последовательность реагирует только на события указанного бота, указывать параметр tg в событиях не требуется
-- так же, из номера вычисляется параметр выпуска basegroup_id для действия send.letter если там не указано иное
-- установить или изменить можно только если
-- - последовательность на паузе
-- - нет участников проходящих последовательность
-- - нет шагов с tg про другого бота
,"info" : "строка произвольных данных. 1024 байта" -- необязательный
}
ответ
Прочитать последовательность¶
ответ
{
<общие поля>
,"obj" : {
,"id" : код последовательности
,"name" : "название последовательности"
,"addr_type" : "тип адресов"
,"alias" : "альтернативный идентификатор"
,"onlyonce" : "однократность последовательности"
,"parallel" : "параллельность последовательности"
,"closed" : "недоступность для новых участников"
,"pause" : "остановка последовательности"
,"bydataset" : "проверки прохождения"
,"info" : "строка произвольных данных"
,"create.date" : "дата-время создания" -- (Ys)
,"update.date" : "дата-время последнего изменения" -- (Ys)
,"exclude_list" : "код группы исключения из последовательности" (null)
,"exclude_list.name" : "....." (null)
,'exclude_filter" : [ код фильтра как group.filter.set ] или null
,"obj_ref" : номер внешней аутентификации
}
}
Изменить последовательность¶
Изменяются только явно заданные в запросе поля
Не заданные - остаются как были
{
"action" : "sequence.set"
, "id" : код последовательности
,"name" : "название последовательности" - необязательный
,"addr_type" : "any" -- не обязательный. поменять тип адресов можно только на any
,"alias" : "альтернативный идентификатор" -- не обязательный
,"onlyonce" : "однократность последовательности - необязательный
,"parallel" : "параллельность последовательности" - необязательный
,"closed" : "недоступность для новых участников" - необязательный
,"pause" : "остановка последовательности" - необязательный
,"bydataset" : "проверки прохождения" -- необязательно
,"info" : "строка произвольных данных" - необязательный
,'exclude_list" : "код группы-списка или группы-фильтра исключения из последовательности" - не обязательно
,'exclude_filter" : [ код фильтра как group.filter.set ] -- не обязательно
,"obj_ref" : номер внешней аутентификации -- не обязательно
-- не обязательно
,"return_fresh_obj" : "нужно вернуть данные объекта -- да, нет ( 1 | 0 )"
}
ответ
если "return_fresh_obj" : "1", то ответ -- как на запрос чтения sequence.get
Удалить последовательность¶
ответ
Получить список шагов¶
ответ
{
<общие поля>
,"list" : { -- описание шагов последовательности
"номер шага" : [ -- список вариантов шага
{ -- вариант
"next" : "следующий шаг"
,"event" : [ -- список ожидаемых событий
{ описание события }
,{ описание события }
.....
]
,"action" : [ -- список действий выполняемых при наступлении любого из событий
{ описание действия }
,{ описание действия }
.....
]
}
,{ вариант }
,{ вариант }
.....
]
,"номер шага" : [
....
]
......
]
}
Установить список шагов¶
Изменение списка шагов полностью заменяет текущий список на новый
Пользователи оказавшиеся из-за их текущего положения вне списка новых шагов автоматически заканчивают прохождение.
Остальные пользователи сохраняют номер шага на котором находятся, но "смысл шага" (события, действия, варианты) может стать полностью новым в соответствии с устанавливаемым списком.
Так же должны соблюдаться условия:
-
вариант должен содержать хотя бы одно событие (ошибка wrong_variant, explain = step)
-
На первом шаге не должно быть событий time.elapsed, time.happend, member.match, else. (ошибка wrong_event_step_1, explain = event.type)
-
Событие else может быть только единственным в своём варианте (ошибка non_solo_else, explain = step)
-
Событие else может быть только на шаге у которого есть хотя бы одно событие member.match и нет других событий кроме never (ошибка misuse_else, explain = step)
-
Исключение - шаг состоящий только из одного варианта в котором только одно событие else. Такой шаг срабатывает сразу как только подписчик до него доходит.
-
Шаг с событием(-ями) member.match и/или time.now должен содержать другие события позволяющие его покинуть (never не то) (ошибка dead_step, explian = step)
-
Шаг с событием(-ями) never должен содержать другие события позволяющие его покинуть (else не то) (ошибка dead_step, explian = step)
{
"action" : "sequence.steps.set"
, "id" : код последовательности
, "list" : {
описание шагов последовательности
как в sequence.steps.get
}
}
ответ
Начать прохождение последовательности¶
Указанные пользователи начинают прохождение указанной последовательности как-будто произошло одно из событий её первого шага.
Если первый шаг состоит из нескольких вариантов, то вызов закончится ошибкой и ни кто не начнёт прохождение так как непонятно какой из вариантов считать реализовавшимся.
Настройки последовательности могут влиять на возможность того или иного участника начать её прохождение.
Вызов асинхронный для list c двумя и более элементами и для group.
{
"action" : "sequence.member.start"
,"id" : код последовательности
,"ignore_exclude_list" : 0 | 1 -- не обязательно, по умолчанию 0
-- игнорировать группу исключения
,"addr_type" : email|msisdn|viber|csid|push|vk|tg|vknotify|pushapp|max|id -- тип идентификатора. Не обязательно, система сама распознает email или msisdn
-- обязателен один из параметров:
,"email" : "адрес подписчика"
или
,"list" : [
"адрес подписчика"
,"адрес подписчика"
........
]
или
,"group" : код группы для получения списка
,"track.info" : "дополнительная информация которая будет потом доступна в track.list/get" -- строка 1024 байта. не обязательно
}
ответ
Приостановить прохождение последовательности¶
Указанные пользователи приостанавливаю прохождение указанной последовательности и возобновят его при вызове sequence.member.resume
Вызов асинхронный для list c двумя и более элементами и для group.
{
"action" : "sequence.member.pause"
, "id" : код последовательности
,"addr_type" : email|msisdn|viber|csid|push|vk|tg|vknotify|pushapp|max|id -- тип идентификатора. Не обязательно, система сама распознает email или msisdn
-- обязателен один из параметров:
,"email" : "адрес подписчика"
или
,"list" : [
"адрес подписчика"
,"адрес подписчика"
........
]
или
,"group" : код группы для получения списка
,"track.info" : "дополнительная информация которая будет потом доступна в track.list/get" -- строка 1024 байта. не обязательно
}
ответ
Возобновить прохождение последовательности¶
Указанные пользователи возобновляют прохождение указанной последовательности
Вызов асинхронный для list c двумя и более элементами и для group.
{
"action" : "sequence.member.resume"
, "id" : код последовательности
,"addr_type" : email|msisdn|viber|csid|push|vk|tg|vknotify|pushapp|max|id -- тип идентификатора. Не обязательно, система сама распознает email или msisdn
-- обязателен один из параметров:
,"email" : "адрес подписчика"
или
,"list" : [
"адрес подписчика"
,"адрес подписчика"
........
]
или
,"group" : код группы для получения списка
,"track.info" : "дополнительная информация которая будет потом доступна в track.list/get" -- строка 1024 байта. не обязательно
}
ответ
Прервать прохождение последовательности¶
Указанные пользователи завершают прохождение указанной последовательности на каком бы её шаге не находились
Вызов асинхронный для list c двумя и более элементами и для group.
{
"action" : "sequence.member.stop"
, "id" : код последовательности
,"addr_type" : email|msisdn|viber|csid|push|vk|tg|vknotify|pushapp|max|id -- тип идентификатора. Не обязательно, система сама распознает email или msisdn
-- обязателен один из параметров:
,"email" : "адрес подписчика"
или
,"list" : [
"адрес подписчика"
,"адрес подписчика"
........
]
или
,"group" : код группы для получения списка
,"track.info" : "дополнительная информация которая будет потом доступна в track.list/get" -- строка 1024 байта. не обязательно
}
ответ