Содержание ↓
Три инструмента, которые не знают друг о друге
Обычно план кампаний лежит в таблице, производство ведут в трекере, а про A/B-тесты вспоминают в презентации, когда всё уже закончилось. Связь между ними держится в голове руководителя, и когда спрашивают, почему сдвинулся запуск и что показал похожий тест полгода назад, ответ собирают по трём окнам и паре чатов.
В Marketing OS, которую я строю для своей команды, планирование собрано в одну иерархию: план → проект → задача. Планом служит кампания в медиакалендаре. Внутри неё — проект выпуска с этапами и согласованием, а задачи — это листья дерева этапов, у каждой свой исполнитель и срок. Рядом стоит хаб экспериментов с гипотезами и A/B-тестами.
Медиакалендарь
Кампания бывает двух типов: брендовая 360 или продуктовый запуск. У неё три фазы с отдельными датами (подготовка, активный флайт, посткампейн) и цели трёх уровней: бизнес, маркетинг, коммуникация. Бюджет разложен строками по каналу, сегменту, географии и подрядчику, в каждой строке план и факт. KPI тоже идут парами за период.
Статусы кампании идут по порядку: идея, брифинг, продакшн, согласование, запуск, разбор итогов. Для каждого в схеме прописан список разрешённых следующих. Сводка раздела считает то, что обычно всплывает поздно: кампании без KPI, без креативов, без внесённого факта и просроченные.
У каждого креатива есть версии и свой статус согласования. Бриф перепечатывать не нужно, кабинет забирает его из DOCX или Excel. Если кампания связана с производством кампании, из календаря туда ведёт ссылка, а на главной связанная пара занимает одну строку.
Проект из шаблона
Шаблон проекта — дерево этапов до трёх уровней. У каждого этапа длительность по умолчанию и отметка «требует согласования». Когда создаёшь проект, кабинет копирует дерево уровень за уровнем, а даты берёт из кампании. Завести проект можно со страницы плана, из боковой панели кампании или из общего списка.
Кнопка «Авторасписание» просит одну дату — запуска. От неё код идёт назад по задачам-листьям и отводит каждой длительность из шаблона, а если длительность не задана, берёт три дня. Родительский этап получает самое раннее начало и самый поздний срок своих детей. На диаграмме Ганта видны все три уровня.
Статус родителя тоже выводится из детей: он согласован, когда согласованы все, заблокирован, если застрял хоть один, и не начат, пока не начат ни один из них. Во всех остальных случаях родитель в работе. Смена статуса пишется в историю вместе с автором и комментарием. У исполнителя свой канбан по статусам, внутри колонки задачи отсортированы по приоритету, на карточке виден путь «план › проект».
Эксперименты: от гипотезы до вывода
У гипотезы четыре обязательных поля: что меняем, чего ждём, почему так думаем и по какому сигналу поймём, что получилось. Приоритет считают три формулы рядом. Основная — своя формула, в кабинете она называется CVM: охват × влияние × вес метрики × уверенность, делённое на трудозатраты. Фактически это RICE, в котором у каждой метрики свой вес. Вес открытий письма занижен до 0,3, потому что защита приватности в Apple Mail завышает открытия. RICE и ICE стоят рядом для калибровки.
У эксперимента 8 статусов, идут они строго по цепочке. В запуск он переходит только при шести условиях: есть главная метрика, есть защитная, задан минимальный эффект, рассчитан размер выборки, есть контрольный вариант и хотя бы один тестовый. Если чего-то не хватает, карточка на доске возвращается на место со списком недостающего.
Закрывая эксперимент, человек выбирает решение — внедрить, доработать или закрыть — и пишет вывод, пустым его оставить нельзя. Выводы складываются в библиотеку с поиском и тегами. «Эффекта нет» — нормальный итог, его тоже записывают: он экономит следующий такой же тест.
Что считает код, что предлагает модель
Переходы статусов, расписание, свёртку статусов снизу вверх и статистику тестов считает код. Значимость проверяет z-тест для двух долей, перекос трафика между вариантами — хи-квадрат. Отписки, жалобы на спам, доставляемость и недоставленные письма идут как защитные метрики: код сравнивает их с порогами, зашитыми константами, и подсвечивает карточку одним из трёх цветов.
Модель работает только в копилоте медиакалендаря. Она видит список кампаний и может предложить создать новую или сменить статус, запись же делает код после подтверждения человека. Числа, по которым принимают решение, модель у меня не считает: такие метрики дрейфуют от прогона к прогону.
Грабли
Невидимые гипотезы. Хаб выглядел готовым, а цикл обрывался на первом шаге: действие «создать эксперимент из гипотезы» было написано и ни разу не вызывалось из интерфейса. Гипотеза без эксперимента не показывалась ни в одном виде доски и пропадала с экрана. Теперь полноту цикла я проверяю поиском: каждое серверное действие обязано вызываться хотя бы из одного компонента.
Третий уровень. Диаграмма Ганта сначала рисовала два уровня этапов, третий лежал в базе и на экран не попадал. Помог рекурсивный рендер, а при следующей переделке экранов этот баг проверяли отдельно.
Потолок в 1000 строк. База через API отдаёт не больше 1000 строк за запрос, и счётчики задач в портфеле молча недосчитывались. Все выборки портфеля теперь постраничные.
Медленная панель. Карточка эксперимента открывалась переходом по адресу, и даже закрытие гоняло полный серверный рендер плюс три списка для выпадающих полей, около 3,2 секунды. Server Actions в Next.js выполняются по очереди, Promise.all их не распараллеливает. Сейчас открытие и закрытие живут в состоянии клиента, а списки грузятся один раз на страницу.
Долг, который пока висит: в боковой панели кампании список проектов показывает пустую заглушку, целиком он работает только на странице плана. Заглушка выглядит как «проектов нет», и по ней легко решить, что проект никто не заводил.
Как повторить у себя
Начинать стоит с иерархии. Договоритесь, что у вас считается планом, что проектом и что задачей, и решите, к какому уровню привязан бюджет. Пока в схеме нет живых кампаний, её можно перекраивать как угодно. Потом каждая такая правка превращается в миграцию данных.
Гейт запуска эксперимента работает и в обычной таблице: шесть обязательных полей, без них тест не стартует. Собрать такой контур под свою команду можно на консультации. Если планирование — только часть задачи, начните со страницы про внедрение ИИ в маркетинг.
- Next.js 15
- TypeScript
- Supabase (Postgres)
- Server Actions
- dnd-kit
- OpenAI gpt-4.1-mini
- импорт Excel
