Перейти к содержанию

Сплит-тестирование

Описание сплит-тестирования

Сплит-тестирование (A/B-тестирование) позволяет выпустить по некоторой части выбранной аудитории несколько писем различающихся между собой чем-либо и по результатам (если охват не 100%) выбрать в ручную или автоматически "лучший" вариант и послать его оставшейся не охваченной части аудитории.

Традиционный вариант использования - A/B-тестирование - предусматривает только два тестовых варианта писем и выпуск победителя.

Но данная реализация позволяет иметь произвольное количество тестовых вариантов и при желании не выпускать победителя, а покрыть тестами сразу всю аудиторию.

Параметры тестирования

  • Название тестирования
  • Группа задающая аудиторию (Экспресс-Выпуск и Транзакционные письма не применимо)
  • Процент аудитории для тестового охвата. От 1 до 100. Указание 100 обозначает что нет необходимости выбирать "лучший" вариант и цель тестирования просто в сравнении разных вариантов.
  • Критерий выбора лучшего варианта - вручную, больше кликов, больше чтений, меньше отписок. Не нужен если охват 100%
  • Момент автоматического выбора лучшего варианта. Количество дней и часов от выпуска последнего варианта. Не нужен если охват 100% или выбор вручную.
  • Активность - может выполняться или быть приостановлено
  • Состояние (назначается автоматически). Первоначально - ожидает запуска. Все остальные состояния - подготавливается, запущено, ожидает выбора победителя, закончено - обозначают ту или иную степень выполнения.
  • Варианты писем - не менее двух

Параметры одного варианта письма

  • Дата запуска
  • Используемый черновик
  • Номер обычного выпуска. Назначается автоматически когда вариант выпущен.
  • Признак что этот вариант выбран победителем. Назначается автоматически перед его выпуском как лучшим.
  • Номер выпуска-победителя. Назначается автоматически когда этот вариант повторно выпущен как лучший.

Правила работы

Канал выпуска и аудитория определяется указанной группой.

Тестирование можно выпустить по любому каналу - email, sms, viber, push, vk, tg, vknotify, pushapp, max

Тестирование начинается автоматически не ранее даты указанной для запуска самого раннего варианта и если вариантов к этому моменту не менее двух.

Дата запуска какого-либо тестового выпуска или выпуска-победителя может быть пропущена если тестирование в приостановленном состоянии или не хватает вариантов.

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

В любом случае запуск победителя возможен только после выпуска всех тестовых частей даже если это потребует пропуска назначенного времени.

Список участников тестирования определяется как все участники указанной группы и формируется в момент или перед запуском первого варианта. В дальнейшем список неизменен вне зависимости от изменения списка участников группы за исключением адресов удаливших себя или внесённых в стоп-лист.

На время формирования списка тестирование находится в состоянии "подготавливается к запуску" и прогресс формирования может быть отслежен через вызов track.get

Данные персонализации каждого участника берутся на момент выпуска варианта.

Содержимое письма и прочие параметры выпуска берутся из указанного черновика на момент выпуска варианта.

Разные варианты могут использовать один и тот же черновик - тогда можно проверить реакцию не на содержимое, а на время выпуска.

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

Если участников меньше количества вариантов (при охвате 100%) или меньше количества вариантов + 1 (при охвате не 100%), то тестирование при запуске сразу перейдёт в состояние "завершено". Другими словами - каждому варианту и победителю должен достаться хотя бы один получатель.

Если процент тестового охвата равен 100, то выпуска-победителя не предусматривается.

Если тестирование НЕ в состоянии "ожидает запуска" то менять процент и группу уже нельзя.

Если тестирование НЕ в состоянии "ожидает запуска" то добавлять или удалять варианты писем уже нельзя.

Если тестирование НЕ в состоянии "ожидает запуска", то его нельзя удалить.

Изменить вариант письма можно только если тестирование в состоянии "ожидает запуска" или дата запуска варианта письма ещё не прошла или и тестирование не активно и изменяемый вариант ещё не выпущен.

Пока тестирование не в состоянии "победитель выбран" или "завершено" можно поменять способ выбора победителя.

Если тестирование в состоянии "завершено", то можно изменить только его название.

В выпуске А/B-тестирования проверка на работоспособность ссылок ни когда не проводится (а в обычных рассылках она по умолчанию включена), так как такая проверка типичный источник проблем когда одна часть теста выходит, а другая - нет. Но вы можете явно указать у нужных ссылок что их таки надо проверять.

Список сплит-тестирований

{
 "action" : "issue.split.list" 

-- параметры фильтрации, должен быть хотя бы один параметр
--
-- если выбрана последняя порция списка то ответ содержит "last_page" : 1
--
-- доступны поля
--
-- split.id -- "идентификатор сплит-тестирования" 
-- split.name -- "название" 
-- split.percent -- "процент аудитории для тестирования" 
-- split.active -- "активность" -- 0|1
-- split.state -- "состояние тестирования" 
-- split.group.gid -- символический код группы для получения аудитории. не masssending и не personal
-- split.group.name -- название группы

-- split.winner.by -- способ выбора победителя (null,"manual","click","read","unsub")
-- split.winner.after -- момент выбора победителя

-- split.create.time -- "дата создания" (Ys)
-- split.update.time -- "дата изменения" (Ys)
--

,"filter" : [ фильтр в синтаксисе stat.uni ]

,"order" : [ сортировка ответа в синтаксисе stat.uni ]

,"skip" : количество пропускаемых записей от начала списка -- по умолчанию 0

,"first" : количество выбираемых записей после skip -- по умолчанию 50, не более 50

}

