LeadForge AI
Платформа лидгена: Авито-машина, Директ-машина, email-аутрич, мультитенант. Ядро лидгена MyVision.
готовS1 · Tenant Identity (1A.0.5)1/5
Цель: Идентичность тенантов
готовS2 · Multi-tenancy + RLS (1A.1)2/2
Цель: Полная изоляция тенантов
готовS3 · Авито-машина v28/8
Цель: Автономный конвейер Авито
В РАБОТЕS4 · Директ-машина17/18
Цель: Директ как у сильного директолога
блокS5 · Email-реанимация (2428 лидов)0/3
Цель: Деньги из спящей базы
ревьюS6 · Оффер-система (107 офферов)10/12
Цель: Сильные офферы по фреймворкам + критик-цикл, персона, 4 длины под площадки; вшито в креативы+лендинг (gated)
планS7 · Roadmap: 1A.2–1A.40/3
Цель: Trigger.dev / KG / Critic
В РАБОТЕS8 · Avito: машина роста Ф1 + песочница + vision-судья17/18
Цель: Автономный A/B-рост объявлений + офлайн-тренажёр агентов + критик картинок
готовS9 · S1. Лиды клиента — клиенту4/4
Цель: Заявка с формы клиента попадает в ЕГО компанию и падает ему в телеграм. Фундамент SaaS-разделения.
готовS10 · S2. Свои ИИ-агенты у каждого клиента4/4
Цель: При заведении компании создаётся её собственный набор агентов — копии наших эталонов, с настройками под её бизнес.
готовS11 · S3. Реклама клиента в его кабинетах4/4
Цель: Клиент подключает свои кабинеты, кампании реально запускаются.
готовS12 · S4. Контент и SEO под клиента (слит в S17)0/1
Цель: Контент-машина и лендинги работают на сайт клиента, а не только на наш.
готовS13 · S5. Приёмка SaaS3/3
Цель: Проверка изоляции на живых клиентах + тариф и лимиты.
В РАБОТЕS14 · План развития платформы (волны 1-7)12/16
Цель: docs/PLATFORM-PLAN.md: стабильность рекламы, очередь решений, качество, MCP, ВК, лендинги, тарифы
В РАБОТЕS15 · Проверки по сроку15/24
Цель: Задачи вида «через неделю посмотреть, сработало ли». Срок на задаче (dueDate), напоминание в ТГ раз в сутки.
В РАБОТЕS16 · Первый живой клиент (понедельник 11.08)22/27
Цель: Завести ЛК, подключить Директ/ВК/Авито и СЕО к сайту клиента так, чтобы цифры шли и лиды фиксировались
готовS17 · Контент, СЕО и лендинги под клиента10/10
Цель: docs/SEO-FACTORY.md: бриф → ключи по полкам НЧ/СЧ/ВЧ → статьи в стиле сайта → публикация по FTP → экран в ЛК. Плюс лендинги клиента с его формой и разметкой.
Ворклог (места остановки)
Разбор всплеска расхода OpenRouter 27.08 привёл к находке в research-daily: сбор источников сидел внутри forEachOrg, поэтому одни и те же 9 статей пересказывались на каждую из 108 организаций — 972 запроса к LLM в сутки, 1107 находок при 418 уникальных заголовков, около 45 руб/день против 14 руб по COST-MODEL.md. Переделано: источники разбираются один раз за прогон (collectResearchFindings / collectExtraFindings), находки раскладываются по org отдельным шагом (saveResearchFindings / saveExtraFindings); добавлен дедуп по source_url — уже разобранную статью в LLM повторно не отправляем; расписание переведено с ежедневного на 1 и 15 число в 22:00 МСК; окно дайджеста расширено с суток до 15 дней (getYesterdayFindings -> getRecentFindings), иначе дайджест был бы пустым 13 дней из 14. Ручные точки запуска в apps/api/src/routes/advertising.ts продолжают работать через обёртки. Заодно в research-extra убрана сборка SQL конкатенацией строк (sql.raw с текстом от LLM) — теперь параметризованный запрос. Отдельно сделана атрибуция расхода: в packages/ai/src/llm.ts клиенту OpenRouter добавлены defaultHeaders с HTTP-Referer и X-Title, иначе в кабинете OpenRouter весь расход идёт как App=Unknown (ключ общий примерно на 20 сервисов двух серверов). Проверено: tsc по изменённым файлам чист (272 ошибки в репозитории предсуществующие, в других модулях), leadforge-api и leadforge-workers перезапущены и online, в Redis repeatable-job пересоздан — следующий прогон 1 сентября 19:00 UTC. Обновлён docs/ACCEPTANCE.md, блок Researcher. Бэкапы рядом с файлами: *.bak-2026-08-28.
→ Боевой прогон новой механики не делал — это около 9 платных запросов, ждёт решения владельца (либо прогнать вручную через API-эндпоинт, либо дождаться 1 сентября). После первого прогона проверить: в логе строка 'Sources parsed once for all orgs' со счётчиком skippedAlreadySeen, и что в research_findings за дату число уникальных заголовков совпало с числом находок на организацию. Отдельно стоит решить, нужны ли находки всем 108 организациям — большинство из них, судя по всему, неживые.
ISKRA: две статьи опубликованы, продвижение Авито запущено, разобран бюджет Директа, наведён порядок в контексте проекта. СТАТЬИ. Опубликованы две: «Форма для пляжного волейбола на заказ» и «Форма для спартакиады и корпоративных команд». Карта сайта 21 → 23 адреса, обе отдают 200, в списке блога появились. Темы выбраны по Вордстату и по заявкам, которые уже приходили из Директа по этим запросам (пляжный волейбол 1236 запросов в месяц, спартакиада и корпоративный сегмент 294). Стоимость 22 рубля на две. Отдельно собраны посадочные разделы под те же темы: статья ловит информационные запросы, раздел коммерческие. НАХОДКА ПО СПРОСУ: «купальник для художественной гимнастики» — 23 740 запросов в месяц, и заявка по гимнастике из Директа уже была. Но клиент такого не шьёт (на сайте шесть видов спорта, купальников нет), страницу не делал — нужен ответ клиента, берётся ли он. АВИТО. Куплено продвижение x2_1 на футбольное 8353542067 и волейбольное 8353383502 объявления в товарной рубрике, списано 300 рублей с кошелька. Закрыта проверка по сроку: продвижение в услуговой рубрике не работает вообще — на хоккейном 8353601405 бюджет 350 рублей в день стоял с 14.08, за неделю ноль списаний и 20 показов. Пакетов больше просмотров в услугах нет. Механика записана в карту: PUT /core/v2/accounts/{uid}/items/{id}/vas_packages телом package_id, старый /vas для пакетов даёт 400. ДИРЕКТ. Клиент просил поднять бюджет из-за малого числа лидов — поднимать нечего: недельный лимит 10 000 рублей на кампанию не выбирается (4 450 за четыре дня при 20 000 доступных). Кампании платят за конверсию, рычаг это цена конверсии, сейчас 1 000 рублей при фактической цене обращения около 890. РСЯ дала 474 визита и ноль заявок. КОНТЕКСТ ПРОЕКТА. Владелец: «если это LeadForge и клиент ISKRA, то задача по Директу делается так, по SEO так, по Авито так — почему каждый раз заново». Заведены docs/SEO-MACHINE.md (весь путь статьи от Вордстата до публикации с граблями каждого шага) и docs/clients/ISKRA.md (маршрут «какая задача каким инструментом», доступы, что клиент умеет, что обещали, гейты). В глобальный CLAUDE.md вписан порядок чтения тремя уровнями: проект → клиент → канал.
→ Ждут решения владельца: цена конверсии в Директе (поднимать ли с 1 000 до 1 300–1 500), что делать с РСЯ и черновиком ретаргета, расширять ли семантику под ниши с заявками (пляжный волейбол, гимнастика, спартакиада), спросить клиента про купальники для художественной гимнастики. Открыто: фотографии для двух новых посадочных разделов (сейчас волейбольные с исходного каркаса), свежая выгрузка Вебмастера — без неё результат блога не измерить, статистика объявлений Авито по клиентским организациям не собирается (дефект заведён отдельной задачей). Проверка теста товарной рубрики Авито — 9 сентября.
ТОВАРНАЯ РУБРИКА АВИТО ЗАПУЩЕНА. Три объявления клиента опубликованы в «Спорт и отдых»: футбольная форма 8353542067 (узел Футбол → Форма, единственный вид с отдельным подтипом «Форма»), волейбольная 8353383502, баскетбольная 8353161233. Все active до 18.09, по четыре предметных кадра, цена 990 рублей как у клиента. Размещение бесплатное: аванс и кошелёк совпали до копейки до и после. Продвижение не включали. ГЛАВНОЕ: сборщик фида никогда не обслуживал кабинет ISKRA — фид туда писали руками, и первая же сборка кодом дала бы НОЛЬ объявлений, то есть сняла бы все пять с площадки. В базе от них были только заголовок и цена: описания пустые, картинок ноль, статус published при фильтре active. Содержимое перенесено в базу из живого файла, сборка теперь воспроизводит живой фид байт в байт. ЧТО ПОЧИНЕНО ПО ДОРОГЕ: категория была константой в генераторе (Предложение услуг → Деловые услуги), теперь набор тегов лежит в avito_ad_map.category_fields и товар выразим вообще; имя менеджера у каждого объявления своё (Альбина, Марина, Ольга, Татьяна, Елена), а в коде стояли имя и телефон нашего агентства, то есть клиентские объявления получили бы чужие контакты; адрес картинки строился в общую папку вместо папки компании, поэтому свежие фото уехали бы по несуществующему адресу; пустой ответ площадки на запуск выгрузки считался ошибкой разбора. Отдельно: jsonb не хранит порядок ключей, набор полей держим массивом пар. Значения товарных категорий не сочинены: запрошены у площадки (узлы forma, voleibol, basketbol) и записаны в docs/AVITO-MACHINE.md вместе с уроками сборки и публикации. Картинки — 12 кадров через Kie, около 30 рублей, предметная съёмка без надписей: в товарной рубрике смотрят на товар, а не на баннер.
→ Тест идёт три недели, до 09.09 — заведена проверка по сроку с командой замера. Считаем обращения на объявление против наших же волейбола и баскетбола в услугах. ВАЖНОЕ ИЗ ЗАМЕРА: наши пять объявлений в услугах за 01.08–18.08 набрали суммарно 22 показа и 1 обращение. Это почти нулевая видимость, и она ставит под вопрос саму постановку теста: возможно, упираемся не в рубрику, а в отсутствие продвижения. Товарные объявления как раз и покажут, что из двух. Открыто и ждёт решения владельца: продвижение на четыре объявления (в услугах пакеты площадка не продаёт, в товарах надо смотреть цену); форма приёма заявок или Турбо-страница для контактов из Директа. Отдельно заведён дефект: статистика объявлений собирается только по нашему кабинету, у клиента поля пустые, из-за чего авто-улучшение выбирает объявление наугад.
Подготовка теста рубрики Авито: замерен спрос и составлена карта занятости кабинета. Объявления ещё не сделаны — выбор тем на согласовании у владельца. КАРТА КАБИНЕТА (30 дней). В товарной рубрике «Спорт и отдых» у клиента: футбол 17 объявлений (331 просмотр, 44 обращения, но 12 из 17 дают 0-7 просмотров и мертвы), волейбол 1 (497/15), баскетбол 1 (295/5), хоккей 1 (57/3), регби 1 (57/2). В услугах: флаги и виндеры 7 объявлений (702 просмотра, 204 обращения — лучшее в кабинете), общая форма 3 (104/29), плюс наши пять. СПРОС ПО ВОРДСТАТУ (Россия, месяц): футбольная форма на заказ 2205, спортивная форма на заказ 879, пошив спортивной формы 538, волейбольная 456, баскетбольная 310, хоккейная 163, форма для регби на заказ 0. СВОБОДНЫЕ НИШИ ОКАЗАЛИСЬ ПУСТЫМИ ПО СПРОСУ: гандбол 199, кимоно 119, гимнастика 101, черлидинг 92. Владелец отклонил их справедливо: объявление без спроса не даст обращений, и тест рубрики станет неинтерпретируемым — не отличить «плохая рубрика» от «нет спроса». ГЛАВНАЯ НАХОДКА: общие запросы «спортивная форма на заказ» (879) и «пошив спортивной формы» (538) в товарной рубрике не закрыты вообще — ни нашими объявлениями, ни клиентскими, они висят только в услугах. Это 1417 запросов в месяц свободного места со спросом. ОТДЕЛЬНО: у регби ноль запросов по «форма для регби на заказ» — расширять эту тему платно не стоит.
→ Ждём выбор тем от владельца: предложены «спортивная форма на заказ» + «пошив спортивной формы» (обе свободны в товарах) + футбол либо волейбол. Футбол это максимальный спрос 2205, но пересечение с мёртвой частью карточек клиента; волейбол даёт самый чистый тест — у клиента там одно объявление и оно лучшее в кабинете. После выбора: три объявления, цена минимального пакета продвижения в товарной рубрике, срок теста три недели, метрика — обращений на рубль против наших же объявлений в услугах.
Опубликованы две статьи в блоге ISKRA под незакрытые запросы Вебмастера: «Шапки и аксессуары для хоккейной команды на заказ» (запрос с 28 показами, ничем не был закрыт) и «Форма для регби на заказ» (10 показов, позиция 10,2, страница /rugby без текста). В блоге теперь 10 статей, в карте сайта был 19 адрес, стал 21. ПОРЯДОК СОБЛЮДЁН: свежая копия живого блога -> сборка поверх неё -> сверка -> заливка. Сверка отказала с первого раза и правильно: реестр _articles.json был записан с отступом 1 и переносами LF вместо 2 и CRLF, построчное сравнение увидело это как пропажу 80 строк. Починена запись, а не проверка. После правки только добавления: index +18/-0, реестр +20/-0. Залит 21 файл, ошибок ноль. Восемь прежних статей на месте. СОЗДАН ПОСТОЯННЫЙ СБОРЩИК C:\tmp\iskra-blog-build.py: каркас страницы берётся у живой статьи (иначе новая статья унаследует позапрошлую шапку — та же причина, по которой существует blog-publish.py), добавляется запись в реестр, пересобирается список блога, дописывается карта сайта. Публикация статьи теперь две команды. СТАНДАРТ СОГЛАСОВАНИЯ (C:\tmp\articles-preview.py): разводная страница с карточками, клик открывает статью отдельной вкладкой в оформлении сайта. Обязательно вырезать style генератора — он сужает обложку до 900px и отменяет uppercase заголовков; на живых страницах его нет. Владелец: «сделай стандарт как отдавать мне на согласование и все» — до этого я три раза подряд собирал превью по-новому. В базе обе статьи помечены published со ссылками.
→ Дефект генератора статей не починен: seo-article кладёт в html свой блок <style>, который перебивает оформление сайта. Сейчас его вырезает сборщик блога, но при любой другой публикации статья выглядит неправильно — стоит убрать из генератора. Ждут решения владельца: тест 2-3 объявлений Авито в товарной рубрике (нужна цена минимального пакета продвижения), приём форм сайта к нам или Турбо-страница для контактов из Директа, продвижение на четырёх объявлениях Авито. Просрочена проверка: дозамер семантики 5 кампаний Директа (упирались в суточный лимит Вордстата, 8 дней). Проверки 30.08: новая выгрузка Вебмастера для сравнения позиций, итог теста Директа на 15 тысячах.
Кабинет клиента доведён до рабочего места маркетолога. РАЗРЕЗЫ ДИРЕКТА: эндпоинт /ads/direct/goals — матрица «цель × кампания × цена цели». Вскрылось, что «37 целевых действий» это сумма несопоставимого: заявок 2, остальное вовлечённость (просмотр второй страницы, задержка 15 секунд). Цели теперь делятся на заявка/обращение/вовлечённость по классификатору имён; в сводке стоят заявки с ценой. Сбор ad-analytics-collect для Директа запрашивает отчёт только по целям-заявкам — иначе в конверсии попадает всё подряд. Ловушка API: с указанными целями колонка называется Conversions_<goalId>_LSCCD, а не Conversions, и складывать колонки нельзя (одно действие засчитывается нескольким целям) — берём максимум. Записано в docs/YD-MACHINE.md. ПОГРУЖЕНИЕ: раздел в аналитике с четырьмя вкладками — поведение (часы, дни, устройства, города, страницы с долей заявок), поисковые запросы Директа, объявления, география. Видно, что ПК конвертит втрое лучше смартфонов, вторник в 9 раз лучше четверга, и 424 руб ушло на клики без заявок («canva», «готовый план помещения салона красоты»). ФИЛЬТРЫ ЛИДОВ: по источнику, чьей рекламе и типу обращения — в API и в интерфейсе. ДАШБОРД переделан: вместо агентов и рассылок — заявки с недельной динамикой, расход, цена заявки, последние заявки с текстом и пометкой чьей рекламы, состояние Директа и Авито. ЗАПУСК КАМПАНИЙ: apply-brief перед созданием проверяет счётчик и при наличии заявок запускает на WB_MAXIMUM_CONVERSION_RATE с ключевой целью вместо кликов (правило владельца: чей код собрал статистику, в том кабинете и стратегия за конверсии). СТАТЬИ: две новые под незакрытые запросы Вебмастера — шапки/аксессуары (28 показов, тема не закрыта) и форма для регби (10 показов, позиция 10,2). Обе прошли проверки на повтор, лежат в базе как ready, не залиты. Заведён стандарт согласования: C:\tmp\articles-preview.py — разводная страница + полные статьи в оформлении сайта; обязательно вырезать style генератора, он сужает обложку до 900px и отменяет uppercase заголовков. АНАЛИТИКА ДЛЯ ВЛАДЕЛЬЦА: https://myvisionagency.ru/lab/iskra-results/ — поиск, Авито, Директ с честными сроками (Авито 3-5 дней, Директ второй день). ПРОВЕРЕНО ФАКТАМИ: расход Авито ноль честно — площадка не списала ни рубля за наши объявления, пакеты продвижения в рубрике услуг недоступны (только оформление). Наши объявления показываются как клиентские в той же рубрике (~2 просмотра в день), разница лишь в возрасте. В услугах конверсия 25% бесплатно против 4,8% и 420 руб за обращение в товарах — вывод «переносить всё в Спорт и отдых» был неверным, снят. Заявки с контактами Директ отдаёт только с Турбо-страниц (leads.get требует TurboPageIds), их у клиента нет.
→ Заливка двух статей — владелец сказал через полтора часа (снять копию блога, добавить, сверить что 8 существующих на месте, обновить список и sitemap). Ждут решения: тест 2-3 объявлений Авито в товарной рубрике (нужна цена минимального пакета продвижения); приём форм сайта к нам или Турбо-страница, чтобы получать контакты; продвижение на четырёх объявлениях Авито. Проверки: 30.08 новая выгрузка Вебмастера, 30.08 итог теста Директа на 15 тысячах.
Переделан кабинет клиента (ISKRA). Раздел Реклама разбит на вкладки Авито и Яндекс Директ: в каждой деление наши/клиентские, полная статистика, карточки с картинками и модалкой, статусы по-русски. Из меню клиента убраны Кампании и Каналы (они про рассылки). Лиды: вместо одной сводки в день — 402 заявки поштучно (75 с сайта из журнала визитов Метрики, 327 обращений с Авито с именем и текстом, с пометкой чья реклама). Аналитика перестроена под клиента: заявки вместо агентов и рассылок, разбор по источникам и типам обращений. Добавлены блок Яндекс Метрики (расшифровка целевых действий + источники) и блок Поиск и статьи (органика по неделям +42% и позиции из Вебмастера). Заведена таблица seo_search_positions с RLS, загружена выгрузка Вебмастера 138 запросов за 01-14.08. ПОЧИНЕНО: (1) сбор статистики Директа запускался только вручную кнопкой, расписания не было вовсе — заведён ежедневный воркер ads-analytics-cron на 6:30 МСК, он же подтягивает чужие кампании кабинета; (2) счётчик Метрики клиента не был зарегистрирован — 35 заявок за месяц шли мимо кабинета; (3) кампании Директа висели черновиками, кабинет писал «на паузе»; (4) статистика не показывалась из-за обращения на уровень глубже в коде экрана. НАЙДЕНО ПО АВИТО: у площадки два независимых продвижения — ставка за просмотры (cpxpromo) и пакет услуг (vas), проверяются разными вызовами и не связаны. Записано в docs/AVITO-MACHINE.md. Продвижение стоит только на 1 из 5 наших объявлений, владелец решил пока не трогать. ЧЕСТНОСТЬ ЦИФР: сначала засчитал себе все 56 заявок с рекламы за месяц, но наши кампании запущены 15-16.08 — до этого крутилась реклама прежнего подрядчика (350+ визитов в день до 5 августа). Исправлено: своими считаются только заявки после начала наших показов, остальные идут строкой «реклама, что шла до нас». Цена заявки не показывается, пока их меньше пяти.
→ Не сделано: экран Дашборд (главная) не трогали — там осталась старая раскладка. Продвижение на четырёх объявлениях Авито не поставлено по решению владельца. Модерация Директа пройдена, обе кампании ACCEPTED, идут показы: 1173 показа, 43 клика, 554 руб за двое суток. Проверка 30.08 — новая выгрузка Вебмастера для сравнения позиций. Проверка 30.08 — итог теста Директа на 15 тысячах.
Три вещи по итогам разбора Авито. Первое и главное: статистика не показывалась в кабинете вовсе - блок был добавлен, данные собирались, эндпоинт отдавал их правильно, а экран молчал. Причина в коде экрана: хук useApi уже разворачивает поле data ответа, а обращение шло к adSpend.data.channels, то есть искали data внутри data. Ошибка тихая, ни в консоли ни в запросах ничего. Исправлено, кабинет пересобран и выложен с бэкапом app.bak-2026-08-16. Проверено вызовом эндпоинта от лица владельцев обоих кабинетов: MyVision видит Директ 59089 руб на 2159 конверсий и Авито отдельно наше и клиентское, ISKRA видит наши 13 показов и клиентские 2122 показа при 291 обращении. Второе: очередь предложений расчищена - 287 штук (234 proposed и 53 pending_review) помечены cancelled_stale, не удалены, чтобы осталась история решений критика. Третье: моё утверждение про разошедшиеся статусы оказалось неверным - я считал записи со статусом published, а в кабинете MyVision схема active/exhausted/archived/draft. Сверка по номерам объявлений: в кабинете 17 активных, в базе живыми помечены 15, расхождение одно и оно намеренное - авто-возврат объявлений в фид отключён после инцидента 16 июля, когда создал 4 дубля. Страница разбора поправлена.
→ Через неделю смотреть исправленный замер экспериментов (проверка на 23.08). Очередь теперь копится с чистого листа - через неделю будет видно, сколько машина предлагает в норме и сколько из этого доходит до объявлений.
Разбор механики улучшений Авито по двум кабинетам, страница myvisionagency.ru/lab/avito-mehanika. Найдена системная ошибка измерения: показатели до снимались за 7 дней, результат считался за 3, сравнивались суммы. Из-за этого почти любая правка выглядела провальной - отношение стало к было держится в районе 12-43 процентов, то есть ровно 3/7, это арифметика окна а не качество работы. Итог: из 389 измеренных правок лучше признаны 24, хуже 365. Вторая находка: авто-откат не сработал ни разу за всю историю, потому что его условие требовало чтобы просмотров было не меньше прежнего, а при вдвое коротком окне это почти невыполнимо. Предохранитель был, но сработать не мог. Третья: очередь предложений стоит - 234 предложено и 53 ждут решения человека, самые старые с апреля и мая. Исправлено: окно результата приведено к 7 дням, вердикт выносится по доле обращений на просмотр а не по сумме, на малых числах вердикт не выносится вовсе. Что работает хорошо: критик отсеивает разумно (72 отклонил при уверенности 0.35, 53 применил при 0.89), связка объявлений с площадкой держится, категории не схлопнулись в одну.
→ Через неделю смотреть, что покажет исправленный замер - проверка заведена на 23.08. Стоит синхронизировать статусы объявлений: в базе 0 опубликованных и 20 в архиве, тогда как на Авито активны 18, машина решает по устаревшей картине. Разобрать очередь из 287 предложений - часть устарела с апреля.
Директ ISKRA ЗАПУЩЕН. Деньги на счету нашлись - 24590 руб, пополнение прошло между проверками. Кампании Поиск и РСЯ включены: State ON, Status MODERATION, 169 объявлений отправлено на модерацию. Бюджеты как договорились: 5000 и 2500 руб в неделю, итого 15000 за две недели. Перед запуском предполётная проверка: 56 и 32 группы, пустых нет, 2352 фразы, 8 городов, посадочные ведут на разделы видов спорта. По дороге три грабли, все записаны в карту. Первая: гейт запуска работает на отказ и не дал включить кампании, потому что их не было в ad_campaigns - создавались скриптом мимо базы. Это же означало, что и аналитика Директа не собиралась бы. Завёл три кампании. Вторая: campaigns.resume на черновике отвечает что кампания является черновиком и не может быть остановлена - сначала нужен ads.moderate, и только потом resume. Третья, из прошлого шага: PriorityGoals принимает только Operation SET. Отдельно решён вопрос конверсий: кабинет Директа не имел доступа к счётчику Метрики, выдали сами через API, иначе цена заявки не посчиталась бы вовсе.
→ Завтра проверить что модерация приняла объявления и пошли показы. Через две недели посчитать цену заявки отдельно по Поиску и РСЯ, сравнить с планкой 500-700 руб. Ретаргет не запускали - аудитории мало.
Директ ISKRA: денег на счёте нет, но найдена и устранена проблема поважнее. Проверен баланс - счёт 713437598 логин directiskra, ноль рублей, счёт в кабинете один, деньги не поступали. Способа узнать баланс в карте не было: v5 accounts отвечает 404, работает старый живой API v4 AccountManagement. Главное: счётчик Метрики 109572218 был ПРОПИСАН в кампаниях, но кабинет Директа доступа к нему не имел - счётчик принадлежит логину printflag-direct, доступ был выдан только advcreative и ShamrayGroup1. При таком раскладе в отчётах Директа был бы ноль конверсий при любом расходе, и задача посчитать цену заявки провалилась бы через две недели над пустым отчётом. Доступ выдали сами через API Метрики (у нашего токена права edit на счётчик), клиента дёргать не пришлось. Кампании подготовлены к тесту: Поиск 5000 руб/нед, РСЯ 2500 руб/нед, приоритетные цели Оставил заявку и Клик на телефон. Отдельная грабля: PriorityGoals принимает только Operation SET, без поля и с ADD падает вся правка кампании включая бюджет. Всё записано в docs/YD-MACHINE.md.
→ Ждём пополнения счёта. Как придут деньги - включить Поиск и РСЯ (campaigns.resume), через две недели посчитать расход делить на конверсии по целям заявка и звонок. Ретаргет не трогаем: аудитории мало. Проверка баланса заведена на 18.08.
Две статьи опубликованы, в блоге 1skra.ru теперь восемь. Порядок прежний: свежая выкачка живого сайта (15 файлов), сверка с рабочей копией - расхождений ноль, клиент за сутки сайт не трогал, сборка поверх живого состояния, проверка что ничего не исчезает, заливка. В карте сайта стало 19 адресов против 17, ни один не пропал. Проверено на живом: все восемь статей открываются, обложки отдаются, счётчик Метрики на новых страницах на месте, главная и страницы видов спорта целы. Ротация обложек сработала как задумано: у новых статей баскетбол и лёгкая атлетика, хоккея в ленте больше не прибавилось. По дороге поправлен сборщик списка - имя файла обложки теперь содержит метку вида спорта, и собирать путь из адреса статьи больше нельзя, ищем файл на диске.
→ В очереди остались две свободные темы: влияние формы на результаты и анатомические особенности кроя. Крон на Sonnet работает без холостых прогонов. Проверка захода блога в индекс уже стоит. Директ по-прежнему с нулём на счету.
Три новых объявления ISKRA залиты и работают: волейбол, баскетбол, регби. Владелец решил цену не снижать - все пять идут по 990 руб, проверка гипотезы про цену на них отменена. Фид собран из пяти объявлений (прежние два обязаны оставаться в файле, иначе автозагрузка их снимет), валидатор дал 6 зелёных без ошибок, выгрузка отработала: активных объявлений стало 39 против 36, ничего не снялось. Все пять заведены в карту avito_ad_map - без записи там машина объявление не видит вовсе. Выгрузка last_successful обновляется с задержкой в часы, поэтому три новых связаны по заголовку, штатный seed-ad-map подтвердит связку из источника правды позже. На хоккейное включено продвижение 350 руб/день авто-бюджетом. По дороге: ступени ровно 400 руб у Авито нет (200, 250, 350, 450, 550, 650), и в ответе getBids отсутствует поле isActive - установленный бюджет лежит в auto.budgetPenny, из-за чего я сначала решил что включение не сработало. Оба факта записаны в карту механики.
→ Через неделю смотреть отдачу пяти объявлений и что дало продвижение на одном против четырёх без него - проверка заведена на 21.08. Ждут ок две статьи на lab/iskra-articles. Директ по-прежнему с нулём на счету, кампании в черновиках.
Страница аналитики для клиента дополнена нашей работой: myvisionagency.ru/lab/iskra-avito-stat. Добавлены три раздела. Первый - как идут наши два объявления: 9 просмотров за два дня против среднего по кабинету 5.4 на объявление, то есть пока на уровне его собственных, с оговоркой что два дня это мало и Авито поднимает новые объявления постепенно. Второй - три новых объявления с превью креативов и подписью стилистики: волейбол светлый студийный, баскетбол яркий контрастный, регби репортажный. Третий - прямой вопрос по цене: в новых стоит от 100 руб вместо 990, основание приведено на его же данных (23.4 процента против 5.0 на одном товаре), объяснено что цена в карточке работает как приглашение, и что прежние два оставляем по 990 намеренно ради честного сравнения через неделю. Вопрос вынесен отдельной плашкой: запускаем три новых с ценой от 100 или ставим 990.
→ Ждём ответ владельца по цене в новых объявлениях. После ответа - фид из пяти объявлений через валидатор и заливка. Отдельно ждут ок две статьи на lab/iskra-articles. Директ по-прежнему с нулём на счету.
Данные Авито теперь доходят до кабинета клиента, и своя работа отделена от клиентской. Раньше по Авито в кабинете было пусто: общий сборщик умеет только ВК и Директ, у него модель есть-кампания-сходи-за-цифрами, а у Авито кампаний нет. Сделан отдельный сбор avito-analytics: единица учёта объявление, дневные снимки в общие таблицы, расход из истории операций и обязательно по дням - иначе кабинет показывает ноль при потраченных десятках тысяч. Воркер ежедневно в 6:00 МСК с окном в неделю. Ключевая правка по замечанию владельца: у ISKRA 36 объявлений, ведём мы два, остальное клиент завёл сам, и там его флаги с сотней обращений - показывать это одной цифрой значит записывать себе чужую работу. Признак наше берётся из карты avito_ad_map, эндпоинт ad-spend отдаёт две части: channels наша работа, clientOwn клиентская. Заодно заведены в карту два наших объявления ISKRA - без записи там машина их не видела вовсе: ни ставок, ни продвижения, ни сверки. На экране аналитики два блока, кабинет собран под боевой домен и выложен с бэкапом app.bak-2026-08-14.
→ Проверить экран после входа под клиентом. Цифры сейчас: наши два объявления 9 просмотров и ноль обращений (опубликованы 12.08), клиентские 2096 просмотров и 279 обращений при расходе 23660 руб. По ВК и Директу разделения нет намеренно - их ведём мы целиком, но Директ пока стоит без денег.
Три новых объявления Авито для ISKRA готовы и ждут ок: myvisionagency.ru/lab/iskra-avito-new. Волейбол, баскетбол, регби - виды, где у клиента по одному-два объявления. У каждого своя стилистика креативов, потому что прежние два были оба тёмно-синие дымные и в выдаче читались как одно: волейбол светлый студийный на белом фоне, баскетбол тёмный с контровым оранжевым светом, регби репортажный на настоящем поле при дневном свете. Форма и бренд взяты с фотографий клиента, свет и фон заданы промптом отдельно - иначе image-to-image наследует подачу референса и вышел бы третий дым подряд. 30 кадров 1240x960, русский текст запечён в картинку, потрачено 90 руб. Цена в новых объявлениях от 100 руб вместо 990 - проверяем гипотезу, что 990 отсекает обращения. Имена швей разные: Ольга, Татьяна, Елена. Собран генератор фида на пять объявлений: два прежних обязаны остаться в файле, иначе автозагрузка их снимет.
→ Ждём ок по объявлениям и по двум статьям (требования к форме, лёгкая атлетика). После ок: фид из пяти объявлений через валидатор, картинки выложить в org-папку, залить. Директ стоит без денег - на счету 0, кампании в черновиках.
Статистика по всем каналам ISKRA. ДИРЕКТ: денег НЕ залили, на счету 0 руб, все три кампании в черновиках и выключены. Способ узнать баланс в карте отсутствовал - v5 accounts даёт 404, работает v4 Live AccountManagement с Action Get, кабинет directiskra, счёт 713437598. АВИТО клиента за неделю: 554 просмотра, 84 обращения, 15.2 процента. Наши два объявления за неполные двое суток: 6 и 3 просмотра, ноль обращений - это ровно уровень среднего по кабинету (5.4 просмотра на объявление за тот же срок), оба активны, не заблокированы. Гипотеза про цену на этих же двух днях только укрепилась: дорогие объявления по 990 руб дали 104 просмотра и 1 обращение, флаги по 140-150 руб - 50 просмотров и 10 обращений. НАШ кабинет Авито: аванс 2698 руб, пополнен. Написаны две новые статьи не про хоккей - требования к форме (обложка баскетбол) и особенности лёгкой атлетики (обложка атлетика), обе с первой попытки, ждут ок на lab/iskra-articles.
→ Директ не тронется, пока не пополнят счёт - сказать владельцу. По Авито предложить 2-3 новых объявления по другим видам спорта в другой стилистике креативов (сейчас все тёмно-синие), с гейтом по деньгам: 10 картинок на объявление по 3 руб. Отдельно предложить проверить гипотезу цены - поставить на одно объявление 100-150 руб вместо 990.
Обложки статей перестали быть хоккейными по умолчанию. Владелец заметил: из шести статей блога пять с хоккеем. Причина в коде - если тема не про конкретный вид спорта (а таких большинство), выбор образца брал просто первый кадр пула, а первым там лежит hockey-hero. Ротации не было вовсе, хотя у клиента в пуле шесть видов спорта. Теперь для общих тем берётся вид, которого дольше всего не было в ленте. По дороге вскрылась вторая половина проблемы: сравнение шло по имени файла, а имя генерируемой обложки собирается по адресу статьи и с образцом совпасть не может никогда - история читалась как пустая. Вид спорта теперь пишется в колонку images и в имя нового файла, а история берётся из записанного вида. Шести опубликованным статьям вид проставлен вручную по факту их картинок. Проверено без генерации: для очереди выбираются basketball, volleybal, athletics, rugby - ни одного хоккея, он занимает всю свежую историю.
→ Лента сейчас всё ещё 5 хоккеев из 6 - это прошлые статьи. Предложить владельцу перевыпустить 2-3 обложки, чтобы выровнять сразу (около 3 руб за картинку плюс перезаливка блога). Завтрашние статьи уже пойдут с разными видами.
Две новые статьи опубликованы на 1skra.ru/blog, в блоге теперь 6 штук. Порядок соблюдён тот, о котором просил владелец: сначала свежая выкачка живого сайта (11 файлов), сверка с моей копией - расхождений ноль, клиент за сутки ничего не менял, - и только потом сборка ПОВЕРХ живого состояния. Предохранитель сработал на карте сайта и остановил заливку: строка блога выглядела исчезнувшей, хотя у неё лишь поменялась дата lastmod. Разобрано по адресам: пропадает ноль, добавляется два. Сверку карты сайта научил сравнивать адреса, а не строки - иначе он кричал бы при каждой публикации, а предохранитель, срабатывающий без повода, перестают читать. Проверено на живом: 6 статей и обе новые открываются, обложки отдаются, счётчик Метрики на месте, в карте сайта 17 адресов, главная и страницы видов спорта целы.
→ В очереди 4 свободные темы: требования к спортивной форме, влияние формы на результаты, особенности лёгкой атлетики, анатомические особенности кроя. Крон на Sonnet теперь должен работать без холостых прогонов - обе причины устранены. Через неделю смотреть, зашли ли статьи в индекс (проверка уже стоит).
Две новые статьи для ISKRA готовы и ждут ок владельца: myvisionagency.ru/lab/iskra-articles. Темы взяты из очереди по свободным ядрам - подготовка к сезону (16629 показов, самая спрашиваемая фраза кабинета) и печать на форме (про сублимацию, то есть про отличие компании). Обе прошли с первой попытки, 7811 и 7224 знака, по 4 раздела и 4 вопроса, обложки сгенерированы автоматически в стиле съёмки клиента. По дороге починены две вещи, из-за которых крон работал вхолостую два дня: критик Авито блокировал статью за домен в тексте, и фразы отбракованных дублей я вернул в очередь, откуда завод брал их снова. Также страница с двумя объявлениями Авито была затёрта аналитикой по тому же адресу lab/iskra-avito - восстановлена из локальной копии, аналитика переехала на lab/iskra-avito-stat, правило про проверку занятости адреса записано в скилл и память.
→ Ждём ок по статьям. После ок: сборка iskra_blog.py поверх свежей выкачки (blog-publish.py backup, потом check, потом upload), обложки забрать с aitodo /var/leadforge/seo-covers и залить первыми. В очереди остались 4 свободные темы: требования к спортивной форме, влияние формы на результаты, особенности лёгкой атлетики, анатомические особенности кроя.