ПЦ Директ кабинет (AI-сервис контекстной рекламы)
Рабочее место директолога Пульс Цен: запуск Директа по брифу, аналитика кампаний, сбор информации (вордстат/конкуренты), статистика и отчёты. ИИ-пайплайн подготовки + человеческий журнал всех изменений. Рамки: только ПЦ.
готовS1 · Фундамент5/5
Цель: Монорепо, схема БД, auth+RBAC, стейт-машина пайплайна, деплой на cfru по IP
В РАБОТЕS2 · Клиенты и стандартный бриф2/3
Цель: Заведение клиента, форма/загрузка брифа, подключение кабинетов
планS3 · Аудит сайта и AI-анализ бизнеса0/3
Цель: Гейт запуска: сайт не прошёл — РК не создаётся, клиенту документ рекомендаций
планS4 · Конкуренты и семантика0/3
Цель: Анализ конкурентов + вордстат-семантика с минусами
планS5 · Объявления и создание РК0/3
Цель: Комбинаторные объявления и черновики кампаний в Директе
планS6 · Контроль качества, запуск, самоисправление0/3
Цель: QA-гейт, запуск с подтверждением бюджета, автофиксы
В РАБОТЕS7 · Метрики и непрерывная оптимизация13/21
Цель: ПРИОРИТЕТ: рабочее место = анализ и статистика живых кампаний. Reports API + Метрика ПЦ, дашборд статистики, отчёты
планS8 · Прод-готовность0/3
Цель: Права, безопасность, домен, приёмка
В РАБОТЕS9 · РСЯ и креативы1/5
Цель: Сетевые кампании + генерация и управление картинками/видео в объявлениях (Kie, adimages)
Ворклог (места остановки)
1) НАЙДЕН И ЗАКРЫТ БАГ: настройки кампании не сохранялись (жалоба владельца на тумблер Мониторинг сайта). Причина: Директ отвергает пустой Items ([] = ошибка не менее 1 элемента) и роняет ВЕСЬ campaigns.update — у РК МСК нет минус-фраз/целей/счётчиков, поэтому падало именно там, а на Брендовых работало. Фикс: пустые списки шлём null (NegativeKeywords, ExcludedSites, BlockedIps, CounterIds, PriorityGoals). Проверено на живой РК МСК: ENABLE_SITE_MONITORING=YES сохранился. Плюс ошибки сохранения теперь видны красной карточкой, а не серой строкой, и форма перечитывает данные из Директа после записи. 2) Создать с помощью ИИ в объявлениях: поля задача / тема картинки / референс товара (ссылка или загрузка файла — публичный URL берём из adimages), выбор количества заголовков и текстов, формат картинки. Тексты — OpenRouter (контекст собирает КОД: кампания, группа, её фразы, действующие объявления, посадочная), картинка — Kie gpt-image-2 (text-to-image, с референсом image-to-image) с автозагрузкой в Директ. Гейт денег: картинка отдельной кнопкой с подтверждением ~2,5 руб.
→ Ждёт ок владельца на платные боевые тесты: генерация текстов (~0,1 руб OpenRouter) и картинки (~2,5 руб Kie). Дальше: ButtonExtension/Carousel эксперимент, РСЯ-кампании, РАГ-стандарты для ИИ.
По фидбеку владельца: 1) сортировка кликом по колонкам во всех таблицах (Группы, Ставки и фразы, Запросы, Площадки) — 1-й клик по убыванию, 2-й по возрастанию, пустые всегда внизу; проверено на живых данных (запросы по кликам 1055→0, фразы по расходу топ 25941 руб). 2) Редактирование КОМБИНАТОРНЫХ объявлений: PATCH kind=responsive (v501 ResponsiveAdUpdate, Titles/Texts простыми массивами), форма правки = форма создания (единый компонент RespFields): заголовки 1-7, тексты 1-3, картинки до 5 с банком кампании и загрузкой, цена. Задеплоено, смоук headless-браузером, JS-ошибок нет. Сохранение правки в бою не жал — перемодерация живого объявления.
→ Ждёт ок владельца: тестовое создание/правка комбинаторного в живой группе + эксперимент ButtonExtension/Carousel в add. Дальше S9: РСЯ-кампании, Kie-генерация картинок, видео-креативы; затем ИИ-исполнитель + РАГ-стандарты.
По фидбеку владельца (скрины Директа): 1) фильтры на Ставки и фразы (поиск/группа/статус/только с показами; массовая ставка теперь по отфильтрованным); 2) картинки объявлений видны в кабинете (РК МСК: 8 комбинаторных с картинками и статистикой); 3) создание КОМБИНАТОРНОГО объявления: 1-7 заголовков, 1-3 текста, до 5 картинок (банк кампании + загрузка своей через adimages.add), цена, живое превью в стиле РСЯ. Найдено: v501 get отдаёт ButtonExtension и Carousel (дока add молчит) — добавление кнопки/карусели требует эксперимента. Контракт /ads/responsive структурированный — под будущего ИИ-исполнителя. Всё задеплоено, UI проверен headless-браузером, JS-ошибок нет.
→ 1) Тестовое комбинаторное объявление в живой группе (ждёт ок владельца) + эксперимент ButtonExtension/Carousel в add. 2) Редактирование существующих комбинаторных. 3) S9: РСЯ-кампании, генерация картинок Kie, видео-креативы. 4) Потом РАГ-память стандартов для ИИ-заполнения (идея владельца).
Этап A (глубина кабинета) задеплоен на прод: 1) статистика по группам/объявлениям/фразам/площадкам/поисковым запросам (единый getBreakdownReport поверх Reports API, 5 уровней) — колонки в Группах/Объявлениях/Фразах + новые вкладки Запросы и Площадки; 2) настоящие ставки: keywordbids с данными аукциона, правка при ручной стратегии, массовая установка; корректировки bidmodifiers (моб/десктоп/пол-возраст add, ретаргетинг видим); 3) импорт кампаний из Директа (owner-only — общий кабинет не палим специалистам); 4) редактор объявлений добит: ссылка+отображаемая ссылка, создание нового объявления, архив. Всё проверено headless-браузером на живой кампании Брендовые запросы (скрины). Роадмап: добавлен спринт 9 РСЯ и креативы, в S7 две новые задачи. Gap-анализ всего проекта сделан заново (7 из 8 шагов пайплайна — заглушки, campaigns.add нет, adimages нет).
→ Этап B (спринт 9): создание РСЯ-кампаний, генерация картинок через Kie (гейт ок-трачу), adimages загрузка и картинки в объявлениях, ресёрч видео в API. Потом этап C — оживить пайплайн бриф→РК (шаги 2-8, campaigns.add/adgroups.add/ads.add), потом этап D — ИИ-исполнитель советов (OptimizationAction). Мелочи из SCOPE-CUTS-LOG: инд. сайтлинки на объявление, гео-корректировки, ставка из аукциона.
Баг «цель показывает общее количество без привязки к кампании»: расследовано — привязка к кампании РАБОТАЛА, подвело СЕМПЛИРОВАНИЕ Метрики (accuracy по умолчанию: считала по 31% выборке, отдавала дробные 6.385, UI в ру-локали показал «6,385» — читалось как 6385). Фикс: accuracy=full во всех запросах к Метрике (точные числа без выборки) + округление + автоперезагрузка статистики при смене выбранных целей (не надо жать Показать). Проверено: та же цель за месяц = 4 конверсии с кампании (вместо «6385»), Регистрация = 96, разбивка по 26 дням корректна.
→ Дальше второй блок: корректировки ставок, временной таргетинг, создание группы/объявления, ИИ-исполнитель.
Доработка по уточнению владельца: в Обзоре кампании теперь можно анализировать ЛЮБЫЕ цели счётчика, а не только цели стратегии. Селектор целей — чипы + поиск по названию среди всех целей счётчика (551 шт.): регистрация, звонки, заказы, формы и т.д. По умолчанию предзаполняется целями кампании. Каждая выбранная цель — строкой с конверсиями и своей ценой конверсии за выбранный период и атрибуцию. Проверено: Листинг-Заказ=2, ПКТ-Заказ=2, Регистрация=25 за неделю по Брендовым.
→ Второй блок редактора: корректировки ставок, временной таргетинг, создание группы/объявления, ИИ-исполнитель.
Детальная аналитика по наказу владельца: в Обзоре кампании появились (1) фильтр периода — пресеты 7/14/30/90 дней + произвольные даты с/по; (2) выбор модели атрибуции: последний значимый / последний / первый переход (фильтр Метрики параметризован); (3) конверсии по КОНКРЕТНЫМ целям — таблица «Конверсии по целям» с количеством и ценой конверсии по каждой цели отдельно. Данные за период тянутся live из Директ Reports + Метрики (по-цельные запросы устойчивы к целям чужих счётчиков). Проверено на Брендовых: за 7 дней Регистрация = 25 конверсий (lastsign) vs 15 (first) — атрибуция реально меняет картину.
→ Мелочь: имена целей вне management-списка показываются как «Цель №N». Дальше по плану: корректировки ставок, временной таргетинг, создание группы/объявления, ИИ-исполнитель.
Ближайший блок аналитики закрыт: (1) авто-сбор статистики кроном каждые 6 часов по всем кампаниям — кнопку жать больше не нужно, сборщик общий для крона и кнопки (вынесен в пакет direct-api вместе со всем Директ-модулем); (2) конверсии по целям стратегии из Метрики в статистике: колонка «Конверсии» по дням + карточки «Конверсии» и «Цена конверсии» в сводке (по Брендовым: 19 конверсий 21.07); цель оптимизации в стратегии — выпадающим списком с названиями; (3) вордстат-инструмент «Подбор фраз»: фразы + регионы по названиям -> частотность из Вордстата (API v4) -> галочками добавить в группу кампании. Пофикшены: management-цели Метрики не содержат часть реальных целей (убран фильтр, деградация по одной), вордстат-ретрай на «report is being generated».
→ Второй блок: корректировки ставок (перенос из LF), временной таргетинг, визитка, создание группы/объявления из кабинета. Третий: ИИ-исполнитель «применить совет» + авто-оптимизации с фиксацией сроков. Владельцу: посмотреть «Подбор фраз» и конверсии в кампании.
UX-доработка по наказу владельца (юзабилити для простого директолога): (1) регионы показа — больше никаких ID: чипы с названиями + живой поиск по справочнику Директа (дикшинари кэшируется в памяти api, поиск серверный: Москва/Екатеринбург/Россия...), в таблице групп регионы тоже названиями; (2) быстрые ссылки — отдельные поля Название/Ссылка/Описание построчно с добавлением/удалением строк, ссылки показываются ЧИСТЫМИ (без UTM-каши), UTM автоматически добавляется при сохранении из поля «Параметры URL» ко всем ссылкам включая быстрые; (3) уточнения — чипы с крестиками, добавление по Enter. Проверено: поиск отдаёт Екатеринбург (54), имена по ID резолвятся.
→ Владельцу посмотреть глазами. Дальше: цели в стратегии тоже выпадающим списком (не ID), временной таргетинг сеткой, корректировки ставок, ИИ-исполнитель.
Владелец справедливо указал, что быстрые ссылки/уточнения/UTM и смена стратегии реализуемы через API (делали в LF) — признано и реализовано, сверено с боевым кодом LF. Кабинет теперь: (1) СМЕНА СТРАТЕГИИ из UI — 6 типов (макс.конверсий, макс.кликов, ср.CPA, ср.CPC, оплата за конверсии, ручные ставки) с полями по типу, тумблер показов в сетях, confirm о сбросе обучения; (2) БЫСТРЫЕ ССЫЛКИ (до 8, Название|href|Описание), УТОЧНЕНИЯ и ПАРАМЕТРЫ URL (UTM с шаблонами {campaign_id}/{ad_id}/{keyword}) — редактируются и применяются ко всем объявлениям кампании разом (sitelinks.add + adextensions.add + масс-ads.update); (3) РЕДАКТОР ГРУППЫ — регионы показа, минус-фразы группы, просмотр фраз группы с удалением и добавлением пачкой (keywords.add/delete). Чтение проверено на Брендовых: 6 ссылок, 8 уточнений, UTM utm_source=brend-contex — совпало со скринами владельца 1в1. Плашка ограничений сужена до реально недоступного в API (промоакции, эксперименты, Neuro Ads, приоритизация, сегменты Аудиторий).
→ Владельцу: проверить запись безобидной правкой. Дальше: автотаргетинг категорий группы (проверить поддержку в API v5), корректировки ставок (bidmodifiers — код есть в LF), временной таргетинг, ИИ-исполнитель, вордстат-инструмент.
Вкладка «Настройки» кампании расширена до уровня Директа (по скринам владельца): секции Стратегия (тип + недельный и дневной бюджет), Счётчики Метрики (редактируемые), Целевые действия и их ценность (цели с ₽, добавление из выпадающего списка целей счётчика ПЦ — подтянута 551 цель, удаление), Срок проведения (даты), Минус-фразы, Запрет показов (площадки + IP-адреса до 25), тумблеры (мониторинг сайта, расширенный гео, разметка Метрики, организация ЯБ). Смена типа стратегии намеренно оставлена только в Директе (обученная стратегия сбрасывается) — в UI есть плашка со списком того, чего API не даёт (UTM кампании, быстрые ссылки кампания-уровня, эксперименты, персонализация). Чтение проверено на Брендовых: стратегия Максимум конверсий 10000р/нед, 4 счётчика, 2 цели по 350р, IP 77.51.125.56 — всё совпало со скринами владельца.
→ Запись настроек через campaigns.update готова, но на живой кампании не гоняли — владельцу проверить на безобидной правке (например минус-фраза). Дальше: временной таргетинг (редактор сетки), корректировки ставок, быстрые ссылки/уточнения на уровне объявлений, вордстат-инструмент, цели/конверсии в статистику.
Редизайн раздела кампании по образцу Директ Про (наказ владельца: UI был слабый). Страница кампании = рабочая область с вкладками Обзор / Группы / Объявления / Ставки и фразы / Настройки. Объявления — превью как в выдаче (синий заголовок, зелёный домен, текст) + инлайн-редактирование с лимитами символов (56/30/81) + статусы «Идут показы/Остановлено». Группы — таблица с кликом-фильтром в объявления. Фразы — таблица со статусами и группами. Кампании у клиента — директо-таблица со статистикой 30 дней в строках (расход/клики/CTR/отказы из агрегатов). Цветные статус-точки. Всё на проде, страницы рендерятся.
→ Дальше по UI: период дат в статистике, массовые действия чекбоксами, ставки в таблице фраз. По функционалу: цели Метрики, вордстат-инструмент, ИИ-исполнитель.
Владелец выдал доступ к счётчику 200476 — отказы из Метрики подключены и льются в статистику обеих кампаний (пофикшен квирк: Метрика для части кампаний отдаёт Директ-ID со сдвигом +1e8, фильтр по обоим вариантам). Инсайт: отказы Брендовых 3-9% (норма), у РК МСК 33-52% при норме поиска до 20% — монитор качества зафиксирует нарушение автоматически.
→ Цели Метрики (создание через API + конверсии), затем остаток редактора и ИИ-исполнитель.
Курс на «полный функционал Директа + ИИ в каждом блоке» принят, ядро редактора готово и живое: (1) настройки кампании — дневной бюджет, минус-фразы, запрещённые площадки правятся из кабинета и сохраняются в Директ; (2) группы и объявления — просмотр, правка заголовков/текстов (с перемодерацией), пауза/включение объявления; (3) ИИ-советник в 4 блоках (статистика/семантика/объявления/настройки) — контекст собирает код из реальных данных, LLM DeepSeek через прокси, проверен живьём; (4) счётчик Метрики 200476 прописан, код отказов готов, но нужен гостевой доступ к счётчику для аккаунта ShamrayGroup1 (сейчас 403). Оставшийся объём редактора разбит на 5 задач.
→ БЛОКЕР ВЛАДЕЛЬЦУ: гостевой доступ счётчика 200476 аккаунту ShamrayGroup1 (Метрика -> Настройки -> Доступ). Дальше по списку: стратегии/корректировки/таргетинг, быстрые ссылки, создание групп/объявлений, ИИ-исполнитель «применить совет», авто-сбор статистики кроном.
Фидбек владельца отработан. (1) БАГ починен: карточка клиента отдавала «нет доступа» — падала сериализация номеров кампаний Директа (BigInt), исправлено. (2) Страница кампании: сводка за 30 дней (расход/клики/показы/CTR/цена клика), таблица по дням, кнопка «Обновить статистику» — реальный Директ Reports API; проверено на обеих живых кампаниях ПЦ (31+30 дней данных). (3) Семантика: фразы (keywords.get) и минус-слова кампании live из Директа. (4) Управление: пауза/запуск показов с подтверждением. (5) Пороги качества: редактируются инлайн, добавляются и удаляются, системные дефолты переопределяются на уровне организации. Все действия в журнале человеческим языком. Подтверждено владельцу: вордстат — только через API.
→ Метрика ПЦ: узнать/выбрать counterId, подтянуть отказы в снапшоты, создание целей через Management API и конверсии по ним. Авто-сбор статистики кроном (сейчас по кнопке). Вордстат-инструмент по API. Затем мастер создания кампании (бриф -> семантика -> объявления -> черновик в Директе).
По наказу владельца: (1) сервис переименован в «ПЦ Директ кабинет» (UI+БД). (2) Журнал изменений переведён на человеческий язык для директологов: вместо connection/pipeline/JSON — «Подключён кабинет Яндекс Директ», «Собрали ключевые фразы», «email такой-то добавил клиента»; технические детали скрыты. (3) Реальные доступы ПЦ перенесены с сервера LF в Подключения: кабинет Директа (общий, +Вордстат) и Метрика ПЦ. (4) Заведён клиент «Пульс Цен», импортированы 2 живые кампании: «Брендовые запросы» (117490954) и «РК МСК активности и оквэд» (708678710). (5) Тестовые данные удалены. Видение согласовано: рабочее место директолога = запуск + аналитика + сбор информации + статистика; приоритет S7 (статистика живых кампаний) поднят, добавлены задачи дашборда статистики, отчётов и вордстат-инструмента.
→ S7 первым: сбор статистики по 2 кампаниям ПЦ (Reports API + Метрика) -> дашборд показателей против норм ОКР. Параллельно вордстат-инструмент. Затем S3-S5 (подготовка новых кампаний по брифу). Ждём от владельца образец брифа.
Переориентация по владельцу: работаем строго в рамках клиента Пульс Цен, фокус — полноценный кабинет директолога. (1) Тестовые данные и все посторонние упоминания вычищены из БД, доков и кода. (2) Автоаудит сайта отложен: у посадочных клиента антибот-защита — шаг site_audit пропускается (skipped) и пайплайн идёт дальше, код сохранён за флагом AUDIT_ENABLED. (3) Кабинет: страница «Подключения» (Директ/Метрика/Callibri, ручной ввод токенов, маскировка, журналирование), logout, навигация. E2E: пайплайн с пропуском аудита и создание подключения проверены на сервере.
→ Кабинет дальше: команда/роли (инвайты специалистов), страница кампаний, докрутить брифы под образец владельца (ждём docx). Потом S3-S5: AI-анализ бизнеса (по брифу, не по сайту — раз аудит отложен), семантика вордстатом, объявления. Владельцу: образец брифа, доступ к кабинету Директа ПЦ.
S2: UI готов — создание клиента (/clients/new), форма стандартного брифа (черновик 9 полей), кнопки запуска аудита/полного пайплайна, карточка клиента показывает отчёт аудита построчно (ок/блокер/рекомендация). S3 частично: краулер-аудит v1 реализован и работает — 11 детерминированных проверок по docs/03_landing_checklist.md, скоринг 0-100, red-провалы блокируют запуск (клиент → blocked, ран → waiting_user с перечнем блокеров). E2E-прогон на myvision.su: балл 15/100, блокеры tel:/ИНН/политика ПД найдены корректно. Деплой на cfru, всё живое.
→ S2: OAuth/токен Яндекс Директа (страница «Подключения»), импорт docx-брифа после образца владельца. S3: LLM-оценка оффера против брифа (группа 3 чек-листа) через AI_PROXY, PageSpeed API, docx-документ рекомендаций. Владельцу: образец брифа + его чек-лист.
Ответы владельца: (1) образец стандартного брифа даст позже; (2) чек-лист посадочных есть у него, но пока действуем по нашему — составлен v1 в docs/03_landing_checklist.md (техника/аналитика/оффер/конверсия/юридика+модерация, red/yellow, скоринг, passed = ни одного red); (3) коллтрекинг = Callibri. Доки обновлены локально и на сервере.
→ S2: форма клиента+брифа в UI (черновик полей), OAuth Директа. S3: краулер под чек-лист. Ждём от владельца: образец брифа, его чек-лист посадочных.
Старт проекта по брифу владельца (docx). Изучен бриф, роадмап 8 спринтов заведён. Собран скелет полноценной архитектуры (не MVP): монорепо npm workspaces — packages/db (Prisma 6 + Postgres, полная модель: тенанты/роли, клиенты/брифы, пайплайн-раны с шагами, кампании/группы/комбинаторные объявления, журнал изменений, самоисправление ErrorFix, оптимизация со сроками, метрики+пороги ОКР из брифа), apps/api (Fastify, JWT, RBAC owner/specialist/viewer), apps/workers (BullMQ: стейт-машина 8 шагов запуска + монитор порогов каждые 4ч), apps/web (Next 15: обзор, клиент, журнал, пороги). Всё компилируется.
→ Деплой на cfru (docker dp-postgres/dp-redis + pm2 + порт 3080 по IP) -> миграции+сид -> проверить вход и обзор. Дальше S2: формат стандартного брифа согласовать с владельцем, OAuth Директа.