ответ

{
 "list" : [
            {
             "id" : номер тестирования

            ,"name" : "название" 

            ,"group" : код группы

            ,"group.name" : название группы

            ,"active" : "активность" 

            ,"state" : "состояние" 

            ,"percent" : "процент тестирования" 

            ,"winner.by" : "способ выбора победителя" 

            ,"winner.after" : "момент запуска победителя" 

            ,"create.time" : "дата и время создания" -- Ys, null

            ,"update.time" : "дата и время последнего изменения" -- Ys, null

            ,"winner.at" : "дата-время" -- Ys, null
                                        -- прогнозируемое время выпуска победителя если он ещё не вышел
                                        -- реальное время выхода победителя если он вышел

            ,"split.variants.at" - [ дата-время, дата-время,... ] - запланированные времена выпуска вариантов Ys
            }

          ,
             ......
          ]
}

Создать сплит-тестирование

{
 "action" : "issue.split.create" 

 ,"name" : "название" 

 ,"group" : "код группы" -- группа для получения аудитории. только группы c типом адресов email. не masssending и не personal.

 ,"percent" : процент аудитории для тестового охвата. от 1 до 100. целое число.

 ,"winner.by" : manual | read | click | unsub  -- способ выбора победителя
                                               -- manual - в ручную
                                               -- read   - больше чтений
                                               -- click  - больше кликов
                                               -- unsub  - меньше отписок
                                               -- игнорируется, если процент равен 100

 ,"winner.after" : "DD hh" -- момент запуска победителя - через сколько дней (DD) и часов (hh) после выпуска последнего
                           -- теста автоматически выбрать победителя
                           -- игнорируется, если процент равен 100 или способ выбора победителя manual

 ,"active" : 0|1 -- активность. 0 - приостановлено. 1 - активно

  -- не обязательно

 ,"return_fresh_obj" : "нужно вернуть данные объекта -- да, нет ( 1 | 0 - по умолчанию)" 
}

ответ

{
   <общие поля>

 ,"id" : номер тестирования
}

если "return_fresh_obj" : "1" 

ответ -- как на запрос "issue.split.get" соответствующего тестирования

Прочитать сплит-тестирование

{
 "action" : "issue.split.get" 

 ,"id" : номер тестирования
}

ответ

{
   <общие поля>

 ,"id" : номер тестирования

 ,"name" : "название" 

 ,"group" : код группы для получения аудитории

 ,"group.name" : название группы

 ,"percent" : процент аудитории для тестирования

 ,"winner.after" : "DD hh" -- момент выбора победителя.

 ,"winner.by" : "способ выбора победителя" 

 ,"active" : "активность" 

 ,"state" : "состояние тестирования" -- назначается автоматически
             -- 0 - ожидает запуска
             -- 1 - подготавливается к запуску
             -- 2 - запущено
             -- 3 - ожидает выбора победителя
             -- 5 - победитель выбран (да именно 5, а не 4)
             -- 4 - завершено
             -- -1 - ошибки

 ,"create.time" : "дата и время создания" -- Ys, null

 ,"update.time" : "дата и время последнего изменения" -- Ys, null

 ,"winner.at" : "дата-время" -- Ys, null
                             -- прогнозируемое время выпуска победителя, если он ещё не вышел
                             -- реальное время выхода победителя, если он вышел

 ,"parts" : [ -- список вариантов тестовых писем как в issue.split.list
             {
              "id" : номер варианта

             ,"start.at" : "плановое время запуска" 

             ,"issue.at" : "номер выпуска" -- если вариант уже выпущен для теста

             ,"issue.winner" : "номер выпуска" -- если вариант уже выпущен как победитель

             ,"is_winner" : 0|1 - вариант выбран как победитель
             }

            ,{
              ......
             }

             .......
            ]
}

Изменить сплит-тестирование

{
 "action" : "issue.split.set" 

 ,"id" : номер тестирования

-- не обязательные поля. не указанное поле сохранит прежнее значение

 ,"name" : название

 ,"group" : группа для получения аудитории. не masssending и не personal
            -- изменение игнорируется если состояние тестирования не "ожидает запуска" 

 ,"percent" : процент аудитории для тестового охвата.
            -- изменение игнорируется если состояние тестирования не "ожидает запуска" 
            -- при установке в 100 очищаются поля winner.by и winner.after
            -- при установка в не 100 требуется указать winner.by

 ,"winner.by" : способ выбора победителя
            -- изменение игнорируется, если процент равен 100
            -- изменение игнорируется, если состояние тестирования "победитель выбран" или "завершено".
            -- при установке в manual очищается поле winner.after
            -- при установке не в manual требуется указать winner,after

 ,"winner.after" : момент запуска победителя
            -- изменение игнорируется, если процент равен 100 или способ выбора победителя manual
            -- изменение игнорируется, если состояние тестирования "победитель выбран" или "завершено".

 ,"active" : активность
             -- изменение игнорируется, если состояние тестирования "победитель выбран" или "завершено".

 -- не обязательно

 ,"return_fresh_obj" : "нужно вернуть данные объекта -- да, нет ( 1 | 0 - по умолчанию)" 
}

