Перейти к содержимому
LinkProfit

Ротаторы ссылок и самооптимизирующиеся split-тесты

LinkProfit Team10 мин чтения
  • ab-testing
  • link-rotator
  • analytics
На этой странице

Две функции выглядят в списке возможностей почти одинаково и отвечают на совершенно разные вопросы. Ротатор раскладывает трафик одной короткой ссылки по нескольким адресам назначения. A/B-тест делит трафик между вариантами и говорит, какой из них справился лучше. Обе ставят за одной ссылкой больше одного адреса; измерением из них является только одна.

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

Ротатор — рабочий инструмент, split-тест — измерение

Различие не академическое. От него зависит, какое поведение достаётся вам даром, а какое придётся обходить руками.

| | Ротатор адресов назначения | Split-тест A/B | | --- | --- | --- | | Зачем нужен | Держать один адрес рабочим при меняющихся адресах назначения | Сравнить адреса назначения и решить | | Веса | Относительные, любые значения | Целые, в сумме ровно 100 | | Набор вариантов | Меняется постоянно, до двадцати | Фиксирован на всё время теста | | Ограничения на каждый | Лимиты кликов, окна дат, фильтры по стране и устройству | Нет — вариант есть вариант | | Обработка отказов | Недоступный адрес выводится автоматически | Не предусмотрена | | Чем кончается | Ничем; продолжает работать | Победителем или честным «пока рано» |

Ротатор оправдывает себя, когда стабилен адрес, а адреса назначения движутся: напечатанный код, который переживёт три оффера, ссылка в профиле, партнёрское размещение, где рекламодатель меняет креативы каждую неделю. Split-тест оправдывает себя, когда у вас есть один вопрос и достаточно трафика, чтобы на него ответить. Вести в одном аккаунте и то и другое на разных ссылках — нормально; вести и то и другое на одной ссылке обычно означает, что одно из двух не делает ничего.

Веса относительны и пересчитываются по тем, кто годится

Веса ротатора — это доли, а не проценты. Доля адреса назначения равна его весу, делённому на сумму весов тех адресов, которые сейчас годятся в кандидаты, — поэтому веса 3, 2 и 1 означают половину, треть и шестую часть, и ничего не нужно пересчитывать руками, когда вы добавляете четвёртый.

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

У ротатора есть и два распределения без весов: round robin — по кругу, когда идущие подряд клики уходят на идущие подряд адреса назначения, — и равномерное, которое делит трафик поровну. Для раскладки нагрузки между зеркалами нужен именно round robin: это единственный режим, гарантирующий, что два подряд идущих клика попадут в разные места.

Split-тест A/B ведёт себя ровно наоборот, и на то есть причина. Его веса — целые числа, обязанные давать в сумме ровно сто, потому что редиректор укладывает посетителя в корзину от 0 до 99 и идёт по накопленным весам: любой разрыв в этом диапазоне означал бы трафик, который никто не обслужит. Взвешенное распределение ротатора проверяется на ста тысячах синтетических посетителей и обязано укладываться в один процентный пункт от настроенных долей — это та точность, которой стоит ждать от любого инструмента, заявляющего, что он делит трафик.

Как удержать одного посетителя на одном адресе назначения

Ротация без закрепления даёт бессмыслицу. Посетитель открывает ссылку, видит оффер A, возвращается через час, видит оффер B — и любой отчёт по воронке, построенный на этих кликах, становится вымыслом: не слегка неточным, а именно вымыслом, потому что числитель и знаменатель теперь описывают разные страницы.

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

Два следствия лучше знать заранее, чем обнаружить. Посетитель, очистивший cookie или пришедший с другого устройства, откатывается к выведенному выбору: он устойчив в пределах суток, но не обязательно между сутками — тот же размен, на который идёт слой аналитики, чтобы не хранить постоянный идентификатор. А закреплённый посетитель остаётся закреплённым и после того, как вы поменяли веса, потому что закрепление сильнее распределения, пока адрес назначения ещё годится в кандидаты.

Одна деталь реализации даёт заметный эффект. Ротатор выводит свою корзину из другого куска отпечатка посетителя, чем split-тест A/B. Общий кусок связал бы два выбора между собой, и все, кто попал в вариант A, систематически видели бы только часть списка адресов назначения.

Проверка доступности и вывод мёртвой страницы из ротации

Адреса назначения портятся. Партнёр снял страницу, истёк сертификат, оффер закрыли, домен не продлили — и он вернулся страницей-парковкой, продающей сам себя. А короткая ссылка всё это время отправляет свою долю трафика в стену, и никто не замечает до недельного отчёта.

Проверка по расписанию идёт по каждому адресу назначения так же, как пошёл бы посетитель, и записывает четыре вещи: код ответа, число переходов в цепочке редиректов, время ответа и срок действия TLS-сертификата. Ещё она сверяет страницу с отпечатком, снятым при добавлении адреса, — конечный хост и заголовок страницы, — и именно так ловится URL, который теперь отдаёт здоровый 200 со страницы-парковки. На той же пробе стоит проверка ссылок, а один адрес перепроверяется не чаще раза в пятнадцать минут, чтобы большое рабочее пространство не превратило собственный мониторинг в источник трафика.

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

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

Лимиты, которые держатся в edge-сети

Лимит кликов имеет смысл, только если держится, когда одну и ту же ссылку одновременно открывают в десятке стран. Независимые счётчики в каждом регионе — это ровно то, из-за чего адрес назначения с лимитом в тысячу кликов отдаёт тысячу четыреста: четырнадцать дата-центров досчитали до сотни каждый, и каждый считал, что не вышел за предел.

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

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

Как на самом деле работает самооптимизация

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

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

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

Вот как выглядит прогон на двух вариантах после того, как оба порога пройдены:

| Вариант | Клики | События цели | Сырая доля | Сглаженная оценка | Новый вес | | --- | --- | --- | --- | --- | --- | | A | 620 | 31 | 5,00% | 5,14% | 54 | | B | 610 | 25 | 4,10% | 4,25% | 46 |

Обратите внимание на то, чего алгоритм не сделал. Относительная разница примерно в пятую часть по доле конверсий дала разделение 54/46, а не 90/10, потому что пересчёт весов пропорционален оценке, а не устроен по правилу «победитель забирает всё». Автоматическая оптимизация наклоняет, а не переключает. Нужен переключатель — закрепите победителя руками: это уводит весь трафик на один адрес назначения и заканчивает эксперимент, а решение записывается в историю ссылки рядом с автоматическими.

Почему минимальная выборка идёт раньше всего этого

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

Причина не в статистической придирчивости, а в форме ссылочного трафика. Первые часы кампании определяются тем каналом, который опубликовал ссылку первым, и автоматическим трафиком, который её сканирует, — об этом наш гид о том, как отслеживаются клики по ссылкам. Доля, посчитанная на этом окне, описывает расписание публикаций, а не страницы. Хуже того: оптимизатор, действующий по ней, обделяет вариант, которому случилось стартовать в тихий час, и обделённый вариант дальше набирает свидетельства медленнее — ранняя ошибка сама себя усиливает. Нижний предел ограничивает ущерб; пороги его предотвращают.

Двух вещей автоматический режим не делает. Это пропорциональный пересчёт весов, а не последовательный тест: он не считает уровень значимости и никогда не объявляет победителя — объявление остаётся действием человека, совершаемым рядом с пометкой о достоверности, которую экран split-теста печатает под таблицей вариантов. И выборка, по которой идёт пересчёт, осмысленна ровно настолько, насколько осмысленна поданная вами цель: если успехом считается каждый клик, все варианты по построению получают одинаковую оценку, и разделение остаётся фактически ровным. Наклон требует цели, до которой доходит не каждый клик, — её и записывает по вариантам отслеживание конверсий; подписанный идентификатор клика везёт метку варианта, поэтому заказы и выручка раскладываются по вариантам в отчётах, описанных в разделе конверсии.