ответ

{
   <общие поля>
}

если "return_fresh_obj" : "1" 

ответ -- как на запрос "issue.split.get" соответствующего тестирования

Удалить сплит-тестирование

Нельзя удалять тестирование в состоянии "запущено" и выше, так как при таком состоянии уже был как минимум один выпуск.

{
 "action" : "issue.split.delete" 

 ,"id" : номер тестирования
}

ответ

{
   <общие поля>
}

Выпустить победителя

Указывает какой вариант считать победителем и сразу выпускает его.

Допустимо при ручном способе выбора победителя если уже вышли все варианты, но победитель ещё не выбран.

Допустимо при автоматическом способе выбора победителя если уже вышли все варианты и не прошло время автоматического выбора.

Не допустимо если процент тестирования 100.

{
 "action" : "issue.split.winner" 

 ,"variant.id" : номер варианта
}

ответ

{
   <общие поля>

 ,"track.id" : "номер трекера" 

}

Список вариантов писем сплит-тестирования

{
 "action" : "issue.split.variant.list" 

,"split.id" : номер тестирования
}

ответ

{
   <общие поля>

 ,"list" : [
             {
               "id" : номер варианта

               ,"start.at" : "плановое время запуска Ys" 

               ,"issue.at" : "номер выпуска" 

               ,"state" : "состояние" 

               ,"issue.winner" : "номер выпуска"  -- если уже выпущен как победитель

               ,"is_winner" : 0|1 - вариант выбран как победитель

               ,"start.winner.at" : "время запуска Ys"  -- если уже выпущен как победитель

               ,"draft.id" : "номер используемого черновика" 
             }
            ,........
           ]
}

Создать вариант

Нельзя создать новый вариант если тестирование не в состоянии "ожидает выпуска"

{
 "action" : "issue.split.variant.create" 

 ,"split.id" : номер тестирования

-- параметры варианта

 ,"start.at" : "YYYY-MM-DD hh:mm" -- плановое время запуска. Ys

 ,"draft.id" : "номер используемого черновика" 

  -- не обязательно

 ,"return_fresh_obj" : "нужно вернуть данные объекта -- да, нет ( 1 | 0 - по умолчанию)" 
}

ответ

{
   <общие поля>

 ,"id" : номер варианта тестирования
}

если "return_fresh_obj" : "1" 

ответ -- как на запрос "issue.split.variant.get" соответствующего варианта

Прочитать вариант

{
 "action" : "issue.split.variant.get" 

 ,"id" : номер варианта

}

ответ

{
   <общие поля>

 ,"id" : номер варианта

 ,"split.id" : номер тестирования куда входит этот вариант

 ,"start.at" : "YYYY-MM-DD hh:mm" -- время запуска. дата и время с точностью до минуты

  ,"state" : 0 - ожидает запуска
            2 - запущено задание на выпуск рассылки. issue.at (winner.at) будет заполнено как только при старте рассылки ей будет присвоен номер
           -1 - выпуск завершился ошибкой. подробности в трекере

 ,"draft.id" : "номер используемого черновика" 

 ,"issue.at" : "номер выпуска" -- если вариант уже выпущен для теста

 ,"issue.winner" : "номер выпуска" -- если вариант уже выпущен как победитель

 ,"start.winner.at" : "время запуска Ys"  -- если уже выпущен как победитель

 ,"is_winner" : 0|1 - вариант выбран как победитель

}

Изменить вариант

Изменить вариант письма можно только если тестирование в состоянии "ожидает запуска" или дата запуска варианта письма ещё не прошла или и тестирование не активно и изменяемый вариант ещё не выпущен.

{
 "action" : "issue.split.variant.set" 

 ,"id" : номер варианта

-- параметры варианта, изменятся только явно указанные

 ,"start.at" : "YYYY-MM-DD hh:mm" -- плановое время запуска. Ys

 ,"draft.id" : "номер используемого черновика" 

  -- не обязательно

 ,"return_fresh_obj" : "нужно вернуть данные объекта -- да, нет ( 1 | 0 - по умолчанию)" 
}

ответ

{
   <общие поля>

 ,"id" : номер варианта тестирования
}

если "return_fresh_obj" : "1" 

ответ -- как на запрос "issue.split.variant.get" соответствующего варианта

Удалить вариант

Нельзя удалять вариант если тестирование не в состоянии "ожидает выпуска"

{
 "action" : "issue.split.variant.delete" 

 ,"id" : номер варианта
}

ответ

{
   <общие поля>
}