Когда ротатор не нужен

| Ситуация | Что подойдёт лучше | | --- | --- | | Сейчас один адрес назначения, через месяц другой | Правка адреса назначения: короткий адрес и его история не меняются | | Своя страница для каждого рынка | Упорядоченные правила таргетинга — детерминированные и читаемые | | Один вопрос и две страницы-кандидата | Обычное разделение с пометкой о достоверности | | Телефоны в приложение, компьютеры на сайт | Поля deep link у ссылки | | Несколько зеркал одной страницы | Ротатор в режиме round robin — случай, ради которого он и сделан |

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

Настройка, которая держится

  1. Начинайте с самого простого инструмента, отвечающего на вопрос, и добавляйте ротацию только тогда, когда список адресов назначения действительно меняется.
  2. Ставьте окно закрепления длиной хотя бы в сессию всему, за чем стоит воронка, и ноль — только для раскладки нагрузки.
  3. Давайте каждому адресу назначения лимит или окно, если у него есть настоящее ограничение, и задавайте резервный адрес, чтобы исчерпание не оборачивалось страницей ошибки.
  4. Включайте автоматический вывод из ротации для адресов назначения, которыми вы не управляете, и оставляйте его выключенным там, где короткий сбой лучше молчаливого перераспределения.
  5. Дайте периоду разогрева и минимальной выборке закончиться, прежде чем что-то вычитывать из самооптимизирующегося split-теста, и посмотрите на пометку о достоверности, прежде чем закреплять победителя.
  6. Читайте результаты по каждому адресу назначения: событие клика запоминает, кто его обслужил, поэтому клики, уникальные посетители и выручка раскладываются именно так.

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

О чём обычно спрашивают

Чем ротатор отличается от A/B-теста?

A/B-тест — это измерение с фиксированным набором вариантов, фиксированным сроком и решением в конце. Ротатор — рабочий инструмент: адреса назначения приходят и уходят, несут лимиты кликов и окна дат, обслуживают отдельные страны или типы устройств и выключаются сами, когда ломаются. Отсюда и разная механика: веса split-теста обязаны давать в сумме ровно сто, а веса ротатора относительны, и долю выбывшего адреса забирают остальные. Split-тест берут, когда есть вопрос; ротатор — когда есть работающая схема.

Должны ли веса ротатора давать в сумме 100?

Нет. Вес в ротаторе относителен: доля адреса назначения — это его вес, делённый на сумму весов тех адресов, которые сейчас годятся в кандидаты. Веса 3, 2 и 1 означают половину, треть и шестую часть, а если средний выберет свой дневной лимит, двое оставшихся немедленно поделят трафик как три к одному. Split-тестирование A/B устроено наоборот и отказывается сохраняться, пока веса не дадут ровно сто: редиректор сравнивает корзину от 0 до 99 с накопленными весами, и любой разрыв оставил бы часть трафика без адреса.

Всегда ли один и тот же посетитель попадёт на один и тот же адрес?

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

Как проверка доступности решает, что адрес назначения сломан?

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

Сколько трафика нужно самооптимизирующемуся тесту, чтобы пересчитать веса?

Должны открыться два шлагбаума. Период разогрева держит распределение ровным заданное календарное время, а минимальная выборка держит его ровным, пока варианты не наберут между собой достаточно кликов — по умолчанию тысячу. Ниже любого из порогов оптимизатор не подстраивает ничего вовсе, а не подстраивает чуть-чуть, и это сделано намеренно: пересчёту весов можно верить ровно настолько, насколько велика самая маленькая выборка под ним, а ранние данные здесь описывают тот канал, который опубликовал ссылку первым.

Когда ротатор — неподходящий инструмент?

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