<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>evstygney.ru</title>
<link>https://evstygney.ru/</link>
<description>Блог Егора, руководителя performance-маркетинга: сколько стоит маркетинг, что приносит и чем грозит. Воронки, юнит-экономика, Директ, CRM — для собственников и CEO.</description>
<language>ru</language>
<atom:link href="https://evstygney.ru/rss.xml" rel="self" type="application/rss+xml"/>
<item><title>Гарантия лидов от подрядчика: самое опасное обещание в КП</title><link>https://evstygney.ru/notes/garantiya-lidov/</link><guid isPermaLink="true">https://evstygney.ru/notes/garantiya-lidov/</guid><pubDate>Fri, 11 Sep 2026 09:00:00 +0300</pubDate><description>Гарантировать объём заявок может только тот, кто не отвечает за их качество. Расчёт стоимости сделки при квизовых лидах и как перевести разговор на экономику.</description><content:encoded><![CDATA[<p>«Гарантируем 100 лидов в месяц или вернём деньги» — самое опасное обещание в коммерческом предложении подрядчика.</p>
<p>Гарантировать объём лидов может только тот, кто не отвечает за их качество. Заявки умеют собирать квизами, розыгрышами и «оставьте номер — рассчитаем скидку». Гарантия выполнена, отчёт красивый, а отдел продаж неделями слышит «я ничего не оставлял» и «мне только спросить».</p>
<p><span class="vrez">В деньгах</span> Прикидка: 100 гарантированных лидов по 1500 ₽ — 150 тысяч в месяц. Если в сделку конвертится 1% вместо привычных для канала 10%, сделка обходится в 150 тысяч вместо 15. Сверху — часы менеджеров на прозвон анкет.</p>
<p><span class="vrez">Решение</span> Перевести разговор с объёма на экономику: цена квалифицированного лида по вашим записанным критериям, конверсия в сделку, стоимость сделки. Подрядчик, уверенный в качестве трафика, на квалификацию соглашается спокойно. Настаивает на «просто лидах» — теперь вы знаете почему.</p>
<p><span class="vrez">Замечание</span> Гарантия сама по себе не приговор. «Гарантируем объём работ и тестов» — нормальная практика. Красный флаг — гарантия числа заявок без единого слова о том, кто эти заявки.</p>
<p>Гарантия объёма без критерия качества переносит риск с подрядчика на ваш отдел продаж.</p>
<p>По каким записанным критериям ваши менеджеры отличают лид от анкеты с номером телефона — и есть ли эти критерии в договоре с подрядчиком?</p>]]></content:encoded></item>
<item><title>Мобильная конверсия: катастрофа в средней цифре</title><link>https://evstygney.ru/notes/mobilnaya-konversiya/</link><guid isPermaLink="true">https://evstygney.ru/notes/mobilnaya-konversiya/</guid><pubDate>Wed, 09 Sep 2026 09:00:00 +0300</pubDate><description>Средняя конверсия 2% склеивает десктоп 4% и мобайл 1% при 70% мобильного трафика. Как разрезать в Метрике и пройти путь клиента со своего телефона.</description><content:encoded><![CDATA[<p>«Конверсия сайта — 2%» — цифра, которая умеет прятать катастрофу. Потому что она средняя.</p>
<p>Типичная картина: с компьютера конвертится 4% посетителей, с телефона — 1%. При этом телефон — это 70% трафика. В среднем выходит прилично, и глубже никто не смотрит. А реклама тем временем льёт большую часть бюджета туда, где форму перекрывает баннер про куки, карта не грузится, а кнопка «Купить» уезжает за экран.</p>
<p><span class="vrez">В деньгах</span> Прикидка: бюджет 800 тысяч, 70% кликов — мобильные. При конверсии 1% против десктопных 4% больше полумиллиона в месяц работает с КПД вчетверо ниже возможного. Поднять мобильную конверсию с 1% хотя бы до 2% — мобильные заявки удвоятся, а общий поток вырастет примерно на треть без роста бюджета.</p>
<p><span class="vrez">Решение</span> Разрезать конверсию на десктоп и мобайл — две минуты в Метрике. Потом взять свой телефон и пройти путь клиента до конца: найти товар, заполнить форму, оплатить. Список того, что взбесило по дороге, и есть план работ.</p>
<p><span class="vrez">Замечание</span> В B2B мобильная конверсия честно ниже: с телефона изучают, а заявку отправляют с рабочего компьютера. Там мобайл сравнивают со своей же историей, и чинить в нём тоже есть что.</p>
<p>Средняя конверсия склеивает два разных сайта в одну цифру. Управлять можно только каждым по отдельности.</p>
<p>Вы знаете конверсию своего сайта с телефона — отдельно от красивой средней цифры?</p>]]></content:encoded></item>
<item><title>Почему не стоит менять настройки рекламы каждый день</title><link>https://evstygney.ru/notes/dashbord-kazhdyy-den/</link><guid isPermaLink="true">https://evstygney.ru/notes/dashbord-kazhdyy-den/</guid><pubDate>Mon, 07 Sep 2026 09:00:00 +0300</pubDate><description>Ежедневные правки сбрасывают обучение автостратегий: кампания живёт в вечной фазе разгона. Как развести ритмы «смотреть» и «менять» по записанному правилу.</description><content:encoded><![CDATA[<p>Чем чаще вы заглядываете в рекламный кабинет, тем хуже работает реклама. У этого есть конкретная механика.</p>
<p>Ежедневный взгляд провоцирует ежедневные решения: вчера цена заявки подскочила — отключили кампанию, порезали ставку, поменяли креатив. Но день — это шум: 5 заявок против 9 ничего не говорят о тренде. А крупные правки — ставка, бюджет, смена цели, перезапуск кампании — сбрасывают обучение автостратегии, и она заново тратит бюджет на разгон.</p>
<p><span class="vrez">В деньгах</span> Прикидка: стабильная кампания даёт заявку по 2000 ₽. Если её дёргать дважды в неделю, она живёт в вечной фазе обучения с заявкой по 3000 ₽. При 200 заявках в месяц — 200 тысяч переплаты. Это цена ощущения контроля.</p>
<p><span class="vrez">Решение</span> Развести ритмы: смотреть можно хоть каждый день, менять — раз в неделю, по недельному окну и по заранее записанному правилу («снижаем ставку, если цена заявки выше X две недели подряд»). Аварийное вмешательство — только на поломки: бюджет улетел в разы, ссылка ведёт в 404, открутка встала.</p>
<p><span class="vrez">Замечание</span> Это правило для стабильных кампаний с накопленной статистикой. Свежие запуски и распродажи первые дни смотрят руками — там ошибка стоит дорого уже к вечеру.</p>
<p>Реклама — из тех систем, где выдержка приносит больше денег, чем реакция.</p>
<p>Сколько раз за последний месяц вы или подрядчик меняли настройки кампаний — и по какому записанному правилу?</p>]]></content:encoded></item>
<item><title>Редизайн сайта без замера конверсии</title><link>https://evstygney.ru/notes/redizayn-bez-zamera/</link><guid isPermaLink="true">https://evstygney.ru/notes/redizayn-bez-zamera/</guid><pubDate>Fri, 04 Sep 2026 09:00:00 +0300</pubDate><description>Новый красивый сайт убрал таблицу цен и форму в шапке, конверсия упала с 3% до 2%. Как обращаться с редизайном как с гипотезой и когда откатывать.</description><content:encoded><![CDATA[<p>Новый красивый сайт — одна из самых частых причин внезапного падения продаж. И одна из самых редко подозреваемых.</p>
<p>Как это происходит. Сайт «морально устарел», дизайнеры сделали современно и воздушно. Под нож ушли «перегружающие» блоки: таблица цен на первом экране, кривоватые, но живые отзывы, форма заявки в шапке. Именно они и продавали. Конверсия падает с 3% до 2% — сайт стал красивее ровно на треть заявок.</p>
<p><span class="vrez">В деньгах</span> Трафик тот же, расходы на рекламу те же, заявок на треть меньше — стоимость заявки выросла в полтора раза. При бюджете миллион в месяц вы теперь платите ~500 тысяч сверху за «стало посимпатичнее». И отдельно заплатили за сам редизайн.</p>
<p>Связь при этом не видна: конверсию «до» никто не зафиксировал, падение списывают на сезон, конкурентов и «наверное, реклама испортилась». Студия свои деньги за дизайн получила, а за заявки почему-то отвечает подрядчик по трафику.</p>
<p><span class="vrez">Решение</span> Обращаться с редизайном как с гипотезой: зафиксировать конверсию до, переезжать поэтапно (сначала внутренние страницы, потом главная), продающие блоки переносить в новый дизайн целиком, после запуска две недели смотреть конверсию ежедневно. Просела — откатываться без жалости к красоте.</p>
<p><span class="vrez">Замечание</span> Бывает и наоборот: редизайн поднимает конверсию, и заметно. Отличить один сценарий от другого можно единственным способом — замером.</p>
<p>У сайта одна метрика — заявки и сделки. Красота учитывается в ней только через конверсию.</p>
<p>Вы знаете конверсию своего сайта прямо сейчас — чтобы было с чем сравнивать после следующего редизайна?</p>]]></content:encoded></item>
<item><title>«Дорого» в CRM — вежливая отговорка, а не причина</title><link>https://evstygney.ru/notes/dorogo-v-crm-otgovorka/</link><guid isPermaLink="true">https://evstygney.ru/notes/dorogo-v-crm-otgovorka/</guid><pubDate>Wed, 02 Sep 2026 09:00:00 +0300</pubDate><description>Клиенту проще сказать «дорого», менеджеру проще записать. По грязной колонке причин отказа режут прайс. Проверка руками: десять звонков раз в квартал.</description><content:encoded><![CDATA[<p>Если в причинах проигранных сделок лидирует «дорого», скорее всего, ваша CRM коллекционирует вежливые отговорки.</p>
<p>Как рождается это «дорого». Клиент говорит «дорого», потому что так проще всего закончить разговор без конфликта. Менеджер записывает «дорого», потому что эта причина снимает вопросы лично к нему: с ценой-то он сделать ничего не мог. Обе стороны выбрали удобный ответ — и в отчёте растёт уверенная колонка «проигрываем по цене».</p>
<p><span class="vrez">В деньгах</span> По этому сигналу принимаются дорогие решения: раздали скидки, срезали прайс на 10%. Маржа уехала сразу и на всех сделках, а конверсия не выросла — настоящие причины были другими: не увидел ценности, не поверил срокам, выбрал знакомого подрядчика, не смог продать вашу услугу внутри своей компании.</p>
<p><span class="vrez">Решение</span> Раз в квартал — проверка руками: прослушать десять звонков по проигранным сделкам или позвонить пяти проигравшим клиентам. Звонит пусть кто-то, кроме менеджера, который вёл сделку, — так отвечают честнее. И развести коды в CRM: «сравнивал цены, купил дешевле у конкурента» и «сказал „дорого“ и пропал» — разные причины с разными выводами. Первая и правда о цене. Вторая — почти всегда о ценности.</p>
<p><span class="vrez">Замечание</span> Иногда «дорого» — правда, и десять звонков это быстро покажут. Тогда разговор о цене станет предметным: с кем сравнивают и что за эти деньги дают там.</p>
<p>Что запомнить: колонка причин отказа — самая дешёвая аналитика в компании и самая загрязнённая. Проверка стоит день, решение по грязным данным — маржу всей компании.</p>
<p>Ваше «дорого» в CRM — оно проверено хотя бы одним звонком клиенту?</p>]]></content:encoded></item>
<item><title>Джун с бюджетом в 2 млн: цена экономии на зарплате</title><link>https://evstygney.ru/notes/dzhun-s-byudzhetom/</link><guid isPermaLink="true">https://evstygney.ru/notes/dzhun-s-byudzhetom/</guid><pubDate>Mon, 31 Aug 2026 09:00:00 +0300</pubDate><description>Экономия 60 тысяч на специалисте оборачивается 200–300 тысячами потерь на бюджете в месяц. Как привязать стоимость экспертизы к размеру бюджета.</description><content:encoded><![CDATA[<p>Экономия 60 тысяч на зарплате специалиста может стоить 200 тысяч в месяц на рекламном бюджете. Эту арифметику при найме почти никогда не считают.</p>
<p>Расклад на модельных числах. Бюджет 2 млн в месяц, им управляет начинающий специалист за 60 тысяч — «зачем переплачивать за настройку кабинетов». Типовые потери начинающего: поздно заметил рост CPA, оставил крутиться выгоревший креатив, скопировал настройки из чужой статьи, не отминусовал мусорные запросы. Каждая мелочь — 2–5% бюджета. В сумме набегает 10–15% неэффективности: 200–300 тысяч в месяц. Экономия на зарплате съедена трижды, и это без учёта упущенных заявок.</p>
<p>Джуны здесь ни при чём — начинающим положено ошибаться, на этом они учатся. Вопрос в цене учебного материала: 2 млн живого бюджета — дорогой тренажёр.</p>
<p><span class="vrez">Решение</span> Привязать стоимость экспертизы к размеру бюджета под управлением. На 300 тысячах бюджета джун под присмотром — нормально. На миллионах — либо опытный специалист, либо джун плюс регулярный внешний аудит: день сильного специалиста раз в месяц стоит заметно дешевле, чем 10% от двух миллионов.</p>
<p><span class="vrez">Замечание</span> Дорогой специалист без прозрачной отчётности — та же проблема, только с другим ценником. Контур проверки нужен любому, включая агентства с громкими именами.</p>
<p>Подведём итог: расходы на людей и потери на бюджете — сообщающиеся сосуды. Экономия в первом почти всегда выливается во второе, причём с множителем.</p>
<p>Кто сегодня управляет вашим рекламным бюджетом — и во сколько вам обходится разница между его уровнем и нужным?</p>]]></content:encoded></item>
<item><title>Программа лояльности, которая платит зря</title><link>https://evstygney.ru/notes/programma-loyalnosti-platit-zrya/</link><guid isPermaLink="true">https://evstygney.ru/notes/programma-loyalnosti-platit-zrya/</guid><pubDate>Fri, 28 Aug 2026 09:00:00 +0300</pubDate><description>Кэшбэк 5% всем: 4 из 5 млн уходят клиентам, которые купили бы и так. Как проектировать лояльность под изменение поведения и зачем контрольная группа.</description><content:encoded><![CDATA[<p>Программа лояльности с кэшбэком для всех — часто способ платить клиентам за то, что они и так делают.</p>
<p>Механика. Запустили баллы 5% всем покупателям. Львиная доля выплат достаётся самым лояльным — тем, кто и раньше покупал часто, безо всяких баллов. Их поведение программа не изменила, они просто стали платить на 5% меньше. Инкремент — покупки, которых без программы не случилось бы, — дают процентов 15–20 участников. Прикидка; у кого есть контрольная группа, тот знает свою цифру точно.</p>
<p><span class="vrez">В деньгах</span> Выручка 100 млн, начислено баллами 5 млн. Если программа изменила поведение только у 15% — около 4 млн вы раздали за покупки, которые произошли бы и так. По сути это скидка задним числом, размазанная по лучшей части базы.</p>
<p><span class="vrez">Решение</span> Проектировать лояльность как инструмент изменения поведения, у каждой механики — свой адресат: реактивация спящих («вернитесь, вот повод»), подъём частоты («третья покупка месяца даёт…»), выход в соседнюю категорию. Ковровый кэшбэк заменить целевыми предложениями сегментам, где есть что менять. И обязательно держать контрольную группу — без неё эффект программы неотличим от естественного поведения базы.</p>
<p><span class="vrez">Замечание</span> «Удержание дешевле привлечения» — правда. Но только когда программа реально удерживает, то есть меняет поведение, а не документирует его за деньги.</p>
<p>Бюджет лояльности должен покупать изменение поведения — всё остальное он просто дарит.</p>
<p>Сколько из ваших бонусных выплат за прошлый квартал ушло клиентам, которые купили бы и без них?</p>]]></content:encoded></item>
<item><title>Длинный цикл сделки: оценивайте каналы по когортам</title><link>https://evstygney.ru/notes/dlinnyy-cikl-kogorty/</link><guid isPermaLink="true">https://evstygney.ru/notes/dlinnyy-cikl-kogorty/</guid><pubDate>Wed, 26 Aug 2026 09:00:00 +0300</pubDate><description>Канал запустили в марте, в мае отключили как убыточный, сделки закрылись в сентябре. Как развести операционный отчёт и решения «жить или умереть».</description><content:encoded><![CDATA[<p>В бизнесе с длинной сделкой месячный отчёт по маркетингу умеет убивать работающие каналы.</p>
<p>Картина из практики. Цикл сделки — полгода. Канал запустили в марте, в мае отчёт показывает: расходы есть, сделок нет, «канал не окупается». Канал отключают. Сделки с мартовских лидов закрываются в сентябре — и записываются на что угодно, только не на источник, которого уже три месяца как нет. В отчётах этот канал навсегда останется убыточным.</p>
<p><span class="vrez">Простыми словами</span> Когорта — все лиды одного месяца, за которыми следят отдельно: что с ними стало через 3, 6, 9 месяцев. Канал с полугодовым циклом оценивают только по когортам, дозревшим хотя бы до этого срока.</p>
<p><span class="vrez">В деньгах</span> Убить дозревающий канал стоит дважды: сначала списали расходы на запуск и разгон, потом второй раз заплатите за перезапуск, когда через год кто-нибудь «откроет» этот канал заново. Видел этот круг несколько раз — обиднее всего, что каждое решение в моменте выглядело обоснованным: цифры же показывали убыток.</p>
<p><span class="vrez">Решение</span> Развести отчёты. Операционный месячный — для управления ставками и креативами по ранним сигналам: стоимость квалифицированного лида, конверсия в следующий этап воронки. Решения «жить или умереть» каналу — только по когортам возраста не меньше цикла сделки. И зафиксировать это правилом сейчас, пока все спокойны: в момент «срочно режем расходы» договориться уже не получится.</p>
<p>Подведём итог: у каждого канала есть срок созревания. Судить его раньше срока — способ дважды платить за одни и те же уроки.</p>
<p>По каким данным вы закрывали последний канал — успели ли они дозреть?</p>]]></content:encoded></item>
<item><title>Как мы с ИИ-агентом переносили канал из Telegram в MAX: три грабли Bot API и ограничение, переписавшее ТЗ</title><link>https://evstygney.ru/articles/max-bot-api/</link><guid isPermaLink="true">https://evstygney.ru/articles/max-bot-api/</guid><pubDate>Tue, 25 Aug 2026 09:00:00 +0300</pubDate><description>Перенос канала с историей в 1065 постов из Telegram в MAX вместе с ИИ-агентом: сертификат Минцифры, загрузка медиа, запрет тихой отправки и как ограничение переписало ТЗ.</description><content:encoded><![CDATA[<p><span class="vrez">TL;DR</span> Нужно было перенести канал с историей в 1065 постов за семь лет из Telegram в MAX и дальше дублировать туда новые публикации. Кода я не пишу: ставил задачу, принимал решения и проверял результат, а писал ИИ-агент. Половина работы ушла не на код, а на выяснение того, как ведёт себя приёмная сторона — запросы падали при верном токене, картинки долетали пустыми, видео обрывалось на середине. Главное ограничение отменило исходный план: в канал MAX нельзя отправить сообщение без уведомления подписчиков, поэтому «залить архив ночью, пока все спят» невозможно физически — вместо пакетной миграции пришлось делать очередь с ручным решением по каждому посту. Код — <a href="https://github.com/evstygney/telegram-to-max">в репозитории под MIT</a>. Чтение минут на десять.</p>
<p><span class="vrez">О формате</span> Статья написана в два голоса. Обычный текст — мой: задача, симптомы, решения. Всё, что помечено <strong>Агент</strong>, — от Claude Code, который этот код и писал: разбор причины, код и способ, которым он до причины дошёл. Я правил эти куски по длине и выкидывал жаргон; разбор и факты — его. Так честнее, чем изображать, будто я сам разобрался в цепочках сертификатов. К тому же полезное здесь лежит по разные стороны: приёмы диагностики — у него, решение о том, что делать с ограничением платформы, — у меня.</p>
<h2 id="_1">Задача и первый упор</h2>
<p>Дано: Telegram-канал, 1065 постов с 2019 года. Нужно: тот же контент в канале MAX, дальше новые публикации туда автоматически. Условие, которое сразу отсекает половину решений: в канале MAX уже лежала примерно сотня постов — часть перенесли руками, часть написана только там и в Telegram отсутствует. Дублей быть не должно, «отправить всё подряд» не годится.</p>
<p>Упор случился раньше, чем я успел что-то запланировать: архив канала боту недоступен.</p>
<p><span class="vrez">Агент</span> Telegram Bot API не отдаёт историю канала — ни одному боту, ни за какие права. Бот видит только то, что опубликовано после его добавления, событием <code>channel_post</code>. Архив достаётся двумя путями: клиентский API (MTProto, отдельная авторизация живым аккаунтом) или ручной экспорт из Telegram Desktop в JSON. Я предложил экспорт: одна кнопка в клиенте, на выходе <code>result.json</code> и папки с медиа, никакой второй авторизации и никаких вопросов к тому, чьей сессией ходит бот. Отсюда архитектура из двух потоков: старое из экспорта, новое из <code>channel_post</code>, память о перенесённом — JSON-файл с ключом по <code>id</code> сообщения Telegram, он стабилен между переэкспортами. Стек скучный намеренно: Node, grammY на стороне Telegram, официальный <code>@maxhub/max-bot-api</code> на стороне MAX, один процесс, long polling — так у бота нет ни одного открытого порта.</p>
<h2 id="1">Грабля 1. Бот молчал при верном токене</h2>
<p>Первый запуск — тишина. Бот не отвечал, в консоли лежала ошибка, из которой я понял одно слово: failed. Первая мысль была, что мы неправильно завели бота — не тот токен, не те права, не туда добавили. Я отправил агента перепроверять токен.</p>
<p><span class="vrez">Агент</span> Ошибка выглядела так:</p>
<pre><code>TypeError: fetch failed
  cause: UNABLE_TO_GET_ISSUER_CERT_LOCALLY
</code></pre>
<p>Гипотезу про токен я отсёк одним запросом: <code>getMyInfo</code> падал точно так же, как обращение к чужому чату, а при неверном токене API отвечает осмысленной 401 — симптом не совпадал. Верхний слой ошибки в Node вообще малоинформативен: <code>TypeError: fetch failed</code> — обёртка undici поверх любой транспортной проблемы, от DNS до TLS. Настоящая причина лежит в <code>err.cause</code>, и она указала на проверку цепочки сертификатов.</p>
<p>Дальше вопрос сузился: наш клиент или сервер. <code>openssl s_client -connect platform-api2.max.ru:443</code> показал, что цепочка выстраивается до корня, которого нет в хранилище Node: MAX отдаёт сертификат российского доверенного удостоверяющего центра (Минцифры). Браузер и часть системных клиентов этот корень знают, Node — нет, поэтому в браузере ссылка открывается, а из кода не работает. Расхождение и сбивает прицел. Telegram API проблемы не имеет — там обычный публичный УЦ, и это добавляет уверенности, что «сеть в порядке, сломан MAX-бот».</p>
<p>Решение — подсунуть Node недостающие корни:</p>
<pre><code class="language-bash">curl -fsSL -o root.crt https://gu-st.ru/content/lending/russian_trusted_root_ca_pem.crt
curl -fsSL -o sub.crt  https://gu-st.ru/content/lending/russian_trusted_sub_ca_pem.crt
awk 1 root.crt sub.crt &gt; russian-trusted-ca.pem

NODE_EXTRA_CA_CERTS=russian-trusted-ca.pem node src/index.js
</code></pre>
<p>Две детали, на которых легко потерять ещё по получасу. Склеивать бандл нужно через <code>awk 1</code>: если в первом файле нет завершающего перевода строки, <code>cat</code> приклеит <code>-----END CERTIFICATE-----</code> к <code>-----BEGIN CERTIFICATE-----</code> следующего, и OpenSSL ответит <code>bad end line</code>. И <code>NODE_EXTRA_CA_CERTS</code> читается процессом Node <strong>при старте</strong>, до того как отработает <code>dotenv</code>, — положить переменную в <code>.env</code> нельзя, только в окружение: npm-скрипт, systemd-юнит, <code>Dockerfile</code>. В репозитории она зашита в <code>package.json</code>, чтобы про сертификат не помнил никто.</p>
<h2 id="_2">Ограничение, которое переписало ТЗ</h2>
<p>Дальше я озвучил план, который казался очевидным: гоним архив пакетом, ночью, с выключенными уведомлениями. Тысяча постов приедет за час, подписчики утром увидят наполненный канал и не получат тысячу пушей. Попросил проверить, что уведомления выключаются.</p>
<p><span class="vrez">Агент</span> Проверять пришлось эмпирически: документация про канальные ограничения молчала, типы SDK описывали <code>notify?: boolean</code> без оговорок — оба источника отвечали «можно». Я написал скрипт на двадцать строк, который шлёт один и тот же вызов в трёх вариантах:</p>
<pre><code class="language-javascript">const variants = [
  ['notify: true',      { notify: true }],
  ['без поля notify',   {}],
  ['notify: false',     { notify: false }],
];

for (const [label, extra] of variants) {
  try {
    const r = await api.sendMessageToChat(chatId, `diag: ${label}`, extra);
    console.log(`OK   [${label}] → mid=${r?.body?.mid}`);
  } catch (e) {
    console.log(`FAIL [${label}] → ${e?.message}`);
  }
}
</code></pre>
<p>На канале вывод получился такой:</p>
<pre><code>OK   [notify: true]    → mid=…
OK   [без поля notify] → mid=…
FAIL [notify: false]   → 400 errors.send-message.channel-notify
</code></pre>
<p>Каналы MAX не игнорируют <code>notify: false</code> молча, а отвечают ошибкой. Отдельно я проверил приватный чат — туда тихая отправка проходит, значит ограничение относится именно к каналам. Правило, которое я из этого вынес: предположение о поведении молодого API стоит дороже, чем его проверка. Особенно когда на предположении держится вся архитектура.</p>
<h3 id="_3">Что я с этим сделал</h3>
<p>Костыля здесь нет. Ждать ночи бессмысленно — пуши придут утром пачкой. Растянуть отправку на недели — тот же спам, только медленный. Тихой миграции архива не существует, и план надо было не чинить, а менять.</p>
<p>Ограничение переехало в продукт. Бот показывает владельцу канала пост за постом прямо в личку в Telegram: превью с медиа и две кнопки, «Шлём» и «Не шлём». Нажали — пост ушёл в MAX и записан, показан следующий. Прерваться можно в любой момент, <code>/status</code> покажет остаток.</p>
<p>Дальше выяснилось, что это решение закрывает ещё две задачи, которые я собирался решать отдельно.</p>
<p><strong>Сверка с тем, что уже лежит в MAX.</strong> Помните сотню постов, перенесённых руками? Я думал, придётся сравнивать содержание автоматически. Не понадобилось: человек, глядя на превью, помечает такие «Не шлём». Хеш содержания агент всё-таки считает и хранит, но решение по нему не принимает — цена ошибки в дубле у подписчиков выше, чем экономия десяти минут.</p>
<p><span class="vrez">Темп</span> Уведомления подписчикам — часть отношений владельца канала с его аудиторией, и распоряжаться ими должен он, а не строка в конфиге. Тысяча постов разбирается частями по вечерам, и это правильная скорость.</p>
<p><span class="vrez">Замечание</span> Отдельно попросил режим репетиции: те же кнопки, но всё уходит в тестовый канал и решения не записываются. Это оказалось важнее, чем я думал: разбирать историю будет не тот, кто настраивал бота, и первое знакомство с кнопками не должно происходить на живых подписчиках.</p>
<h2 id="2-max">Грабля 2. В MAX приезжал пост без картинки</h2>
<p>Текст доходил, фотография — нет. Я решил, что дело в самих фотографиях: старые, тяжёлые, сняты чем попало. Попросил проверить на свежей — не помогло.</p>
<p><span class="vrez">Агент</span> Симптом сбивал прицел дважды. Сначала сервер отвечал <code>505 NO_IMAGE</code> — читается как «не принял формат», и я пережимал jpeg, менял размер, пробовал другие файлы. Потом отправка падала с <code>400: No 'photos','url' or 'token' provided</code> — читается как «неверно собрал вложения», и я полез перечитывать формат сообщения. Обе гипотезы были про мой код, обе оказались мимо.</p>
<p>Отсекло их одно наблюдение: <code>toJson()</code> возвращал пустой <code>payload</code> <strong>ещё до отправки</strong>. Значит, ломается загрузка, а сообщение и картинка тут ни при чём. Дальше я перестал гадать и пошёл читать <code>node_modules/@maxhub/max-bot-api</code>. Там нашлись две ветки загрузки: для изображений SDK идёт multipart-веткой, где в <code>FormData</code> кладётся псевдо-<code>File</code>, — undici на Node 20+ такой объект не принимает, и до сервера доезжает пустое тело. Видео, аудио и документы уходят другой веткой и путём грузятся нормально.</p>
<p>Достаточно передать буфер, тогда SDK уходит в буферную ветку с настоящим <code>Blob</code>:</p>
<pre><code class="language-javascript">// приезжает пустое вложение
await api.uploadImage({ source: '/path/to/pic.jpg' });

// работает
await api.uploadImage({ source: await fs.promises.readFile('/path/to/pic.jpg') });
</code></pre>
<p>Версия SDK — <code>@maxhub/max-bot-api</code> 0.2.5, Node 24; к моменту публикации могут починить, проверяется одной картинкой. Приём, который здесь окупился: <strong>исходники в <code>node_modules</code> — такой же источник правды, как документация, и обычно свежее.</strong> Типы я по ним же и сверял: пара методов в документации называлась иначе, чем в коде.</p>
<h2 id="3">Грабля 3. Видео обрывалось на середине</h2>
<p>Фотографии поехали, видео — нет: загрузка прерывалась примерно на двадцатой секунде. Выглядело как плохая связь, и я честно перезапускал.</p>
<p><span class="vrez">Агент</span> <code>This operation was aborted</code> ровно через двадцать секунд — это дефолтный таймаут загрузки в SDK. MAX принимает файлы медленно: видео на 7 МБ в двадцать секунд не укладывалось. Ретраи обрывались на той же секунде, что подтверждало версию про связь. Фикс — задать таймаут явно:</p>
<pre><code class="language-javascript">await api.uploadVideo({ source: path, timeout: 300_000 }); // пять минут
</code></pre>
<p>Грабля скучная, но показательная: дефолт библиотеки рассчитан на другой профиль нагрузки, а формулировка ошибки уводит в сторону сети.</p>
<h2 id="_4">Чего я чуть не лишился молча</h2>
<p>Самое неприятное в этой истории я бы не заметил вообще. В канале за семь лет накопились опросы — обычные телеграмные голосовалки. При переносе они бы просто исчезли, и узнал бы я об этом в лучшем случае через неделю от владельца канала.</p>
<p><span class="vrez">Агент</span> Перед первым переносом я написал не парсер, а анализатор потерь: скрипт читает экспорт и печатает, сколько сообщений каждого типа, сколько медиафайлов не найдено на диске и — главное — <strong>что именно парсер выбросил и по какому признаку</strong>. Выброшенными оказались посты-опросы: вопрос лежит в поле <code>msg.poll</code>, а не в тексте, поэтому пост из одного опроса выглядит как сообщение без текста и без файла, то есть как пустое. Починка простая — рендерить опрос текстом, вопрос плюс варианты; интерактивных опросов MAX всё равно не поддерживает.</p>
<p>Тот же отчёт нашёл шесть видео, которые Telegram Desktop не докачал при экспорте, — сам клиент об этом не сообщил никак. Приём переносится на любую миграцию данных: <strong>сначала инструмент, который показывает, что вы теряете, потом инструмент, который переносит.</strong> Стоит полчаса и всегда что-нибудь находит.</p>
<h2 id="_5">Что ещё вылезло на стыке двух платформ</h2>
<p><span class="vrez">Агент</span> Два ограничения, которые стоит знать заранее.</p>
<p>Bot API Telegram не отдаёт файлы больше 20 МБ: <code>getFile</code> на большом видео возвращает ответ без <code>file_path</code>, скачать его ботом нельзя никак. Такие посты уходят текстом, а оператору падает предупреждение; обходится либо руками, либо переездом на клиентский API.</p>
<p>Альбомы живут по-разному в двух источниках. В живых постах Telegram присылает альбом несколькими сообщениями с общим <code>media_group_id</code> — их надо буферизовать (у нас две секунды после последнего) и склеивать в один пост MAX с несколькими вложениями. В экспорте Telegram Desktop группировки нет вовсе: каждое фото лежит отдельным сообщением со своим <code>id</code>, восстанавливать альбомы пришлось бы эвристикой по времени. Мы не стали — в разборе истории каждое фото показывается отдельно.</p>
<h2 id="_6">Сводка граблей</h2>
<p><span class="vrez">Агент</span> Всё, на что мы наступили, одной таблицей.</p>
<table>
<thead>
<tr>
<th>Симптом</th>
<th>Куда смотрят первым делом</th>
<th>Причина</th>
<th>Фикс</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>TypeError: fetch failed</code>, в <code>cause</code> — <code>UNABLE_TO_GET_ISSUER_CERT_LOCALLY</code></td>
<td>токен, сеть, прокси</td>
<td>в хранилище Node нет корневого сертификата Минцифры</td>
<td>бандл root + sub через <code>NODE_EXTRA_CA_CERTS</code> (не в <code>.env</code> — читается до <code>dotenv</code>)</td>
</tr>
<tr>
<td><code>400 errors.send-message.channel-notify</code></td>
<td>параметры вызова</td>
<td>каналы MAX не принимают <code>notify: false</code></td>
<td>тихой отправки нет; ограничение переносится в дизайн продукта</td>
</tr>
<tr>
<td><code>505 NO_IMAGE</code>, пустой <code>payload</code>, затем <code>400: No 'photos'…</code></td>
<td>формат картинки, сборка вложений</td>
<td>multipart-ветка SDK шлёт псевдо-<code>File</code>, undici его не принимает</td>
<td>грузить изображение буфером</td>
</tr>
<tr>
<td><code>This operation was aborted</code> через 20 с</td>
<td>связь, ретраи</td>
<td>дефолтный таймаут загрузки в SDK</td>
<td><code>timeout</code> явно, 300 000 мс</td>
</tr>
<tr>
<td>пост из экспорта пропал без ошибки</td>
<td>парсер текста</td>
<td>вопрос опроса лежит в <code>msg.poll</code></td>
<td>рендерить опрос текстом + отчёт о выброшенном</td>
</tr>
</tbody>
</table>
<h2 id="_7">Приёмы, которые агент вынес из этой недели</h2>
<p><span class="vrez">Агент</span> Четыре вещи, которые я теперь делаю на любой интеграции с молодым API.</p>
<p><strong>Читать <code>cause</code>, а не сообщение.</strong> Верхний слой ошибки в Node обычно не значит ничего. Полминуты на печать причины экономят перевыпуск токенов и переустановку зависимостей.</p>
<p><span class="vrez">Проверять предположение вызовом</span> Двадцать строк, три варианта, тестовая цель. Дешевле любой дискуссии о том, что имелось в виду в описании метода.</p>
<p><strong>Считать <code>node_modules</code> источником правды.</strong> У молодых SDK документация отстаёт от кода: расходятся и названия методов, и поведение внутренних веток.</p>
<p><strong>Сначала инструмент потерь, потом инструмент переноса.</strong> Любая миграция что-нибудь выбрасывает молча; отчёт «что я не взял и почему» находит это до того, как данные уедут.</p>
<h2 id="_8">Что из этого понял я</h2>
<p>Про API мне сказать нечего, а про постановку задачи — есть.</p>
<p><strong>Ограничение платформы стоит читать как вводную для продукта.</strong> Запрет тихой отправки можно было обходить неделю и получить в итоге медленный спам. Вместо этого сценарий переехал с «мигратор гонит архив» на «владелец канала разбирает архив сам», и продукт стал честнее: человек видит каждый пост, который увидят его подписчики. Ограничение выкинуло сценарий, который был плох и сам по себе.</p>
<p><strong>От агента нужно требовать доказательство.</strong> Три раза за эту неделю первая версия ответа была правдоподобной и неверной: «дело в токене», «сервер не принял формат», «плохая связь». Каждый раз всё менялось после того, как появлялся способ проверить: три варианта одного вызова, проверка на полпути вместо проверки результата, отчёт о выброшенном. Формулировка «покажи, чем это доказывается» работает лучше, чем «почини».</p>
<p><span class="vrez">Репетиция важнее, чем кажется</span> Первое, что я попросил после рабочего прототипа, — режим, в котором всё уходит в тестовый канал. Ошибка здесь необратима на чужой аудитории: отменить пуш у тысячи человек нельзя, и объясняться с ними будет владелец канала.</p>
<h2 id="_9">Если хотите повторить у себя</h2>
<p><span class="vrez">Агент</span> Минимальный путь от клона до первого перенесённого поста:</p>
<pre><code class="language-bash">git clone https://github.com/evstygney/telegram-to-max
cd telegram-to-max &amp;&amp; npm install
cp .env.example .env       # заполнить пять значений, см. ниже
npm run probe              # связь с MAX: токен, канал, чтение истории, тестовая отправка
npm start                  # дальше всё в личке с ботом: /practice on → /backfill
</code></pre>
<p>В <code>.env</code> нужны пять значений: два токена (Telegram — у <a href="https://t.me/BotFather">@BotFather</a>, MAX — у мастер-бота платформы), собственный Telegram id (бот подскажет его на <code>/start</code>) и два <code>chat_id</code> MAX-каналов, боевого и тестового, — оба покажет <code>npm run get-max-chat-id</code>.</p>
<p>Два условия, без которых ничего не поедет. Telegram-бот должен быть <strong>администратором</strong> канала: иначе он не получает <code>channel_post</code> и новые посты для него не существуют. MAX-бот должен состоять в целевом канале с правом писать.</p>
<p>Тестовый канал заведите до первого запуска, а не после. Тихого режима в каналах MAX нет, отменить отправку нельзя, и первое знакомство с кнопками лучше пережить в пустом канале на одного зрителя. Сертификат Минцифры отдельно ставить не нужно — он лежит в репозитории и подключён в npm-скриптах.</p>
<h2 id="_10">Где это не работает</h2>
<ul>
<li><strong>Каналу до сотни постов бот не нужен</strong> — настройка двух ботов и сервера дольше ручного переноса.</li>
<li><strong>Комментарии и реакции не переносятся</strong>, только посты.</li>
<li><strong>Разбор истории требует человека:</strong> тысяча постов — тысяча решений.</li>
<li><strong>Видео тяжелее 20 МБ придётся публиковать руками</strong>, пока источник — ботовый API Telegram.</li>
<li><strong>Всё описанное верно для <code>@maxhub/max-bot-api</code> 0.2.5 и августа 2026.</strong> API молодой, поведение меняется; каждая грабля проверяется одной командой.</li>
</ul>
<h2 id="_11">Краткие выводы</h2>
<ol>
<li><code>fetch failed</code> при работе с MAX указывает на корневой сертификат Минцифры. Лечится переменной окружения, которую нельзя положить в <code>.env</code>.</li>
<li>Отправить пост в канал MAX без уведомления подписчиков нельзя. Любой сценарий массового переноса нужно проектировать вокруг этого факта.</li>
<li>Картинки в SDK 0.2.5 грузятся буфером, файлы — путём. Дефолтный таймаут в 20 секунд не рассчитан на видео.</li>
<li>Поведение незрелого API дешевле измерить, чем вычитать: три варианта вызова в тестовом чате отвечают быстрее, чем документация и типы вместе взятые.</li>
</ol>
<p>Код целиком — <a href="https://github.com/evstygney/telegram-to-max">github.com/evstygney/telegram-to-max</a>, MIT, около тысячи строк без сборки и фреймворков. Грабли вынесены в отдельный документ: если пишете своего бота для MAX, он сэкономит вам вечер.</p>
<p>У меня остался вопрос к тем, кто так же работает с агентом в паре. Правдоподобный неверный ответ оказался самой дорогой частью этой недели: он звучит уверенно и уводит на день в сторону. Что вы просите у агента, чтобы ловить такие ответы раньше, чем начнёте их чинить?</p>]]></content:encoded></item>
<item><title>A/B-тест на малом трафике: вы смотрите на шум</title><link>https://evstygney.ru/notes/ab-test-na-malykh-chislakh/</link><guid isPermaLink="true">https://evstygney.ru/notes/ab-test-na-malykh-chislakh/</guid><pubDate>Mon, 24 Aug 2026 09:00:00 +0300</pubDate><description>Полсотни конверсий на вариант дают случайный разброс ±20%. Что тестировать на скромном трафике и когда честнее принять решение без теста.</description><content:encoded><![CDATA[<p>Ваш A/B-тест показал «вариант B лучше на 15%». Если конверсий меньше пары сотен на вариант — скорее всего, вы смотрите на шум.</p>
<p>Математика неприятная. При конверсии около 3% и полусотне конверсий на вариант случайный разброс легко даёт разницу ±20%. То есть «победа B на 15%» и «победа A на 15%» — равновероятные исходы одной и той же монетки. Чтобы надёжно отличить конверсию 3% от 3,5%, нужны десятки тысяч визитов на вариант — у большинства малых и средних бизнесов столько трафика копится месяцами.</p>
<p><span class="vrez">В деньгах</span> Цена вопроса — решения, принятые по шуму: переделали лендинг под «победителя», перекроили оффер, отчитались о росте. Реального эффекта нет, а трафик на тест и время команды потрачены настоящие. Хуже того — вы теперь уверены в цифре, которой не существует.</p>
<p><span class="vrez">Решение</span> Два честных пути. Первый — тестировать только крупное: оффер, цену, структуру первого экрана, форму заявки. Там эффект бывает +30–50%, и его видно на скромном трафике. Цвет кнопок оставьте корпорациям с миллионами визитов. Второй — заранее посчитать нужный объём выборки (бесплатные калькуляторы ищутся по запросу «размер выборки A/B-теста») и честно решить: «на нашем трафике тест займёт четыре месяца — принимаем без теста, по здравому смыслу и пяти разговорам с клиентами».</p>
<p><span class="vrez">Замечание</span> Осознанное решение без теста лучше решения по фальшивому тесту — как минимум вы помните, что это гипотеза, и следите за ней.</p>
<p>Тест стоит запускать тогда, когда у него есть шанс что-то доказать именно на вашем трафике.</p>
<p>Ваш последний «победивший» вариант — сколько конверсий стояло за той победой?</p>]]></content:encoded></item>
<item><title>Почему нельзя просто залить бюджетом рабочую связку</title><link>https://evstygney.ru/notes/masshtabirovat-chto-rabotaet/</link><guid isPermaLink="true">https://evstygney.ru/notes/masshtabirovat-chto-rabotaet/</guid><pubDate>Fri, 21 Aug 2026 09:00:00 +0300</pubDate><description>Средний CAC 2600 ₽ прячет маржинальный 3700: вторая половина бюджета убыточна. Как наращивать шагами и считать клиентов с последней порции денег.</description><content:encoded><![CDATA[<p>«Найдём связку, которая работает, и зальём её бюджетом» — план, который ломается о собственную математику.</p>
<p>Почему лучшая кампания лучшая? Она работает на узком горячем сегменте: точный запрос, тёплая аудитория, идеальное попадание оффера. Таких людей мало. Удвоив бюджет, вы не получите «в два раза больше таких же» — их больше не существует. Система дотягивается до аудитории похуже, аукцион на расширении дороже, и каждый следующий рубль приносит меньше предыдущего.</p>
<p>Модельные числа. Кампания на 100 тысячах бюджета даёт CAC 2000 ₽ — 50 клиентов. Подняли до 200 тысяч — средний CAC стал 2600, клиентов 77. Терпимо? Теперь посчитаем маржинальный CAC — почём обошлись клиенты именно со вторых ста тысяч: 27 клиентов, по 3700 ₽ каждый. При марже с клиента 3000 ₽ вторая половина бюджета убыточна, а средняя цифра в кабинете это прячет.</p>
<p><span class="vrez">Простыми словами</span> Маржинальный CAC — сколько стоили клиенты с последней добавленной порции бюджета. Решения о масштабировании принимаются по нему, средний оставьте для отчётов.</p>
<p><span class="vrez">Решение</span> Наращивать шагами по 20–30% с паузой на стабилизацию, после каждого шага сверять маржинальный CAC с предельно допустимым. Перестало сходиться — расти через новые сегменты, офферы и каналы, вместо доливания в выжатую связку.</p>
<p>Подведём итог: связки не умножаются — они выжимаются. Рост живёт в портфеле связок, а предел каждой отдельной показывает маржинальный CAC.</p>
<p>Вы знаете, сколько клиентов принёс последний вложенный в рекламу рубль, — или только средний по кабинету?</p>]]></content:encoded></item>
<item><title>RAG против карты и grep: слепое сравнение на своей базе из 2000 заметок</title><link>https://evstygney.ru/articles/rag-vs-map-grep-blind-test/</link><guid isPermaLink="true">https://evstygney.ru/articles/rag-vs-map-grep-blind-test/</guid><pubDate>Thu, 20 Aug 2026 09:00:00 +0300</pubDate><description>Слепое сравнение RAG (bge-m3 + sqlite-vec) с картой воркспейса и grep на 24 замороженных вопросах: ничья 9:9 и разворот по типам вопросов.</description><content:encoded><![CDATA[<p><span class="vrez">TL;DR</span> В прошлой статье я отмахнулся от RAG для личной базы знаний: «пушка по воробьям». Потом собрал его руками и измерил. Локальная модель bge-m3, sqlite-vec, 29 295 чанков, 18 часов индексации на процессоре, поисковая тула для агента. Дальше — слепое сравнение с моей текущей навигацией (карта <code>main.md</code> + grep) на 24 вопросах, два режима, одинаковый лимит шагов, обезличенные пары и судья, который не знал, чей ответ читает. Итог — ничья 9:9. Внутри ничьей разворот: точечные вопросы семантический поиск берёт 7:1 и вдвое дешевле по шагам, обзорные проигрывает 8:2. Точный тест Фишера на этом развороте даёт p ≈ 0,015. Ниже — стек, методика замера, все числа и раздел про то, где мой тест врёт. Чтение займёт минут десять.</p>
<p><span class="vrez">Простыми словами</span> RAG здесь — поиск по смыслу: текст режется на куски, каждый кусок превращается в вектор, вопрос тоже превращается в вектор, дальше ищем ближайшие. Карта (<code>main.md</code>) — файл-оглавление, по строке на каждый проект и раздел базы: агент читает его и понимает, куда идти.</p>
<h2 id="_1">Зачем я полез проверять собственное утверждение</h2>
<p>Четыре месяца мой ИИ-агент живёт на файловой памяти: карта воркспейса, память по проекту, база знаний в markdown. Про эту конструкцию была <a href="/articles/ai-agent-file-memory/">прошлая статья</a>, и в ней я двумя абзацами закрыл тему семантического поиска: инфраструктура ради задачи «не пересказывать проект», результат поиска по эмбеддингам не отревьюишь глазами так же просто, как файл. И оставил себе лазейку: «если у вас тысячи заметок с перекрёстными смысловыми запросами — RAG вернётся в разговор».</p>
<p>Потом я посчитал файлы. Их 3156.</p>
<p>Дальше было два пути: продолжать рассуждать о том, чего не пробовал, или собрать RAG и померить. Выбрал второе, с условием — мерить честно, включая вариант «отрицательный результат». Отрицательный результат меня устраивал: я бы сэкономил вечера и написал, почему не стоит.</p>
<h2 id="_2">База и что в неё вошло</h2>
<p>3156 markdown-файлов, 64 МБ текста. Из них 31 МБ — выгрузки таблиц в markdown, куски исследований по 1–2 МБ. Табличные дампы я из индекса выкинул сразу: чанк из такой простыни — набор ячеек без смысла, он будет мусорить выдачу и портить сравнение в пользу карты.</p>
<p>Осталось 1978 файлов и 26 МБ живого текста. При чанках по 600 токенов я прикинул 12–18 тысяч кусков. Реально получилось <strong>29 295</strong> — промах вдвое, потому что заголовков в базе больше, чем я думал, и резка по секциям даёт много коротких чанков. Первый урок дешёвый: считайте чанки токенизатором целевой модели до того, как планировать время индексации.</p>
<p><span class="vrez">Замечание</span> В базе есть то, что не хочется отдавать на чужой сервер, поэтому облачные эмбеддинги отпали на входе. Полная индексация через API стоила бы центов тридцать — сумма смешная, но текст при этом уезжает на чужой сервер. Второй довод в пользу локальной модели прагматичнее приватности: индекс намертво привязан к эмбеддеру. Депрекейтнут модель в облаке — поиск умер до полной переиндексации. Модель на диске никуда не денется.</p>
<h2 id="18">Стек и 18 часов на процессоре</h2>
<ul>
<li><strong>Эмбеддер:</strong> bge-m3, 1024 измерения, мультиязычная. Веса 2,2 ГБ на диске.</li>
<li><strong>Хранилище:</strong> SQLite с расширением sqlite-vec для векторов и штатным FTS5 для BM25. Один файл на 120 МБ, никакого сервера. Векторов мало (29 тысяч), приближённый поиск не нужен — полный перебор укладывается в миллисекунды.</li>
<li><strong>Поиск:</strong> гибрид, вектор и BM25 идут параллельно, результаты сливаются ранговым методом RRF. Это важно для чистоты сравнения: режим RAG получил внутрь и лексический поиск тоже, так что проигрыш нельзя списать на «вектор не знает слова».</li>
<li><strong>Чанкинг:</strong> по заголовкам, 600 токенов, перекрытие 100, метаданные из frontmatter.</li>
<li><strong>Интерфейс для агента:</strong> MCP-сервер с одной тулой <code>search_kb(запрос, k, префикс_пути)</code>, отдаёт текст чанков с путями.</li>
</ul>
<p>Дальше начались измерения, которые я в план не закладывал. Бенчмарк bge-m3 на моём ноутбуке (12 логических ядер, дискретной видеокарты нет) — <strong>0,45 чанка в секунду</strong>. Это 18 часов на полный прогон.</p>
<p>Я честно попробовал разогнать. ONNX через onnxruntime — 0,46 чанка/с. Динамическое int8-квантование — 0,42, то есть медленнее. Векторы при этом совпали с исходными до косинуса 1,0, так что квантование как минимум ничего не сломало, просто не помогло. Вывод для тех, кто пойдёт тем же путём: такая модель упирается в пропускную способность памяти, поэтому типовые процессорные ускорители на ней не дают ничего. Индекс собирался ночами, полтора суток по календарю; инкрементальность по SHA-256 спасла, когда прогон оборвался на 60% — второй запуск продолжил с того же места.</p>
<p><span class="vrez">Плюсы</span> запросы работают мгновенно. Эмбеддинг вопроса — десятые доли секунды, поиск по 29 тысячам векторов — миллисекунды. Медленная только индексация, и она разовая.</p>
<p>Грабли, на которые я потратил вечер:</p>
<table>
<thead>
<tr>
<th>Грабля</th>
<th>Что происходит</th>
<th>Фикс</th>
</tr>
</thead>
<tbody>
<tr>
<td>fastembed не поддерживает bge-m3</td>
<td>модели нет в списке, а хочется именно мультиязычную</td>
<td>sentence-transformers + torch с процессорного индекса</td>
</tr>
<tr>
<td>В пакете <code>mcp</code> 2.0 нет <code>FastMCP</code></td>
<td><code>ModuleNotFoundError</code> на импорте по любому туториалу</td>
<td>класс <code>MCPServer</code> из <code>mcp.server.mcpserver</code>, API тот же</td>
</tr>
<tr>
<td>Модель грузится 13 секунд при импорте</td>
<td>клиент считает сервер мёртвым по таймауту рукопожатия</td>
<td>ленивая загрузка при первом запросе, старт мгновенный</td>
</tr>
<tr>
<td>Индексер и поиск дерутся за файл базы</td>
<td>«database is locked» посреди прогона</td>
<td>читателю — соединение read-only и <code>busy_timeout</code></td>
</tr>
<tr>
<td>Логи модели в stdout</td>
<td>ломают протокол обмена с агентом</td>
<td>всё, кроме ответа, гнать в stderr</td>
</tr>
</tbody>
</table>
<h2 id="_3">Как я мерил, чтобы не обмануть себя</h2>
<p>Соблазн при таком замере один: подсознательно подыграть системе, в которую вложил три дня. Поэтому методику я зафиксировал до первого прогона.</p>
<p><strong>Эталонный набор — 24 вопроса, замороженные заранее.</strong> 14 точечных (ответ лежит в одном конкретном месте: значение параметра, правило, шаблон ссылки) и 10 обзорных, где ответ собирается из 2–5 файлов разных проектов. К каждому вопросу — список эталонных файлов и ключевой факт, который обязан прозвучать.</p>
<p><strong>Эталоны собирал отдельный агент-разведчик обычными Grep и Glob.</strong> Если искать источники правды тем же инструментом, который потом тестируешь, набор молча подгонится под его выдачу. Разведка по двум вопросам поправила меня: я помнил цифры не так, как они записаны в базе. Формулировки этих двух вопросов я привёл к тому, что реально лежит в файлах.</p>
<p><span class="vrez">Два режима, одинаковые условия</span> Режим R: агенту доступна только поисковая тула, читать можно лишь файлы из её выдачи. Режим G: только <code>main.md</code>, Grep, Glob и чтение. Одна и та же модель, один и тот же промпт, жёсткий лимит 15 вызовов инструментов, свежая сессия на каждый вопрос — 48 прогонов.</p>
<p><span class="vrez">Слепое судейство</span> Судья получал вопрос, эталон и два обезличенных ответа со сменным порядком внутри пары. Какой ответ чьей системы — он не знал.</p>
<p><span class="vrez">Отдельная защита от протечки</span> Сам проект сравнения лежит в той же базе, и к моменту прогонов эталонный набор с ответами уже был проиндексирован. Поисковый сервер жёстко исключает каталог проекта из выдачи, иначе режим R получил бы шпаргалку.</p>
<p>Весь эксперимент — 72 агентских прогона и около 3 миллионов токенов.</p>
<h2 id="_4">Числа</h2>
<table>
<thead>
<tr>
<th>Метрика</th>
<th>Точечные (14): RAG</th>
<th>Точечные: карта+grep</th>
<th>Обзорные (10): RAG</th>
<th>Обзорные: карта+grep</th>
</tr>
</thead>
<tbody>
<tr>
<td>Победы по судье</td>
<td><strong>7</strong></td>
<td>1</td>
<td>2</td>
<td><strong>8</strong></td>
</tr>
<tr>
<td>Ключевой факт найден</td>
<td>1,00</td>
<td>1,00</td>
<td>0,50</td>
<td><strong>0,80</strong></td>
</tr>
<tr>
<td>Покрытие эталонных файлов</td>
<td><strong>0,93</strong></td>
<td>0,89</td>
<td>0,69</td>
<td><strong>0,77</strong></td>
</tr>
<tr>
<td>Вызовов инструментов (среднее)</td>
<td><strong>2,3</strong></td>
<td>4,1</td>
<td>5,6</td>
<td>5,2</td>
</tr>
<tr>
<td>Галлюцинации</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
</tbody>
</table>
<p>Ничьих по решению судьи — 6, все на точечных вопросах. Общий счёт по всем 24 вопросам: 9:9.</p>
<p>Про значимость сразу и честно. Ничья 9:9 сама по себе не говорит ничего. Каждая половина по отдельности тоже не дотягивает до значимости: двусторонний знаковый тест даёт p ≈ 0,07 на точечных и p ≈ 0,11 на обзорных. А вот <strong>разворот</strong> между типами вопросов держится: точный тест Фишера на таблице 2×2 (тип вопроса × победитель) даёт p ≈ 0,015. То есть выборка мала для утверждения «RAG лучше на точечных на столько-то», но достаточна для утверждения «тип вопроса меняет победителя».</p>
<h2 id="_5">Где семантический поиск выиграл</h2>
<p>Точечный факт достаётся с тем же качеством, что у grep, и почти вдвое дешевле по шагам. На четырёх вопросах хватило одного вызова: спросил человеческим языком — получил канонический файл с нужной строкой. Режим G на тех же вопросах шёл цепочкой: карта → раздел → файл → чтение, четыре-пять шагов.</p>
<p>Выигрыш накапливается там, где формулировка вопроса не совпадает с лексикой документа. Спрашиваешь «какое значение параметра принято в расчёте», а в файле он назван техническим именем переменной — вектор такой мост строит, grep требует угадать слово.</p>
<p><span class="vrez">В шагах</span> 2,3 против 4,1 на точечных вопросах. Для агента шаг — это чтение файла в контекст, то есть деньги и место в окне. На сотне точечных запросов в неделю разница заметна в счёте.</p>
<h2 id="_6">Где проиграл</h2>
<p>На обзорных вопросах RAG находил правильные файлы (0,69 против 0,77 — почти паритет), но ключевой факт передавал вдвое реже: 0,50 против 0,80. Два показательных случая.</p>
<p><span class="vrez">Потерянный статус</span> Вопрос: «где всё, что касается интеграции с внешним рекламным API, и в каком она состоянии». Режим R собрал механику целиком — порядок вызовов, авторизацию, ограничения. И не сказал главного: работа стоит на паузе. Строка про статус живёт во frontmatter памяти проекта, короткая, тематически не похожая на вопрос о содержании — в топ выдачи она не попала. Режим G прочитал README проекта и увидел статус в шапке файла.</p>
<p><span class="vrez">Полный промах</span> Вопрос: «какие материалы у нас есть по такой-то теме и в каком проекте они лежат». Режим R сжёг 12 вызовов из 15, не достал <strong>ни одного</strong> эталонного файла и собрал ответ по косвенным упоминаниям в соседних проектах — с ошибками в деталях (насчитал три материала вместо четырёх и потерял ещё один). Канонический README проекта утонул среди тематически похожих чанков. Режим G дошёл через карту за 4 вызова с полным попаданием.</p>
<p>Ноль галлюцинаций на 48 прогонов — единственная метрика, где системы одинаково хороши. Оба режима отвечали строго от источников, разница была в полноте.</p>
<h2 id="_7">Почему так вышло</h2>
<p>Гипотеза механизма, которую я вынес из разбора: <strong>вектор ищет похожее, карта хранит каноническое.</strong> На вопрос «где правда про X» похожесть — плохой заменитель авторитетности. Канонический документ и десять чанков, упоминающих X по касательной, для эмбеддера выглядят одинаково релевантными; карта же прямо указывает: вот источник правды.</p>
<p>Отсюда три следствия, которые видно в числах:</p>
<ol>
<li><strong>Мета-слой не попадает в чанки.</strong> Статус, владелец, дата, «что уже закрыто» лежат во frontmatter и README — короткими строками, не похожими на содержательный вопрос. Поиск по смыслу их системно недооценивает.</li>
<li><strong>Чанк теряет место в дереве.</strong> Принадлежность файла проекту записана структурой каталогов; в тексте самого чанка её нет. Grep со списком путей эту структуру видит бесплатно.</li>
<li><strong>Карта — уже посчитанный слой синтеза.</strong> Кто-то (я или агент по моим правилам) один раз проделал работу по агрегации и записал результат. RAG каждый раз выводит картину заново из фрагментов и на этом теряет.</li>
</ol>
<p>Отдельно отмечу: BM25 у режима R был внутри гибрида. Проигрыш на обзорных вопросах не объясняется тем, что «вектор не знает точных слов» — не хватало именно курирующего слоя.</p>
<h2 id="_8">Где мой тест врёт</h2>
<ul>
<li><strong>24 вопроса — мало.</strong> Разворот значим, абсолютные величины разрывов — нет. На другой базе цифры поедут.</li>
<li><strong>Судья — модель, и один на вопрос.</strong> Я перепроверил выборку оценок руками и согласился с ними, но полноценной второй разметки человеком не было.</li>
<li><strong>Число вызовов — самоотчёт агента.</strong> Телеметрию рантайма я не снимал: порядок величин верный, точность до десятых — нет.</li>
<li><strong>Время не сравнивал.</strong> У режима R оно искажено загрузкой модели и очередью к общему серверу; честный замер требовал бы отдельной обвязки.</li>
<li><strong>Соперник — не голый grep, а ухоженная карта.</strong> Это сознательный выбор: я сравнивал с реальной своей навигацией. На базе без карты и README расклад на обзорных вопросах почти наверняка сместился бы в пользу RAG. Если вы прикидываете RAG на свалку из тысячи заметок — мой результат к вам применим только наполовину.</li>
<li><strong>Вопросы придумывал я, зная базу.</strong> Я старался держаться человеческого языка и подальше от лексики документов, но полностью снять этот эффект нельзя.</li>
<li><strong>Прогоны шли в два захода</strong> (упёрся в лимит сессии), продолжение делалось с кэшем. На слепоту судейства это не влияло.</li>
</ul>
<h2 id="_9">Что с этим делать</h2>
<p>Если вы стоите перед тем же выбором для своей базы:</p>
<p><span class="vrez">Оставить карту руками</span> Слой синтеза окупается на обзорных вопросах и не воспроизводится поиском по смыслу автоматически. Двадцать минут в неделю на обновление статусов дают то, чего 18 часов индексации не дали.</p>
<p><strong>Подключить семантический поиск как инструмент точечных запросов.</strong> Он дешевле по шагам и не требует угадывать слово из документа. Как единственный интерфейс к базе — не годится, агент теряет рамку.</p>
<p><strong>Считать чанки заранее — токенизатором целевой модели.</strong> Оценка на глаз промахнётся: разница между «прикинул 15 тысяч» и «получил 29 тысяч» — это разница между вечером и двумя ночами.</p>
<p><span class="vrez">Проверить на своей базе</span> Методика переносится за вечер: 20–25 вопросов с эталонами (самая дорогая часть, часа полтора), два режима с одинаковым лимитом шагов, обезличенные пары, слепой судья. Заморозьте набор до первого прогона — иначе замер превратится в подгонку.</p>
<h2 id="_10">Краткие выводы</h2>
<ol>
<li>Семантический поиск по личной базе окупается на точечных фактах: то же качество за половину шагов. На вопросах «собери картину» он теряет статусы и рамку и проигрывает курируемой карте 8:2.</li>
<li>Тип вопроса определяет победителя сильнее, чем сам инструмент. Общий счёт 9:9 без разбивки по типам не значит ничего.</li>
<li>Локальный bge-m3 на процессоре — 0,45 чанка в секунду, и ускорители тут не помогают. Планируйте ночи, делайте индексацию инкрементальной.</li>
<li>Курируемая карта оказалась сильным соперником, которого в сравнениях RAG обычно не измеряют: меряются с поиском по ключевым словам, а живой человек, поддерживающий оглавление, в сравнение не попадает.</li>
</ol>
<p>Инструмент я оставил подключённым, карту продолжаю вести руками. Три дня на эксперимент вернулись знанием, какому вопросу какой инструмент отдавать, — это дешевле, чем год пользоваться поиском, который тихо теряет половину контекста на обзорных запросах.</p>
<p>Свою базу вы знаете лучше меня: посчитайте, каких вопросов вы задаёте агенту больше — «где точно записано вот это» или «собери всё, что мы знаем о теме»? От ответа зависит, стоит ли вам эти 18 часов вообще тратить.</p>
<p>Отдельно интересно: если у кого-то есть замер, где RAG выигрывает обзорные вопросы у живой карты, — покажите методику, я хочу понять, что у вас устроено иначе.</p>]]></content:encoded></item>
<item><title>«Цена по запросу» на сайте: за что вы платите</title><link>https://evstygney.ru/notes/cena-po-zaprosu/</link><guid isPermaLink="true">https://evstygney.ru/notes/cena-po-zaprosu/</guid><pubDate>Wed, 19 Aug 2026 09:00:00 +0300</pubDate><description>Скрытая цена перекладывает фильтр с сайта на рекламный бюджет и менеджеров. Расчёт потерь и что дать вместо «всё индивидуально»: вилка, пакеты, примеры.</description><content:encoded><![CDATA[<p>«Цена по запросу» на сайте выглядит способом дотянуть клиента до разговора. Чаще это способ оплатить лид, который никогда не купит.</p>
<p>Посмотрите на это глазами клиента. Ему нужен порядок цифр, чтобы понять, к вам ли вообще идти: у него бюджет 300 тысяч или 3 млн. Цифры нет — он либо оставляет заявку ради прайса (и вы платите за этот лид), либо уходит туда, где вилка написана. Платёжеспособные и занятые уходят первыми: у них нет получаса на созвон ради того, что конкурент написал строкой на сайте.</p>
<p><span class="vrez">В деньгах</span> Прикидка: лид стоит 5000 ₽, менеджер тратит на квалификацию полчаса. Если 40 лидов из 100 — люди, которым нужна была только цена и которым она не подошла, вы ежемесячно платите 200 тысяч плюс 20 часов отдела продаж за работу, которую мог сделать один абзац на сайте.</p>
<p><span class="vrez">Решение</span> Дать опору: вилка «от и до», три пакета с ценами, примеры проектов с бюджетами («проект такого объёма обошёлся в N»). Ответ «у нас всё индивидуально» этому не мешает — индивидуальный расчёт прекрасно живёт рядом с честным «от». Лидов станет меньше, сделок обычно столько же, стоимость сделки падает.</p>
<p><span class="vrez">Замечание</span> В энтерпрайзе с чеками от десятков миллионов скрытая цена — норма рынка, там её на сайте никто и не ищет. Речь про средний сегмент, где клиент сравнивает пятерых поставщиков за один вечер.</p>
<p>Скрытая цена перекладывает работу фильтра с сайта на рекламный бюджет и менеджеров — по цене лида за каждую проверку.</p>
<p>Сколько ваших лидов за прошлый месяц спросили цену и пропали — и что мешало им узнать её без звонка?</p>]]></content:encoded></item>
<item><title>Синтетические клиенты: проверяем оффер на LLM-персонажах — и разбираем, где метод врёт</title><link>https://evstygney.ru/articles/synthetic-customers/</link><guid isPermaLink="true">https://evstygney.ru/articles/synthetic-customers/</guid><pubDate>Tue, 18 Aug 2026 09:00:00 +0300</pubDate><description>Проверка оффера на LLM-персонажах до запуска рекламы: заземление в цитатах, контрольная группа, принудительные искажения, таблица доверия и пять типовых промахов.</description><content:encoded><![CDATA[<p><span class="vrez">TL;DR</span> LLM-персонажи с проработанными карточками находят в оффере непонятные формулировки, типовые возражения и слепые зоны до запуска трафика. Работает это только при трёх условиях: персонажи заземлены в живых цитатах реальных людей, в составе есть контрольная группа «не купит», ответы прогоняются через принудительные искажения — иначе получается генератор комплиментов. Мы один раз прогнали синтетическое исследование параллельно с живым на ту же тему: по большинству тематических блоков выводы сошлись, при этом ранжирование и доли синтетика предсказывает плохо. В статье — протокол целиком, таблица «чему верить / что перепроверять» и пять типовых промахов метода, собранных на практике. Протокол упакован в <a href="https://github.com/evstygney/synthetic-customers">скилл для Claude Code</a> (MIT), но воспроизводится руками в любом LLM-чате. Чтение — минут восемь.</p>
<p><span class="vrez">Простыми словами</span> Синтетический респондент — LLM-персонаж с фиксированной карточкой: биография, бюджет, страхи, лексика, типовые искажения ответов. Ему показывают оффер или задают вопросы, он отвечает в роли. Дальше считаю, что вы хоть раз проверяли продуктовую или маркетинговую гипотезу и понимаете, почему «мне нравится» от друзей — не проверка.</p>
<h2 id="_1">Почему «вставь оффер в чат и спроси» не работает</h2>
<p>Наивный способ пробовали все: показать модели оффер и спросить «как тебе?». Ассистент-режим обучен быть полезным и вежливым — он похвалит, предложит «добавить конкретики и социальных доказательств» и найдёт три мелочи. Просьба «притворись моим клиентом» меняет мало: без заданной биографии, бюджета и причин отказаться модель отыгрывает усреднённого доброжелательного покупателя, которого в природе не существует. Симметричный промпт «будь критичнее» даёт усреднённого злого критика — столь же бесполезного.</p>
<p>Это лечится не формулировкой промпта, а конструкцией. Опор три.</p>
<h2 id="1">Опора 1. Заземление: карта пути и чужие слова</h2>
<p>Карточка персонажа, выдуманная моделью из головы, — фантазия модели о вашем рынке. Проверка оффера на такой карточке проверяет оффер на фантазии. Заземляют персонажей два материала.</p>
<p><span class="vrez">Карта пути клиента</span> Интервью с носителем знания — владельцем, продажами, поддержкой: с чего человек понимает, что у него есть проблема, где ищет решение, как сравнивает, что происходит перед оплатой, что после. На каждом этапе — главный вопрос: кто и почему здесь отваливается. Причины отвала доводим до конкретики: не «дорого», а «уже платит конкуренту, и переход дороже выгоды»; не «боятся», а «обжёгся на такой услуге и не верит категории». Эти причины потом становятся карточками контрольной группы.</p>
<p><span class="vrez">Живой язык</span> 15–25 дословных цитат реальных людей о категории продукта: отзывы (свои и конкурентов), форумы, переписки с продажами, вопросы из заявок. Цитаты дают лексику, страхи и возражения, которых носитель знания о своих клиентах либо не знает, либо стесняется. Персонаж, говорящий языком реальных отзывов, реагирует на оффер заметно ближе к рынку, чем персонаж на литературном русском.</p>
<p>Обратная сторона заземления — запрет: чего нет в собранных материалах, того персонаж не знает. На вопрос за пределами карточки он отвечает «не знаю» или уклончиво, как живой человек, — вместо того чтобы галлюцинировать факты о вашем рынке. Это правило приходится прописывать явно: у модели всегда найдётся правдоподобный ответ, и он-то и опасен.</p>
<h2 id="2">Опора 2. Состав: в группе должно быть кому не купить</h2>
<p>Десять «средних довольных клиентов» дадут десять оттенков вежливого «да». Ценность прогона — в разбросе, поэтому персонажи разводятся по осям: сегмент × этап пути × отношение к категории (минимум два скептика) × осведомлённость о проблеме × платёжеспособность относительно чека.</p>
<p>Отдельно — <strong>контрольная группа</strong>: 2–3 персонажа, которые не купят, каждый со своей конкретной причиной отвала с карты пути. Без них у прогона нет границы: все реакции сводятся к «в целом интересно», и главный вопрос — кому оффер попадает, а кому нет и по какой линии проходит раздел — остаётся без ответа. Контрольный персонаж при этом не карикатура: его альтернатива для него честно работает, и переубеждаться от красивого текста он не обязан.</p>
<p>И обязательный шлюз — <strong>калибровка человеком</strong>. Перед прогоном состав показывается заказчику списком, по строке на персонажа: «Марина, 34, владелица кофейни, скептик — уже пробовала таргет и слила 40 тысяч». Вопрос один: узнаёте своих клиентов? Это самый дешёвый фильтр галлюцинаций из всех возможных: человек, который каждый день разговаривает с клиентами, за минуту снимает персонажей «из другого кино». Пропустить этот шаг — значит проверять оффер на выборке, которую никто не видел.</p>
<h2 id="3">Опора 3. Протокол прогона и принудительный реализм</h2>
<p>Каждый персонаж проходит пять шагов независимо от остальных:</p>
<ol>
<li><strong>Первая реакция</strong> — пять секунд на артефакт, одна фраза.</li>
<li><strong>Тест пересказа</strong> — «перескажи своими словами: что тебе предлагают и за сколько».</li>
<li><strong>Возражения</strong> — что смущает, чему не веришь, что спросил бы у продавца.</li>
<li><strong>Сравнение со своей альтернативой</strong> — лучше или хуже того, чем персонаж решает задачу сейчас.</li>
<li><strong>Порог покупки</strong> — что должно случиться, чтобы купил; для контрольных — почему не купит.</li>
</ol>
<p>Самый информативный шаг — второй. Расхождение пересказа с замыслом автора — это и есть слепая зона формулировки, найденная механически, без экспертных оценок. Модельный пример (прикидка, не из реального проекта): оффер «ведение соцсетей под ключ для малого бизнеса за 30 000 ₽/мес» персонажи пересказывают как «будут постить за меня картинки» и «30 тысяч за посты?!» — обещание «клиенты из соцсетей» не пересказал никто, потому что в оффере его нет, оно есть только в голове автора.</p>
<p>Второй ингредиент — <strong>принудительные искажения</strong>. Живые респонденты дают социально приличные ответы, путают детали, рационализируют прошлые решения задним числом, уходят от неудобных тем, заполняют пробелы памяти выдумкой и ленятся. Всё это прописывается в карточку и протокол явно: искажения — в 25–40% ответов, треть ответов — односложные («ну да», «долго, не дочитал, что по цене?»). Зазор между «что говорит про бюджет» и «что реально готов потратить» — обязательное поле карточки.</p>
<p>Диагностика провала реализма простая: если у всех персонажей идеальный пересказ и вежливый интерес — прогон не удался, перед вами снова ассистент в десяти масках.</p>
<h2 id="_2">Одна сверка с реальностью</h2>
<p>Методу легко верить на слово, поэтому при первой возможности мы сверили его с живым исследованием: по одной теме параллельно прошли синтетическое исследование и обычное, с настоящими респондентами, а потом сделали дифф отчётов слайд-в-слайд. По большинству тематических блоков выводы сошлись: определения и язык, широта картины, психология доверия, страхи, ожидания к интерфейсу. Разошлись там, где и ожидалось: точное ранжирование фич и доли сегментов синтетика воспроизвела плохо.</p>
<p><span class="vrez">Замечание</span> Одна параллельная сверка — единичный кейс, валидацией метода её считать нельзя. Мы взяли из неё калибровку: каким типам выводов доверять, какие обязательно перепроверять живыми разговорами.</p>
<table>
<thead>
<tr>
<th>Чему верить</th>
<th>Что перепроверять живыми</th>
</tr>
</thead>
<tbody>
<tr>
<td>Какие формулировки непонятны и как именно их понимают не так</td>
<td>Ранжирование: что «важнее» из работающего</td>
</tr>
<tr>
<td>Типовые возражения и их формулировки</td>
<td>Доли: сколько таких клиентов в базе</td>
</tr>
<tr>
<td>Гипотезы страхов и барьеров</td>
<td>Готовность платить, реакция на цену в деньгах</td>
</tr>
<tr>
<td>Язык аудитории: как называют проблему и продукт</td>
<td>Всё, что пойдёт в обоснование бюджета</td>
</tr>
</tbody>
</table>
<h2 id="_3">Пять типовых промахов синтетики</h2>
<p>Накопились за несколько исследований; предупреждают большинство ошибок интерпретации.</p>
<ol>
<li><strong>Путает «единичного фаворита» и «универсальность».</strong> Фичу, полезную во всех сценариях понемногу, синтетика недооценивает — драматургия персонажа требует одного яркого фаворита. Спрашивайте отдельно «что главное» и «что полезно везде».</li>
<li><strong>Тянет выводы в яркие личные драмы.</strong> История про страх весит в синтетическом отчёте больше, чем скучное «непонятно, что входит в цену» от шести персонажей из десяти. Взвешивайте по частоте: реальный агрегат ответов суше и логистичнее синтетического.</li>
<li><strong>Пропускает скучные факторы.</strong> Погода, доставка в регион, ассортимент, состояние дорог — то, что не делает персонажа интересным, выпадает из ответов. Добавляйте такие факторы в протокол явно.</li>
<li><strong>Сглаживает нюансы до полюсов.</strong> «Иногда, если недалеко» превращается в «да» или «нет». Сохраняйте оговорки и условия — в них половина пользы.</li>
<li><strong>Склеивает look-alike сегменты с противоположными рецептами.</strong> «Мне надо пощупать руками» и «хотел купить онлайн, но в мой город не везут» внешне дают одинаковое «не купил онлайн» — а лечатся противоположными действиями. Разводите такие пары руками при синтезе.</li>
</ol>
<h2 id="_4">Протокол целиком</h2>
<p>Для повторения руками в любом LLM-чате с доступом к файлам — или без автоматизации вовсе:</p>
<ol>
<li>Интервью о бизнесе: продукт и чек → группы покупателей → чем решают сейчас и почему не покупают → карта пути с причинами отвала → 5–10 живых фраз клиентов → артефакт проверки (оффер, текст лендинга, тарифы, сообщение).</li>
<li>Грунд-сбор: 15–25 цитат о категории из открытых отзывов и форумов, с пометкой «дословно / близко к тексту». Цитаты не выдумываются — либо нашлись, либо их нет, и это честно понижает доверие к прогону.</li>
<li>Десять персонажей по осям, из них 2–3 контрольных с конкретными причинами отвала. В каждой карточке — зазор «говорит/реально» по деньгам и 1–2 адаптированные живые цитаты.</li>
<li>Калибровка состава заказчиком. Без подтверждения прогон не запускается.</li>
<li>Прогон: пять шагов на персонажа, независимо, с принудительными искажениями.</li>
<li>Отчёт: пересказы против замысла → возражения, отсортированные по частоте → слепые зоны → водораздел «кому попадает / кому нет» → причины отказа контрольной группы → список «что проверить на живых» → 3–5 правок формулировок «было → стало».</li>
</ol>
<p><span class="vrez">Чем хорош метод</span> Цена и скорость: полчаса на первый прогон против недель и бюджета на живое исследование. Для задачи «найти кривые формулировки до запуска трафика» этого достаточно, а исправленный по итогам оффер делает последующие живые разговоры содержательнее.</p>
<p><span class="vrez">Чем плох</span> Он охотно показывает то, что хочется видеть. Уберите контрольную группу, калибровку или искажения — прогон превратится в дорогой способ получить комплимент. И он принципиально не отвечает на количественные вопросы: любое «сколько» из синтетического отчёта — не данные.</p>
<h2 id="_5">Где метод не работает</h2>
<ul>
<li><strong>Количественные решения.</strong> Ранжирование фич, доли сегментов, ценовая чувствительность, прогноз конверсии — за пределами метода, см. таблицу выше.</li>
<li><strong>Категории без открытого следа.</strong> Узкий B2B, энтерпрайз под NDA: живых цитат не собрать, заземление держится на одном интервью — доверие к прогону ниже, и это стоит честно указывать в отчёте.</li>
<li><strong>Замена исследований.</strong> Это нулевая итерация: репетиция перед живой аудиторией, генератор гипотез и фильтр очевидных ошибок. Отчёт без блока «что проверить на живых» — признак, что инструментом пользуются для самоуспокоения.</li>
</ul>
<h2 id="_6">Краткие выводы</h2>
<ol>
<li>Синтетические персонажи надёжно находят проблемы формулировок и типовые возражения; количественные ответы остаются за живыми исследованиями.</li>
<li>Метод держится на трёх опорах: заземление в живых цитатах, контрольная группа «не купит», принудительный реализм ответов. Любая из трёх опущена — получаете генератор комплиментов с уверенным тоном.</li>
<li>Сверяйте с реальностью при первой возможности: одна параллельная сверка синтетического и живого исследования калибрует доверие к методу лучше любых рассуждений о нём.</li>
<li>Протокол воспроизводим руками; упакованная версия — интервью, генерация карточек, прогон и отчёт по шаблонам — в репозитории <a href="https://github.com/evstygney/synthetic-customers">synthetic-customers</a> (MIT, скилл для Claude Code, работает и как простая текстовая инструкция для других агентов).</li>
</ol>
<p>Пробовали синтетических респондентов в работе? Интереснее всего, на чём они врали у вас — копилка промахов выше пополняется именно так.</p>]]></content:encoded></item>
<item><title>Красивый отчёт по рекламе прячет деньги: три признака</title><link>https://evstygney.ru/notes/krasivyy-otchet-pryachet-dengi/</link><guid isPermaLink="true">https://evstygney.ru/notes/krasivyy-otchet-pryachet-dengi/</guid><pubDate>Mon, 17 Aug 2026 09:00:00 +0300</pubDate><description>Растут охваты без строки выручки, метрики без базы сравнения, нет блока «что не сработало». Что просить в каждом отчёте подрядчика.</description><content:encoded><![CDATA[<p>Отчёт, который приятно читать, и отчёт, по которому можно управлять, — часто два разных документа.</p>
<p>Три признака, что вам показывают витрину. Первый: растут охваты, показы и CTR, а строчки с выручкой нет вовсе. Второй: метрики без базы для сравнения — «CTR 2,4%» звучит солидно, но хорош он или ужасен, без плана, прошлого месяца или бенчмарка ниши понять нельзя. Третий, самый надёжный: нет блока «что не сработало». За 10 лет я не видел ни одного месяца, в котором не сработало бы вообще ничего. Если такого блока нет — его вырезали.</p>
<p><span class="vrez">В деньгах</span> Витринный отчёт означает, что вы платите за работу, качество которой не можете проверить. Дырка в кампаниях при таком отчёте живёт месяцами: она просто не попадает на слайды, а снаружи её видно только по кассе.</p>
<p><span class="vrez">Решение</span> Попросите три вещи в каждом отчёте: план/факт по деньгам (заявки, сделки, выручка — что доступно), динамику к прошлому периоду по тем же метрикам и честный раздел «что не получилось и что меняем». Добросовестный подрядчик от такой просьбы выдыхает с облегчением — прятать провалы утомительно.</p>
<p><span class="vrez">Замечание</span> Красивый отчёт сам по себе не приговор. Приговор — когда на вопрос «а где выручка?» отвечают «это сложно атрибутировать» и быстро листают на следующий слайд.</p>
<p>Подведём итог: отчёт — инструмент управления, и проверяется он одним вопросом: «какое решение я могу по нему принять?»</p>
<p>Какое решение вы приняли по последнему отчёту своего маркетинга?</p>]]></content:encoded></item>
<item><title>Средний чек скрывает убыточные заказы</title><link>https://evstygney.ru/notes/sredniy-chek-skryvaet-ubytok/</link><guid isPermaLink="true">https://evstygney.ru/notes/sredniy-chek-skryvaet-ubytok/</guid><pubDate>Fri, 14 Aug 2026 09:00:00 +0300</pubDate><description>Средний чек 3000 ₽ и маржа 35%, а треть заказов до 1500 ₽ в нуле или минусе после доставки. Как посчитать прибыль по диапазонам чека и что передать в оптимизацию.</description><content:encoded><![CDATA[<p>Средний чек — удобная цифра, за которой прячутся убыточные заказы. Иногда их треть.</p>
<p>Модельный пример. Интернет-магазин: средний чек 3000 ₽, маржа 35%, доставка обходится в 350 ₽. В среднем всё прекрасно. Теперь разрез по корзинам: 35% заказов — до 1500 ₽. Считаем такой заказ отдельно: маржа 525 ₽, минус доставка 350, минус эквайринг, упаковка и обработка — заказ в нуле или в минусе. Его дотируют крупные корзины, а «в среднем» всё по-прежнему прекрасно.</p>
<p>Дальше хуже: рекламные алгоритмы оптимизируются на конверсию, а дешёвое конвертится лучше. Кампании старательно приводят вам всё больше именно убыточных заказов — и хвалятся в отчётах ростом конверсии.</p>
<p><span class="vrez">В деньгах</span> При 1000 заказов в месяц около 350 из них с нулевой маржой: вы бесплатно обслуживаете треть операционки и ещё платите за её привлечение.</p>
<p><span class="vrez">Решение</span> Один раз посчитать прибыль по диапазонам чека — таблица на вечер работы аналитика. Дальше стандартные ходы: порог бесплатной доставки, минимальная сумма заказа, допродажи в корзине. И главное для рекламы: передавать в оптимизацию маржу или ценность заказа, чтобы алгоритм искал прибыльных покупателей, а не просто покупателей.</p>
<p><span class="vrez">Замечание</span> Иногда мелкий заказ — осознанная механика знакомства с продуктом. Тогда это расход на привлечение, и в отчёте он должен называться именно так, со своей окупаемостью через повторные покупки.</p>
<p>Одной строкой: средние показатели скрывают структуру, а прибыль живёт в структуре.</p>
<p>Вы знаете, с какой суммы заказ становится для вас прибыльным, — и какая доля заказов сейчас ниже этой планки?</p>]]></content:encoded></item>
<item><title>Файловая память для ИИ-агента: воркспейс из markdown, который переживает сессию</title><link>https://evstygney.ru/articles/ai-agent-file-memory/</link><guid isPermaLink="true">https://evstygney.ru/articles/ai-agent-file-memory/</guid><pubDate>Thu, 13 Aug 2026 09:00:00 +0300</pubDate><description>Как устроить память ИИ-агента на файлах: три контракта воркспейса, паттерн «шим», тест инструкции свежим агентом и грабли дистрибуции.</description><content:encoded><![CDATA[<p><span class="vrez">TL;DR</span> Контекст ИИ-агента умирает вместе с сессией: завтра он снова не знает ни ваших проектов, ни принятых решений, ни того, что вы уже пробовали. Четыре месяца я живу с файловым решением: память проектов, карта, правила и база знаний лежат в markdown на диске, агент читает их на входе в работу и обновляет на выходе. В статье — архитектура из трёх контрактов, разбор допущений, паттерн «шим» для навыков и тест инструкции свежим агентом в режиме «трудный пользователь»: 16 находок, 7 правок. Каркас — в <a href="https://github.com/evstygney/ai-workspace-starter">репозитории под MIT</a>. Чтение займёт минут десять.</p>
<p><span class="vrez">Простыми словами</span> ИИ-агент — это LLM с доступом к файлам и терминалу (Claude Code, Cursor, Codex CLI). Он читает и пишет файлы на вашем диске по инструкциям на естественном языке. Дальше считаю, что вы таким пользовались.</p>
<h2 id="_1">Почему не хватает того, что есть из коробки</h2>
<p>Задача: в понедельник агент помог с проектом, в четверг открываю новую сессию — и хочу продолжить с места, где остановились, а не пересказывать проект заново. Штатные способы упираются каждый в свой предел.</p>
<p><span class="vrez">Длинная сессия</span> Контекстное окно конечно, при переполнении история сжимается автосаммари. Что именно выживет при сжатии — вы не контролируете: первыми обычно теряются мотивировки решений («почему выбрали B, а не A»), сами решения остаются. И сессия всё равно когда-нибудь закрывается.</p>
<p><span class="vrez">Один большой CLAUDE.md</span> Рабочий приём до определённого размера. Дальше файл превращается в свалку: контексты десяти проектов вперемешку, агент тащит в каждую задачу всё подряд, стоимость и шум растут.</p>
<p><span class="vrez">Встроенная память агента</span> У Claude Code есть автоматическая память. Она полезна, но непрозрачна ровно настолько, насколько автоматична: вы не выбираете, что в неё попадёт, она не переносится между инструментами и не читается глазами как единый документ.</p>
<p><span class="vrez">RAG поверх заметок</span> Векторная база, пайплайн индексации, обновление эмбеддингов — инфраструктура ради задачи «не пересказывать проект». Для личной работы одного человека это пушка по воробьям; к тому же результат поиска по эмбеддингам не отревьюишь так же просто, как файл.</p>
<p>Файловый воркспейс закрывает ту же задачу дешевле: обычные папки и markdown, полная прозрачность (всё читается глазами и лежит в git), переносимость между агентами. Плата — дисциплина структуры. Её и разбираем.</p>
<h2 id="_2">Архитектура: три контракта</h2>
<p>За четыре месяца структура устоялась такой (35 проектов, база знаний на 15 тем):</p>
<pre><code>workspace/
├── main.md                  ← карта: все проекты и разделы, по строке на каждый
├── CLAUDE.md                ← контракт поведения: агент читает сам при старте
├── AGENTS.md                ← однострочник «читай CLAUDE.md» для других агентов
├── .claude/skills/          ← автозапуск навыка-хранителя (шим, о нём ниже)
├── _inbox/                  ← приёмник непонятного; разбирается раз в неделю
├── _meta/templates/         ← шаблоны: README проекта, память, wiki-заметка
├── rules/global/            ← правила устройства воркспейса
├── skills/                  ← навыки агента (источники)
├── knowledge-base/
│   ├── AGENTS.md            ← контракт ведения базы знаний
│   └── &lt;домен&gt;/main.md      ← карта домена + страницы
└── projects/&lt;имя&gt;/
    ├── README.md            ← что это и зачем
    ├── memory.md            ← память проекта: агент читает первым
    ├── docs/ prompts/ assets/
    └── app/                 ← код, отдельный git-репозиторий
</code></pre>
<p>Несущих элемента три, остальное — обвязка.</p>
<p><span class="vrez">Контракт №1: memory.md на проект</span> Файл с фиксированными секциями: что это за проект, ключевые решения с мотивировками, текущий статус, следующий шаг, договорённости с агентом. Правило в CLAUDE.md: при входе в проект читать память первой, после значимого шага — обновлять. Новая сессия стартует не с нуля, а с последнего чекпоинта. По сути это ручной, человекочитаемый снапшот контекста — и в отличие от автосаммари, что в него попадает, решаете вы (точнее, агент по вашим правилам, а вы ревьюите глазами).</p>
<p><span class="vrez">Контракт №2: main.md как карта</span> По строке на проект и домен знаний. Агенту не нужно сканировать дерево, чтобы понять, что где лежит: одна загрузка карты — и он знает, куда идти. Это же спасает от дублей: прежде чем создать проект, агент сверяется с картой.</p>
<p><strong>Контракт №3: правила поведения, записанные файлами.</strong> Договорённость «клади файлы аккуратно» агент забудет со сменой сессии — контракт должен лежать там, откуда он читается автоматически. У меня это три уровня: CLAUDE.md в корне (краткий контракт, подхватывается при старте), правило в <code>rules/</code> (полная версия с обоснованиями) и навык-хранитель в <code>skills/</code> (операционные рецепты: куда положить, как назвать, какой frontmatter). Тройное дублирование намеренное: инструкции для LLM исполняются вероятностно, и вероятность соблюдения растёт с числом мест, откуда правило может попасть в контекст.</p>
<p><span class="vrez">Замечание</span> База знаний устроена отдельным паттерном — три слоя с разными правами записи: <code>raw/</code> (первоисточники, агент только читает), wiki-страницы (агент пишет и перезаписывает), схема-контракт (меняется редко, руками). Плюс правило противоречий: новый факт, конфликтующий со старым, не затирает его молча, а помечается блоком с указанием источников. Это тема отдельной статьи; схема лежит в <a href="https://github.com/evstygney/ai-workspace-starter/blob/main/references/knowledge-base.md">references репозитория</a>.</p>
<h2 id="_3">Допущения, которые пришлось принять</h2>
<p>Каждое решение в структуре — ответ на конкретный отказ. Три показательных.</p>
<p><span class="vrez">Архив вместо удаления</span> Агент (и человек) плохо предсказывает, что «точно больше не понадобится». Правило: ничего не удаляется, устаревшее переезжает в <code>archive/</code> рядом с оригиналом. Перемещение обратимо, удаление — нет, а диск дешевле восстановления удалённого.</p>
<p><span class="vrez">Латиница и kebab-case в путях</span> Кириллица и пробелы в путях ломаются на стыках: git на разных ОС, shell-скрипты, часть инструментов. Контент заметок — на любом языке, пути — только <code>latin-kebab-case</code>. Скучное правило, которое экономит часы отладки.</p>
<p><span class="vrez">Код отдельно от заметок</span> Код проекта живёт в <code>app/</code> со своим git-репозиторием; workspace-репозиторий его игнорирует (<code>projects/*/app/</code> в .gitignore). У кода и заметок разные жизненные циклы: заметки хочется коммитить пачкой раз в день, код — атомарно и с CI.</p>
<h2 id="_4">Паттерн «шим»: один источник для навыка</h2>
<p>Инженерная деталь, на которой я застрял. Claude Code автоматически подхватывает навыки из скрытой <code>.claude/skills/</code>, а «витринная» <code>skills/</code> воркспейса для него — просто папка с файлами. Хочется и автозапуск, и видимый пользователю источник. Держать две копии — гарантированный рассинхрон: правишь одну, вторая молча устаревает.</p>
<p><span class="vrez">Решение</span> В <code>.claude/skills/workspace-organizer/SKILL.md</code> кладётся файл-переадресация: тот же YAML-frontmatter с description (по нему движок решает, когда навык триггерить), а вместо тела — три строки: «прочитай и выполни <code>../../../skills/workspace-organizer/SKILL.md</code>; здесь ничего не редактировать». Автотриггер работает, источник один, дублируется только description. Если источник переименуют или удалят — шим прямым текстом скажет об этом пользователю и предложит восстановить навык повторным запуском мастера.</p>
<h2 id="llm">Инструкция для LLM — это код. Тестируйте соответственно</h2>
<p>Каркас воркспейса я упаковал в скилл-мастер: интервью из пяти блоков (путь, кто вы, проекты, темы, настройки) → план → постройка → заполнение памяти ответами. Написал, трижды перечитал, всё выглядело однозначным.</p>
<p>Потом я запустил тест: <strong>отдельный экземпляр агента, который скилл никогда не видел</strong>, получил инструкцию «выполни этот SKILL.md буквально, не привнося своих представлений о замысле» и сценарий пользователя, который на каждый вопрос отвечает «не знаю». Плюс обязанность: журналировать каждое место, где инструкция неоднозначна, невыполнима или потребовала догадки.</p>
<p>Свежий агент дошёл до конца — воркспейс собрался, все 16 файлов каркаса на месте. И принёс <strong>16 задокументированных неоднозначностей</strong>. Примеры, за которые мне до сих пор слегка стыдно:</p>
<ul>
<li><strong>План не совпадал с постройкой.</strong> Дерево, которое мастер показывает пользователю для подтверждения («строим вот это, ок?»), было короче того, что реально создаётся на следующем этапе. Пользователь подтверждал один набор, получал другой.</li>
<li><strong>Невыполнимая ветка.</strong> «Если тем для базы знаний нет — создай домен по профессии из блока 2». А в блоке 2 пользователь сказал «работаю и всё». Профессии нет, ветка виснет. Агент выкрутился сам (создал нейтральный домен <code>work</code>), но это была его догадка, не моя инструкция.</li>
<li><strong>Самопротиворечие.</strong> «Создай пустую папку <code>_inbox/</code> (и положи в неё README)». Папка с файлом — не пустая. Мелочь, но свежий исполнитель споткнулся и записал в журнал.</li>
<li><strong>Молчание про плейсхолдеры.</strong> Шаблоны копируются в воркспейс «как есть», с <code>{{PROJECT_NAME}}</code> внутри — а конвенция «подставляй значения вместо <code>{{...}}</code>» нигде не была записана для будущих сессий.</li>
<li><strong>Пустые папки и git.</strong> Каркас создаёт пустые <code>docs/</code>, <code>prompts/</code>, <code>assets/</code> — а git пустых папок не хранит. Первый же клон воркспейса потерял бы половину структуры. В инструкции не было ни слова.</li>
</ul>
<p>Семь находок стали правками скилла, остальные оказались штатным поведением или осознанным дизайном. Отдельно отмечу: на пункте «заполни память проекта содержательно», не имея ни одного содержательного ответа, тестовый агент не стал выдумывать легенду — записал факт настройки, принятые дефолты и следующий шаг. Повёл себя правильно без инструкции. Полагаться на это нельзя: следующий экземпляр может решить иначе, поэтому поведение закрепили явным правилом.</p>
<p><span class="vrez">Чем хорош метод</span> Он дешёвый: один запуск свежего агента с журналом неоднозначностей находит то, чего автор сам не видит, — автор знает замысел и достраивает его поверх текста. Это ровно code review, только ревьюер — та же система, что будет исполнять.</p>
<p><span class="vrez">Чем плох</span> Недетерминизм: один прогон — одна траектория. Тот факт, что агент сегодня выкрутился из невыполнимой ветки, не значит, что выкрутится завтра. Тест снижает вероятность отказа, но не даёт гарантий — как и любой тест, впрочем.</p>
<h2 id="_5">Грабли дистрибуции, собранные лбом</h2>
<p>Скилл — это текст, но распространяется он как софт, и ломается тоже как софт. Что нашлось на пути от «работает у меня» до «работает у человека, который видит агента впервые»:</p>
<table>
<thead>
<tr>
<th>Грабля</th>
<th>Что происходит</th>
<th>Фикс</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>:</code> (двоеточие с пробелом) внутри YAML-description</td>
<td>frontmatter не парсится, скилл не подхватывается</td>
<td>переформулировать без двоеточий или закавычить значение</td>
</tr>
<tr>
<td>GitHub ZIP распаковывается в <code>&lt;repo&gt;-main</code></td>
<td>скилл лежит не по ожидаемому пути, «не работает»</td>
<td>явная инструкция переименования в README</td>
</tr>
<tr>
<td><code>%USERPROFILE%</code> в команде установки</td>
<td>в PowerShell не раскрывается — создаётся папка с буквальным именем</td>
<td><code>$env:USERPROFILE</code></td>
</tr>
<tr>
<td><code>~/.claude</code> скрыта в Finder</td>
<td>пользователь без терминала не может найти папку скиллов</td>
<td><code>⇧⌘G</code> → «Переход к папке» в инструкции</td>
</tr>
<tr>
<td>Свежеустановленный скилл не виден в текущей сессии</td>
<td>«сказал волшебную фразу — ничего не произошло»</td>
<td>установочная фраза велит агенту выполнить SKILL.md сразу, не дожидаясь перезапуска</td>
</tr>
<tr>
<td>Агент по голой ссылке строит «по мотивам»</td>
<td>вместо эталонного каркаса — импровизация по README</td>
<td>требование в тексте скилла: шаблоны брать из файлов, по памяти не восстанавливать</td>
</tr>
</tbody>
</table>
<p>Последняя строка — любимая. Дай агенту ссылку на репозиторий без инструкций — он прочитает README, поймёт идею и уверенно построит нечто похожее, но своё. Для тысячи пользователей это тысяча разных воркспейсов. Лечится одной строкой в скилле, но додуматься до неё надо.</p>
<h2 id="_6">Где подход не работает</h2>
<ul>
<li><strong>Команда.</strong> Всё выше — про одного человека. Совместная память на файлах упирается в merge-конфликты человеческих решений; для команды нужен другой контур согласования, у меня его нет.</li>
<li><strong>Поиск по смыслу.</strong> Здесь нет эмбеддингов: агент ходит по картам (main.md) и grep'у. На моих объёмах хватает; если у вас тысячи заметок с перекрёстными смысловыми запросами — RAG вернётся в разговор.</li>
<li><strong>Протухание памяти.</strong> memory.md обновляет агент, агент подчиняется правилу вероятностно. Без еженедельной ревизии («разбери inbox, обнови статусы») память дрейфует от реальности. Ритуал занимает минут двадцать, но он обязателен — это цена подхода.</li>
<li><strong>Другие агенты.</strong> Структура переносима (markdown есть markdown), но автозапуск навыков — механика Claude Code. В Cursor тот же контракт приходится скармливать через AGENTS.md, триггер слабее.</li>
</ul>
<h2 id="_7">Краткие выводы</h2>
<ol>
<li>Память агента между сессиями решается файлами: memory.md на проект + карта + правила, записанные там, откуда агент читает их автоматически. Дорогая инфраструктура для этой задачи не нужна.</li>
<li>Инструкции для LLM исполняются вероятностно. Контракт стоит дублировать по уровням (CLAUDE.md → правило → навык), а критичные конвенции записывать явно, даже если агент «и так догадался».</li>
<li>Инструкция для LLM — это код. Тестируйте её как код: свежий исполнитель без знания замысла + сценарий худшего пользователя + журнал неоднозначностей. 16 находок на «трижды перечитанном» тексте — моя цена этого урока.</li>
<li>Дистрибуция текста ломается как софт: YAML, пути, скрытые папки, порядок активации. Таблица граблей выше сэкономит вам вечер.</li>
</ol>
<p>Каркас воркспейса, скилл-мастер с интервью, шаблоны и обе справки — в репозитории <a href="https://github.com/evstygney/ai-workspace-starter">ai-workspace-starter</a> (MIT). Ставится за 15 минут, работает без программирования.</p>
<p>А ваш агент завтра утром помнит, почему вы вчера выбрали вариант B, а не A? Если нет — посчитайте, сколько минут в день вы тратите на пересказ контекста, и умножьте на цену своего часа.</p>
<p>Интересно, как эту задачу решаете вы: файлы, встроенная память, RAG, что-то своё? И переживает ли ваш вариант смену сессии без пересказа проекта с нуля?</p>]]></content:encoded></item>
<item><title>Смена рекламного подрядчика стоит три месяца</title><link>https://evstygney.ru/notes/smena-podryadchika-tri-mesyaca/</link><guid isPermaLink="true">https://evstygney.ru/notes/smena-podryadchika-tri-mesyaca/</guid><pubDate>Wed, 12 Aug 2026 09:00:00 +0300</pubDate><description>Онбординг, переобучение автостратегий, потеря контекста: при бюджете 1 млн смена агентства обходится в ~750 тысяч. По каким симптомам менять на самом деле.</description><content:encoded><![CDATA[<p>Каждая смена рекламного подрядчика стоит вам около трёх месяцев эффективности. Даже когда новый объективно лучше старого.</p>
<p>Разложим, куда уходит время. Месяц — онбординг: доступы, погружение в бизнес, «а почему у вас так настроено». Ещё месяц-полтора — перезапуск кампаний: автостратегии Яндекса обучаются заново, и пока учатся, CPA гуляет на 20–40% выше нормы (прикидка из практики, зависит от объёма данных). Параллельно теряется контекст: какие гипотезы уже проверяли, какие креативы выгорели, почему отключили те ключи. Новый подрядчик честно проверит всё это ещё раз — за ваши деньги.</p>
<p><span class="vrez">В деньгах</span> При бюджете 1 млн в месяц три месяца просадки на 25% — порядка 750 тысяч переплаты за тот же результат. Плюс часы вашей команды на пересказ всего с нуля.</p>
<p><span class="vrez">Решение</span> Менять по симптомам, которые реально требуют замены: нет прозрачности, нет доступов к вашим же кабинетам, цифры отчётов не бьются с CRM. Обещание «минус 30% CPA» от нового агентства симптомом не считается — это цена входа в переговоры, а не расчёт. И главное: кабинеты и счётчики изначально оформляйте на себя — тогда накопленное обучение кампаний переезжает вместе с вами, и три месяца сжимаются до одного.</p>
<p><span class="vrez">Замечание</span> Знакомый подрядчик со средним результатом и полной прозрачностью часто выгоднее нового «лучшего» — ровно на цену этих трёх месяцев.</p>
<p>Подведём итог: смена подрядчика — инвестиция с трёхмесячным сроком окупаемости, и принимать её стоит расчётом, а не эмоцией после плохого отчёта.</p>
<p>Ваши рекламные кабинеты оформлены на вас — или при разводе с агентством вы начнёте с нуля?</p>]]></content:encoded></item>
<item><title>Выключили рекламу, продажи не упали. Это не доказательство</title><link>https://evstygney.ru/notes/otklyuchili-reklamu-prodazhi-ne-upali/</link><guid isPermaLink="true">https://evstygney.ru/notes/otklyuchili-reklamu-prodazhi-ne-upali/</guid><pubDate>Mon, 10 Aug 2026 09:00:00 +0300</pubDate><description>Продажи недели — урожай прошлых касаний. Почему просадка приходит через 4–8 недель и как делать честный тест отключения с контрольной группой регионов.</description><content:encoded><![CDATA[<p>«Выключили Директ на неделю — продажи не упали. Значит, реклама не работала». Одно из самых дорогих умозаключений, которые я видел за 10 лет в перформансе.</p>
<p>Почему неделя молчит. Продажи этой недели — урожай прошлых касаний: отложенный спрос, добитые ретаргетингом корзины, люди, которые запомнили вас месяц назад. Выключив закупку, вы перестали сеять — а жать продолжаете. Просадка приходит через 4–8 недель, когда запас выгорает. К тому моменту её связывают с сезоном, курсом, конкурентами — с чем угодно, кроме того самого «эксперимента».</p>
<p><span class="vrez">Замечание</span> Обратная ловушка тоже работает: «включили рекламу — продажи выросли» на старте сезона доказывает силу сезона, а вклад рекламы — ещё нет.</p>
<p><span class="vrez">В деньгах</span> Цена вывода «реклама не работала» — вся выручка канала. Если канал приносил 30% заявок, вы узнаете об этом через два месяца, а потом ещё столько же будете восстанавливать обученные кампании и выгоревший спрос.</p>
<p><span class="vrez">Решение</span> Честный тест отключения делается с контрольной группой: выключаем в части регионов, оставляем в остальных, сравниваем динамику между группами. Окно наблюдения — минимум два цикла покупки, для большинства ниш это 6–10 недель. Дольше и скучнее, зато вывод стоит на данных, а ставкой в нём не рискует вся выручка.</p>
<p>Недельное окно измеряет инерцию вашего спроса. Вклад рекламы на нём не виден в принципе.</p>
<p>Если завтра выключить весь платный трафик, через сколько недель вы это почувствуете — и готовы ли столько ждать ради чистоты вывода?</p>]]></content:encoded></item>
<item><title>Кейсы с истёкшим сроком годности</title><link>https://evstygney.ru/notes/otzyvy-s-istekshim-srokom/</link><guid isPermaLink="true">https://evstygney.ru/notes/otzyvy-s-istekshim-srokom/</guid><pubDate>Fri, 07 Aug 2026 09:00:00 +0300</pubDate><description>Раздел «Кейсы» с датами 2019 года читается как «семь лет хвастаться нечем». Сколько стоят невидимые потери и как поставить два свежих кейса в квартал на поток.</description><content:encoded><![CDATA[<p>Раздел «Кейсы» с датами 2019 года работает против вас. Клиент читает его как «за последние семь лет хвастаться нечем».</p>
<p>В B2B перед сделкой на миллионы ваш сайт изучают внимательно — и даты смотрят обязательно. Свежий кейс говорит «они в форме прямо сейчас». Кейс пятилетней давности говорит «когда-то умели». Логотипы гигантов из прошлой жизни не спасают: рядом с ними должно лежать хоть что-то из этого года.</p>
<p><span class="vrez">В деньгах</span> Коварство в невидимости потерь: клиент, которого смутила устаревшая витрина, не оставляет заявку — он молча уходит, и в CRM его нет. Сколько сделок проиграно на этом этапе, вы не узнаете никогда. Прокси-замер: спросите пять последних проигранных клиентов, что смутило при изучении компании. «Не нашли свежих работ» звучит чаще, чем приятно слышать.</p>
<p><span class="vrez">Решение</span> Два свежих кейса в квартал — как регулярный процесс, а не подвиг раз в три года. Кейс может быть маленьким: задача, что сделали, одна цифра результата, цитата клиента. Согласие на публикацию вносите сразу в договор — после закрытия проекта выпрашивать его сильно сложнее.</p>
<p><span class="vrez">Замечание</span> Соблазн просто убрать даты — плохая идея. Отсутствие дат читается ровно так же, а доверие падает уже ко всей витрине: что ещё тут подкрутили?</p>
<p>Подведём итог: витрина кейсов — скоропортящийся продукт со сроком годности год-полтора. Дальше социальное доказательство начинает доказывать обратное.</p>
<p>Какой год стоит на самом свежем кейсе вашего сайта?</p>]]></content:encoded></item>
<item><title>Бюджет как процент от выручки ускоряет падение</title><link>https://evstygney.ru/notes/byudzhet-procent-ot-vyruchki/</link><guid isPermaLink="true">https://evstygney.ru/notes/byudzhet-procent-ot-vyruchki/</guid><pubDate>Wed, 05 Aug 2026 09:00:00 +0300</pubDate><description>Выручка просела на 15%, бюджет режут на 15%, выручка падает дальше. Почему правило процента уводит с рынка в момент дешёвого трафика и чем его заменить.</description><content:encoded><![CDATA[<p>«Маркетинговый бюджет — 10% от выручки» звучит как порядок и дисциплина. На спаде это правило превращается в машину по ускорению падения.</p>
<p>Механика простая. Выручка просела на 15% — бюджет автоматически режут на 15%. Меньше рекламы — меньше новых клиентов — выручка проседает дальше. Правило снова требует резать. Каждый виток этой спирали компания проходит своими руками, строго по регламенту.</p>
<p>Обиднее всего, что происходит это ровно в тот момент, когда трафик дешевеет. Конкуренты на спаде тоже режут бюджеты, аукцион остывает, клик стоит на 20–30% меньше обычного (прикидка, зависит от ниши). Правило «процент от выручки» уводит вас с рынка именно тогда, когда долю на нём раздают со скидкой — и забирает её тот, кто остался.</p>
<p><span class="vrez">Решение</span> Привязать бюджет к юнит-экономике: сколько стоит новый клиент, сколько он приносит, где предельный CAC. Пока клиент окупается — закупку держим или наращиваем, какой бы ни была выручка месяца. Процент от выручки оставить как ориентир для годового планирования и снять с него право автоматически резать.</p>
<p><span class="vrez">Замечание</span> Если экономика клиента не сходится — резать действительно надо, причём сильнее, чем на 15%. Правило процента плохо тем, что не отличает первую ситуацию от второй: оно вообще не смотрит на окупаемость.</p>
<p>Бюджет от процента выручки смотрит в зеркало заднего вида, бюджет от юнит-экономики — на дорогу. На растущем рынке разница незаметна, на падающем она стоит доли рынка.</p>
<p>Что произойдёт с вашим бюджетом при просадке выручки на 20% — и есть ли в этом сценарии хоть одно решение, кроме «резать»?</p>]]></content:encoded></item>
<item><title>Когда лидов больше, чем переварит отдел продаж</title><link>https://evstygney.ru/notes/lidy-bolshe-moshchnosti-prodazh/</link><guid isPermaLink="true">https://evstygney.ru/notes/lidy-bolshe-moshchnosti-prodazh/</guid><pubDate>Mon, 03 Aug 2026 09:00:00 +0300</pubDate><description>Бюджет удвоили, заявок 600 вместо 300, менеджеров по-прежнему двое: конверсия падает с 12% до 7%. Как считать мощность приёма до роста бюджета.</description><content:encoded><![CDATA[<p>История про то, как удвоение рекламного бюджета уменьшило прибыль. Без единой ошибки в настройках кампаний.</p>
<p>Числа модельные, картина из практики. Было: 300 заявок в месяц, два менеджера, конверсия в сделку 12% — 36 сделок. Собственник доволен, бюджет удваивают. Стало: 600 заявок и те же два менеджера. Время ответа выросло с 10 минут до 3 часов, заявки остывают, менеджеры хватают только «горячих». Конверсия падает до 7% — 42 сделки.</p>
<p><span class="vrez">В деньгах</span> Бюджет вырос вдвое, сделок стало больше на 17%. Стоимость сделки выросла примерно на 70%. Половина новых заявок оплачена и потеряна — при этом в рекламных отчётах всё отлично: заявки же пришли.</p>
<p>Почему так: у отдела продаж есть пропускная способность, как у трубы. Заявок сверх неё может приходить сколько угодно — конвертироваться они будут в очередь, в раздражение клиентов и в «перезвоните завтра».</p>
<p><span class="vrez">Решение</span> Перед увеличением бюджета посчитайте мощность приёма: сколько заявок в день менеджер обрабатывает без потери качества. Упёрлись в потолок — сначала расширяйте горлышко (люди, автоматическая квалификация, бот для типовых вопросов), потом наливайте трафик.</p>
<p><span class="vrez">Замечание</span> Обратное тоже верно: если менеджеры сидят без заявок, долить трафика обычно дешевле, чем держать простаивающую команду.</p>
<p>Подведём итог: рекламный бюджет и мощность продаж растут только парой. Рост одного без другого оплачивается из маржи.</p>
<p>Сколько заявок в день способен переварить ваш отдел продаж — и знает ли эту цифру тот, кто планирует рекламный бюджет?</p>]]></content:encoded></item>
<item><title>Ваш CAC занижен: как посчитать полную стоимость клиента</title><link>https://evstygney.ru/notes/vash-cac-zanizhen/</link><guid isPermaLink="true">https://evstygney.ru/notes/vash-cac-zanizhen/</guid><pubDate>Fri, 31 Jul 2026 09:00:00 +0300</pubDate><description>Кабинетный CAC 3000 ₽ превращается в 5500–6000 с зарплатами, комиссиями, промокодами и доставкой. Почему по заниженному CAC принимают убыточные решения.</description><content:encoded><![CDATA[<p>CAC, который вам показывают в отчёте, почти наверняка занижен. Иногда — вдвое.</p>
<p><span class="vrez">Простыми словами</span> CAC — стоимость привлечения одного нового клиента: расходы на привлечение делим на число новых клиентов.</p>
<p>Кабинетная версия: рекламный бюджет 300 тысяч, 100 новых клиентов — CAC 3000 ₽. С этой цифрой идут принимать решения.</p>
<p>Теперь честная версия. Добавим зарплату маркетолога и комиссию подрядчика — 150 тысяч. Контент, дизайн, лендинги — 50 тысяч. Промокод на первую покупку — минус 10% чека. Эквайринг, доставка первого заказа, возвраты. Реальный CAC выходит 5500–6000 ₽. Числа модельные, но пропорция из практики: полный CAC в полтора-два раза выше кабинетного.</p>
<p><span class="vrez">В деньгах</span> Опасность не в самой цифре, а в решениях по ней. При марже с первого заказа 4000 ₽ кабинетный CAC 3000 говорит «масштабируем, окупаемся сразу». Реальный 5500 говорит «окупаемся только со второго заказа — сначала проверьте, есть ли у вас повторные покупки». Это два разных бизнес-решения, и одно из них убыточное.</p>
<p><span class="vrez">Решение</span> Раз в квартал считайте полный CAC: все расходы на привлечение, включая людей, скидки и инструменты. Для ежедневной оптимизации кампаний кабинетной цифры достаточно, для решений о масштабировании — только полная.</p>
<p>Коротко: заниженный CAC опасен тем, что экономика с ним сходится на бумаге и расходится на расчётном счёте.</p>
<p>Ваш CAC — он с зарплатами и скидками или только с рекламным бюджетом?</p>]]></content:encoded></item>
<item><title>Разрыв между обещанием на сайте и причиной покупки</title><link>https://evstygney.ru/notes/razryv-obeshchaniya-i-pokupki/</link><guid isPermaLink="true">https://evstygney.ru/notes/razryv-obeshchaniya-i-pokupki/</guid><pubDate>Wed, 29 Jul 2026 09:00:00 +0300</pubDate><description>Компания продаёт экспертизу, сайт кричит про сроки. Проверка на пять минут: спросить пять клиентов, почему выбрали вас, и сравнить с главной страницей.</description><content:encoded><![CDATA[<p>Проверка на пять минут: откройте свою главную страницу и список причин, почему последние пять клиентов выбрали именно вас. За 10 лет я редко видел, чтобы эти два текста совпадали.</p>
<p>Компания продаёт «надёжность и экспертизу», а сайт кричит про «сроки от 3 дней». Или наоборот: клиенты покупают за скорость, а на сайте — миссия, ценности и «комплексный подход». Реклама приводит людей под одно обещание, отдел продаж закрывает другим аргументом, и на стыке конверсия тихо умирает.</p>
<p><span class="vrez">В деньгах</span> Прикидка: лид в B2B стоит 3000–8000 ₽. Если 30 из 100 лидов пришли за обещанием, которое вы на звонке не подтверждаете, — вы оплатили их зря. При сотне лидов в месяц это 100–250 тысяч ежемесячно за трафик, который почти не мог сконвертироваться.</p>
<p><span class="vrez">Решение</span> Спросите пять последних клиентов, почему выбрали вас, — дословно, их словами. Спросите отдел продаж, какой аргумент реально закрывает сделки. Сравните с текстом на сайте и в объявлениях. Совпадений меньше половины — переписывайте сайт под слова клиентов: работающее сообщение они вам уже сказали, осталось его опубликовать.</p>
<p><span class="vrez">Замечание</span> Метод выглядит слишком простым, чтобы работать. При этом пять честных разговоров дают больше, чем месяц внутренних споров о формулировках.</p>
<p>Подведём итог: сильное позиционирование уже существует — им пользуются ваши клиенты, когда объясняют коллегам, почему выбрали вас.</p>
<p>За что вам на самом деле платят — и написано ли это на вашей главной странице?</p>]]></content:encoded></item>
<item><title>+10% к цене против +10% к бюджету: формула допустимого оттока</title><link>https://evstygney.ru/articles/price-vs-budget/</link><guid isPermaLink="true">https://evstygney.ru/articles/price-vs-budget/</guid><pubDate>Tue, 28 Jul 2026 09:00:00 +0300</pubDate><description>+10% к цене против +10% к рекламному бюджету на одной модельной экономике: формула допустимого оттока q = p/(m+p), таблица по маржам и протокол теста.</description><content:encoded><![CDATA[<p><span class="vrez">TL;DR</span> На одной и той же модельной юнит-экономике +10% к рекламному бюджету добавляет к прибыли ~1 млн, а +10% к цене — ~5 млн, даже при потере десятой части покупателей. Причина — асимметрия: прирост цены падает в прибыль почти целиком, прирост бюджета размывается себестоимостью и насыщением канала. Ниже — расчёт обоих рычагов, формула допустимой потери объёма <code>q = p / (m + p)</code>, таблица порогов по маржинальности, поправка на LTV и честный блок, где рычаг цены ломается. Чтение — минут шесть.</p>
<p>Привет, я Егор. По должности я тот человек, который приходит к собственнику просить +10% к рекламному бюджету. Тем честнее будет посчитать, когда этот запрос — худшее из доступных решений. Все числа — <strong>модельная прикидка, не из реального проекта</strong>: важна арифметика, подставляйте свои.</p>
<h2 id="_1">Модель</h2>
<p>Магазин: выручка 100 млн ₽/год, себестоимость товара 60 млн, реклама 15 млн, прочие расходы (фикс) 20 млн. Прибыль — 5 млн. Маржинальность по вкладу (цена минус себестоимость к цене) — 40%.</p>
<h2 id="1-10">Рычаг 1: +10% к бюджету</h2>
<p>Реклама 15 → 16,5 млн. В линейном мире это +10% выручки, но линейного мира нет: горячая аудитория уже выкуплена, каждый следующий клиент дороже предыдущего (подробно про предельные величины и насыщение каналов — [статья про классифайд и Директ]). Возьмём оптимистичные +6% выручки:</p>
<ul>
<li>Выручка: +6 млн → 106 млн</li>
<li>Себестоимость: +3,6 млн → 63,6 млн</li>
<li>Реклама: +1,5 млн → 16,5 млн</li>
<li>Прочие: без изменений</li>
<li><strong>Прибыль: 5 → 5,9 млн (+0,9 млн)</strong></li>
</ul>
<p>Почти миллион — неплохо. Запомним и посчитаем соседний рычаг.</p>
<h2 id="2-10">Рычаг 2: +10% к цене</h2>
<p>Подняли цены на 10%, потеряли 10% покупателей в штуках — сценарий, которого обычно и боятся:</p>
<ul>
<li>Выручка: 0,9 × 110 = 99 млн (просела на 1%)</li>
<li>Себестоимость: на 10% меньше штук → 54 млн</li>
<li>Реклама и прочие: без изменений → 15 + 20 = 35 млн</li>
<li><strong>Прибыль: 99 − 54 − 35 = 10 млн (+5 млн, ×2)</strong></li>
</ul>
<p>Выручка чуть упала, прибыль удвоилась. Механика прозрачна: надбавка к цене не тянет за собой ни себестоимости, ни рекламы — она падает в прибыль целиком, а на потерянных штуках вы ещё и экономите себестоимость.</p>
<h2 id="_2">Формула допустимого оттока</h2>
<p>Главный страх — «уйдёт слишком много». У «слишком» есть точное значение. Пусть m — маржинальность по вкладу, p — процент повышения цены. Прибыль не уменьшится, пока потеря объёма q не превышает:</p>
<pre><code>q = p / (m + p)
</code></pre>
<p>Вывод в одну строку: приравниваем вклад до и после, (1−q) · (m+p) = m, и выражаем q. Таблица порогов для +10% к цене:</p>
<table>
<thead>
<tr>
<th>Маржинальность по вкладу</th>
<th>Допустимая потеря штук при +10% к цене</th>
</tr>
</thead>
<tbody>
<tr>
<td>20%</td>
<td>33%</td>
</tr>
<tr>
<td>40%</td>
<td>20%</td>
</tr>
<tr>
<td>60%</td>
<td>14%</td>
</tr>
<tr>
<td>80%</td>
<td>11%</td>
</tr>
</tbody>
</table>
<p>Читается так: при марже 40% вы остаётесь при своей прибыли, даже если уйдёт каждый пятый покупатель. Уйдёт меньше — вы в плюсе. Низкомаржинальный бизнес защищён ещё сильнее: при 20% маржи надо потерять треть покупателей, чтобы повышение не окупилось.</p>
<p><span class="vrez">Замечание</span> Формула сравнивает прибыль по вкладу и молчит о выручке — а с выручкой связаны бонусы команды, ковенанты и амбиции. Решение «минус оборот, плюс прибыль» стоит проговорить до теста.</p>
<h2 id="ltv">Поправка на LTV</h2>
<p>Формула считает разовые сделки. Если клиент покупает повторно, потерянный покупатель уносит не одну маржу, а поток будущих — и порог ужесточается: в формулу вместо маржи сделки подставляйте маржу жизненного цикла клиента, а повышение цены — только по тем позициям, где оно не рвёт удержание. Для подписочных моделей и частых повторных покупок консервативнее считать q по LTV-марже; порог получится заметно ниже табличного.</p>
<h2 id="_3">Где рычаг ломается</h2>
<ul>
<li><strong>Сравнимость в один клик.</strong> Маркетплейсы, агрегаторы, идентичный SKU у десяти продавцов: эластичность зашкаливает, +10% к цене — минус позиция в сортировке и кратная потеря штук. Формула честно скажет «нельзя», если подставить реальный отток.</li>
<li><strong>Конкурентная реакция.</strong> В узкой нише сосед может не подняться следом — и таблица допустимого оттока встретится с реальностью раньше времени. Страховка — тест на части ассортимента, не фронтальное повышение.</li>
<li><strong>Психологические пороги.</strong> Одинаковые +10% переживаются по-разному: 990 → 1089 перескакивает через круглую тысячу и бьёт сильнее, чем 890 → 979. Учитывается на уровне конкретных позиций.</li>
<li><strong>Регулируемые и контрактные цены.</strong> Долгие договоры, тендеры, госцены — рычаг двигается раз в цикл перезаключения, не когда захотелось.</li>
</ul>
<h2 id="_4">Как тестировать</h2>
<ol>
<li>Снять маржинальность по вкладу флагманских категорий — из управленки, не из ощущений.</li>
<li>Посчитать порог q по формуле (для повторных — по LTV-марже).</li>
<li>Поднять цену на одной категории (или в одном регионе), сопоставимую оставить контролем.</li>
<li>Мерить 4–6 недель штуки, выручку, вклад против контроля. Потеря меньше порога — раскатывать дальше; больше — откатить. Откат стоит один клик, что выгодно отличает этот тест от большинства маркетинговых экспериментов.</li>
</ol>
<p><span class="vrez">Откуда числа</span> P&amp;L модельный, проценты округлены для читаемости; +6% выручки на +10% бюджета — оптимистичное допущение (реальную кривую насыщения снимайте по своей истории трат). Формула порога — арифметика вклада, проверяется подстановкой за минуту.</p>
<h2 id="_5">Краткие выводы</h2>
<ol>
<li>На модельной экономике +10% к цене дал +5 млн прибыли, +10% к бюджету — +0,9 млн. Асимметрия структурная: надбавка цены не тянет затрат.</li>
<li>Допустимая потеря объёма считается, а не угадывается: q = p / (m + p). При марже 40% повышение на 10% терпит уход 20% покупателей.</li>
<li>Для бизнеса с повторными покупками порог считать по LTV-марже — он жёстче.</li>
<li>Рычаг не работает при сравнимости в один клик и требует теста на части ассортимента с контролем.</li>
</ol>
<p>Бюджет вы пересматриваете каждый месяц — а когда последний раз пересматривали цену флагманской категории и считали её порог оттока по формуле, а не по ощущению «клиенты уйдут»? Если тестировали повышение — сколько покупателей потеряли фактически против расчётного порога?</p>]]></content:encoded></item>
<item><title>Как отчёт по последнему клику душит верх воронки</title><link>https://evstygney.ru/notes/last-click-dushit-verkh-voronki/</link><guid isPermaLink="true">https://evstygney.ru/notes/last-click-dushit-verkh-voronki/</guid><pubDate>Mon, 27 Jul 2026 09:00:00 +0300</pubDate><description>Ретаргетинг и брендовый поиск красивы в отчёте, но собирают спрос, который посеял охват. Что происходит через полгода после отключения верха воронки.</description><content:encoded><![CDATA[<p>Отчёт по последнему клику медленно душит ваш рост — тем увереннее, чем аккуратнее вы по нему оптимизируете.</p>
<p>Как это устроено. В отчёте по last-click вся заслуга достаётся тому, на что кликнули последним: ретаргетингу и брендовому поиску. CPA у них красивый — условные 800 ₽ против 4000 ₽ у охватных кампаний. Логичное решение: перелить бюджет из «дорогого» верха в «дешёвый» низ. Отчёт становится ещё красивее.</p>
<p>Ловушка: низ воронки собирает спрос, который посеял верх. Ретаргетинг догоняет тех, кто уже был на сайте. Брендовый поиск ловит тех, кто уже знает название. Отключив охват, вы перестали пополнять этот запас — и первые месяца три ничего не заметите, запаса хватает.</p>
<p><span class="vrez">В деньгах</span> Через полгода заявок меньше, а CPA нижних кампаний растёт: догонять стало некого. В отчётах причина не видна — там же верх «не работал». Платите дважды: недополученным объёмом сейчас и дорогим восстановлением спроса потом — разогревать рынок заново дороже, чем было его поддерживать.</p>
<p><span class="vrez">Решение</span> Смотреть на связку целиком: что происходит с общим числом новых посетителей, с брендовыми запросами в Вордстате, с долей новых клиентов в заявках. Эти три цифры падают — вы проедаете запас, каким бы красивым ни был CPA.</p>
<p>Last-click измеряет, кто дожал клиента, и молчит о том, кто его привёл. Оптимизация только по нему срезает будущий спрос.</p>
<p>Какая доля вашего бюджета работает на людей, которые про вас ещё не знают?</p>]]></content:encoded></item>
<item><title>Самый дорогой канал в маркетинге — согласования</title><link>https://evstygney.ru/notes/samyy-dorogoy-kanal-soveshchanie/</link><guid isPermaLink="true">https://evstygney.ru/notes/samyy-dorogoy-kanal-soveshchanie/</guid><pubDate>Fri, 24 Jul 2026 09:00:00 +0300</pubDate><description>Креатив готов в июле, согласование закончилось в сентябре. Сколько стоит неделя задержки кампании и как вписать эту цену в задачу на согласование.</description><content:encoded><![CDATA[<p>Самый дорогой канал в вашем маркетинге может вообще не иметь рекламного кабинета. Это согласования.</p>
<p>За 10 лет в перформансе я видел десятки случаев, когда кампанию к сезону запускали за неделю до его конца. Креатив был готов в июле, а «финальное финальное» согласование закончилось в сентябре. Аукцион, сезон и спрос никого не ждали.</p>
<p><span class="vrez">В деньгах</span> Представьте: сезонный пик длится 8 недель и приносит 40% годовой выручки. При обороте 200 млн это 80 млн, по 10 млн в неделю. Каждая неделя согласований на старте пика — 10 млн выручки, за которую вы даже не поторговались. Прикидка грубая, но порядок цифр отрезвляет.</p>
<p>Почему так выходит: решение по макету в моменте стоит «бесплатно», поэтому его гоняют по кругу — юристы, бренд-команда, личный вкус руководителя. Стоимость недели простоя в этот момент никто не держит перед глазами.</p>
<p><span class="vrez">Решение</span> Посчитайте стоимость недели задержки для каждой кампании и впишите её прямо в задачу на согласование. «Согласовать баннер (цена вопроса — 10 млн выручки сезона)» двигается по цепочке заметно бодрее, чем просто «согласовать баннер».</p>
<p><span class="vrez">Замечание</span> Контроль нужен, юристы тоже. Речь про третий и четвёртый круг правок, где меняют оттенок синего и двигают логотип на два пикселя.</p>
<p>Подведём итог: скорость решений — статья расходов, просто её нет в P&amp;L, поэтому её никто не защищает на бюджетном комитете.</p>
<p>Сколько недель у вас занимает путь от «идея» до «запустили» — и кто-нибудь считал, во что обходится каждая из них?</p>]]></content:encoded></item>
<item><title>Маркетинг, который не видит сделок, оптимизирует заявки: связка UTM → CRM руками за неделю</title><link>https://evstygney.ru/articles/lead-to-deal-analytics/</link><guid isPermaLink="true">https://evstygney.ru/articles/lead-to-deal-analytics/</guid><pubDate>Thu, 23 Jul 2026 09:00:00 +0300</pubDate><description>Сквозная аналитика лид → сделка без платформы: пять элементов связки UTM и CRM, SQL-джойн, дыры в данных и план работ на неделю.</description><content:encoded><![CDATA[<p><span class="vrez">TL;DR</span> Пока маркетинг видит воронку только до момента «заявка передана в продажи», он оптимизирует количество и цену заявок — и делает это добросовестно, даже когда дешёвые заявки не доходят до денег. Связать источник со сделкой можно без покупки платформы сквозной аналитики: пять элементов (скрытые поля формы, поля в CRM, телефония, нормализация контактов, витрина-джойн), неделя работ и дисциплина. Ниже — схема-минимум, SQL, модельная таблица, где «дешёвый» канал оказывается дороже по сделкам, и честный список дыр этого подхода. Чтение — минут семь.</p>
<p>Маркетолог показывает собственнику дашборд: лиды растут, стоимость заявки падает, всё зелёное. Собственник смотрит на кассу — а касса стоит. Знакомая сцена в B2B на сотни миллионов выручки. Я Егор, перформанс-маркетолог; причина тут обычно скучнее заговора: маркетинг физически не видит, чем его заявки закончились в продажах, — и чинится это не платформой за миллионы, а неделей аккуратной работы. Разберём минимальную схему. Числа в примерах — <strong>модельная прикидка, не из реального проекта</strong>.</p>
<h2 id="_1">Что строим</h2>
<p><span class="vrez">Простыми словами</span> Сквозная аналитика — связка «рекламный источник → заявка → сделка → деньги» для каждого лида, чтобы каналы сравнивались по выручке и стоимости сделки, а не по стоимости заявки.</p>
<p>Зачем — одна таблица вместо тысячи слов. Два канала, одинаковый месячный бюджет ~150–160 тыс. ₽:</p>
<table>
<thead>
<tr>
<th>Канал</th>
<th>Лиды</th>
<th>CPL</th>
<th>Сделки</th>
<th>CPA сделки</th>
<th>Выручка</th>
<th>Медианный цикл</th>
</tr>
</thead>
<tbody>
<tr>
<td>A («дешёвые лиды»)</td>
<td>200</td>
<td>800 ₽</td>
<td>4</td>
<td>40 000 ₽</td>
<td>1,2 млн ₽</td>
<td>30 дней</td>
</tr>
<tr>
<td>B («дорогие лиды»)</td>
<td>60</td>
<td>2 500 ₽</td>
<td>6</td>
<td>25 000 ₽</td>
<td>2,4 млн ₽</td>
<td>55 дней</td>
</tr>
</tbody>
</table>
<p>По CPL канал A лучше в три раза, по стоимости сделки — хуже в полтора, по выручке — вдвое. Отчёт «лиды и CPL» рекомендует масштабировать A; отчёт до денег — B. Обе рекомендации логичны, данные разные.</p>
<h2 id="-">Пять элементов схемы-минимум</h2>
<p><strong>1. Скрытые поля формы.</strong> В каждую форму сайта — hidden-поля: utm_source, utm_medium, utm_campaign, client_id счётчика, landing_url, дата. Заполняются скриптом из URL и куки при загрузке страницы; при отправке уезжают вместе с заявкой. Час работы фронтендера.</p>
<p><strong>2. Поля в CRM.</strong> Те же атрибуты — на карточке лида, не в комментарии («пришёл с рекламы» аналитикой не считается). Плюс жёсткое правило: лид без источника не создаётся, для ручного ввода есть значение <code>manual/менеджер</code>.</p>
<p><strong>3. Телефония.</strong> Половина B2B-заявок — звонки, и без привязки звонка к источнику схема дырявая. Минимум без затрат — отдельные подменные номера на канал (статический коллтрекинг): грубо, зато бесплатно и честно. Динамический коллтрекинг точнее, но это уже бюджет — в схему-минимум не входит.</p>
<p><strong>4. Нормализация контактов.</strong> Матчить сделку с лидом будем по телефону и email. <code>+7 (912) 345-67-89</code>, <code>89123456789</code> и <code>8-912-345-67-89</code> — один человек и три разные строки; без приведения к единому формату (E.164, нижний регистр для почты) джойн потеряет треть связок.</p>
<p><strong>5. Витрина.</strong> Один запрос, который собирает всё:</p>
<pre><code class="language-sql">SELECT
  l.utm_source, l.utm_campaign,
  count(DISTINCT l.id)                          AS leads,
  count(DISTINCT d.id)                          AS deals,
  sum(d.amount)                                 AS revenue,
  sum(d.amount) / NULLIF(count(DISTINCT d.id),0) AS avg_deal,
  percentile_cont(0.5) WITHIN GROUP (ORDER BY d.closed_at - l.created_at) AS median_cycle
FROM leads l
LEFT JOIN deals d
  ON (d.phone_norm = l.phone_norm OR d.email_norm = l.email_norm)
 AND d.created_at BETWEEN l.created_at AND l.created_at + INTERVAL '180 days'
GROUP BY 1, 2;
</code></pre>
<p>Окно 180 дней — под длинный цикл; для быстрых ниш хватит 60–90. Выгрузку из рекламных кабинетов с расходами приклеиваете к этой же витрине по utm_campaign — получаете CPA сделки и ДРР по каналам.</p>
<h2 id="_2">Дыры схемы — честный список</h2>
<p>Схема-минимум дырявая по построению; важно знать, где именно.</p>
<ul>
<li><strong>Доля несматченных сделок.</strong> Часть сделок не свяжется ни с одним лидом (пришли ногами, по рекомендации, телефон другой). Эту долю выводите в витрину явной строкой <code>unmatched</code>. Пока она под 20–30% — выводы по каналам работают; 60% несматченных — это отчёт о качестве данных, решения по нему принимать рано.</li>
<li><strong>Last touch в CRM — это last touch.</strong> Источник у лида один, а касаний до заявки могло быть пять. Про то, как правило приписывания искажает картину и что с этим делать, — [статья про атрибуцию]; здесь важно помнить: витрина отвечает «через какую дверь вошёл», без претензии на полный вклад канала.</li>
<li><strong>Фан-аут джойна раздувает выручку.</strong> Джойн по <code>phone OR email</code> связывает сделку со <em>всеми</em> подходящими лидами: если их несколько, <code>sum(d.amount)</code> сложит сумму сделки столько раз, сколько лидов она поймала, — а <code>count(DISTINCT d.id)</code> покажет 1, и метрики разъедутся. Прежде чем суммировать, сверните связку к одному лиду на сделку (last touch или первый лид по времени) — иначе выручка по каналам не сойдётся с фактической.</li>
<li><strong>Ручной ввод.</strong> Менеджеры будут заводить лиды мимо правил — валидация телефона на входе и дефолт <code>manual</code> спасают частично. Доля <code>manual</code> в витрине — метрика дисциплины отдела продаж, за ней стоит следить отдельно.</li>
<li><strong>Офлайн-первые касания.</strong> Выставка, вебинар, звонок по визитке — размечаются только руками (поле «офлайн-источник»). Дёшево и криво, но лучше пустоты.</li>
<li><strong>Малые числа.</strong> 4 и 6 сделок из таблицы выше — это ещё не статистика, это повод копить окно в 2–3 квартала до жёстких решений о каналах.</li>
</ul>
<h2 id="_3">План на неделю</h2>
<ul>
<li><strong>День 1–2.</strong> Hidden-поля на все формы; поля источника в CRM; правило «лид без источника не создаётся».</li>
<li><strong>День 3.</strong> Нормализация телефонов и почт (миграция по старым записям + триггер на новые).</li>
<li><strong>День 4–5.</strong> Витрина-джойн, приклейка расходов, строка unmatched. Первый отчёт «источник → сделки → выручка».</li>
<li><strong>Дальше и навсегда.</strong> Дисциплина заполнения. Это самая трудная часть проекта, и она не техническая: договорённость с руководителем продаж о том, что доля <code>manual</code> и unmatched — общая метрика двух отделов, стоит любых регламентов.</li>
</ul>
<h2 id="-_1">Когда схемы-минимум мало</h2>
<ul>
<li>Много каналов и звонков — нужен динамический коллтрекинг, статика перестаёт различать кампании.</li>
<li>Розничные офлайн-точки в цепочке — без систем лояльности/промокодов связку не собрать.</li>
<li>Нужен вклад каналов по всей цепочке касаний — это мультитач и эксперименты, отдельная лига по сложности и цене.</li>
</ul>
<p><span class="vrez">Откуда числа</span> Таблица каналов — модельная прикидка для иллюстрации расхождения CPL и CPA сделки; SQL — схема запроса (псевдо-Postgres), поля переименуете под свою CRM. Пороги (окно 180 дней, unmatched 20–30%) — практические ориентиры, не стандарт индустрии.</p>
<h2 id="_4">Краткие выводы</h2>
<ol>
<li>Канал с лидами втрое дешевле может приносить сделки в полтора раза дороже — видно это только в витрине «источник → выручка».</li>
<li>Схема-минимум = hidden-поля + поля в CRM + телефония + нормализация контактов + SQL-витрина. Неделя работ без покупки платформ.</li>
<li>Дыры (unmatched, ручной ввод, офлайн, last touch) не отменяют пользу — они требуют выводить качество данных в ту же витрину явной строкой.</li>
<li>Самое трудное — дисциплина заполнения: это договорённость двух отделов, и никакой SQL её не заменит.</li>
</ol>
<p>Какая доля сделок в вашей CRM имеет заполненный источник — вы её хоть раз считали? Если строили такую связку руками — обо что споткнулись сильнее всего? У меня в топе нормализация телефонов.</p>]]></content:encoded></item>
<item><title>Низкий ДРР — не всегда хорошая новость</title><link>https://evstygney.ru/notes/nizkiy-drr-plokhaya-novost/</link><guid isPermaLink="true">https://evstygney.ru/notes/nizkiy-drr-plokhaya-novost/</guid><pubDate>Wed, 22 Jul 2026 09:00:00 +0300</pubDate><description>ДРР 8% при выручке 20 млн против 12% при 35 млн: процент хуже, прибыли больше. Почему минимальный ДРР отдаёт долю рынка конкуренту.</description><content:encoded><![CDATA[<p>Если ваш маркетолог хвастается, что снизил ДРР с 12% до 8%, есть шанс, что он только что подарил долю рынка конкуренту.</p>
<p><span class="vrez">Простыми словами</span> ДРР — доля рекламных расходов в выручке: потратили 2 млн при выручке 20 млн — ДРР 10%.</p>
<p>Посчитаем на модельных числах, маржа 30%. Вариант первый: ДРР 8%, выручка 20 млн — после рекламы остаётся 22% × 20 = 4,4 млн. Вариант второй: ДРР 12%, выручка 35 млн — остаётся 18% × 35 = 6,3 млн. Процент хуже, прибыли на 1,9 млн больше.</p>
<p>Откуда берётся разница: низкий ДРР обычно означает, что вы выкупаете только самый горячий спрос — брендовые запросы и ретаргетинг. Дёшево и приятно в отчёте. Весь остальной спрос в это время выкупает конкурент — и через год у него база клиентов больше, а вам привлечение обходится дороже, потому что расти приходится на выжженном поле.</p>
<p><span class="vrez">Замечание</span> Это не призыв заливать бюджет без счёта. Верхняя граница — предельный CAC: пока новый клиент приносит больше, чем стоит его привлечение, наращивать закупку выгодно, какой бы «страшный» процент ни рисовался в отчёте.</p>
<p>Подведём итог: ДРР — ограничитель, а управлять ростом нужно прибылью в рублях. Минимальный ДРР и максимальная прибыль почти никогда не совпадают.</p>
<p>Посмотрите последний отчёт по рекламе: вы оптимизируете процент или рубли прибыли?</p>]]></content:encoded></item>
<item><title>Заявка остывает по минутам: как замерить это в своей CRM и не обмануться корреляцией</title><link>https://evstygney.ru/articles/lead-response-time/</link><guid isPermaLink="true">https://evstygney.ru/articles/lead-response-time/</guid><pubDate>Tue, 21 Jul 2026 09:00:00 +0300</pubDate><description>Как замерить время первого ответа на заявку в своей CRM: SQL для медианы и p90, четыре ловушки корреляции и квазиэксперименты.</description><content:encoded><![CDATA[<p><span class="vrez">TL;DR</span> Конверсия заявки в сделку падает с каждой минутой до первого ответа — это подтверждают и западные исследования, и почти любая выгрузка из CRM. Подвох в том, что наивный замер «скорость ответа против конверсии» по своей же CRM почти всегда преувеличивает эффект: быстрые ответы систематически достаются более горячим заявкам. Ниже — как построить замер (медиана и p90, не среднее), модельная таблица остывания, четыре ловушки корреляции с способами обхода и честный блок про то, чего без эксперимента не узнать. Чтение — минут семь.</p>
<p>В регламенте отдела продаж написано: на заявку отвечаем за 15 минут. В выгрузке из той же CRM p90 времени ответа — четыре часа, и в команде об этом никто не подозревает. Я Егор, перформанс-маркетолог; десять лет я оптимизировал то, что слева от заявки, — ставки, креативы, посадочные, — пока не увидел, что справа, между «лид упал в CRM» и «менеджер взял трубку», теряется больше. Разберём, как замерить это у себя и не обмануться выгрузкой. Все числа — <strong>модельная прикидка, не из реального проекта</strong>.</p>
<h2 id="_1">Что меряем</h2>
<p><span class="vrez">Простыми словами</span> Время первого ответа (first response time, FRT) — интервал между созданием заявки и первым исходящим контактом по ней: звонком, письмом, сообщением. Не «взял в работу» в CRM, а реальным касанием клиента.</p>
<p>Почему это метрика денег, а не сервиса: заявка приходит на пике интереса, и интерес распадается со временем, как и положено скоропортящемуся активу. Человек, оставивший заявку в трёх местах, поговорит с тем, кто позвонил первым, — и у первого шанс на сделку заметно выше, чем у перезвонившего вечером.</p>
<p>Модель остывания, на которую дальше будем смотреть критически:</p>
<table>
<thead>
<tr>
<th>Время первого ответа</th>
<th>Конверсия заявки в квалифицированный лид</th>
</tr>
</thead>
<tbody>
<tr>
<td>0–5 минут</td>
<td>12%</td>
</tr>
<tr>
<td>5–30 минут</td>
<td>9%</td>
</tr>
<tr>
<td>30–120 минут</td>
<td>6%</td>
</tr>
<tr>
<td>2–8 часов</td>
<td>4%</td>
</tr>
<tr>
<td>Следующий день и позже</td>
<td>2,5%</td>
</tr>
</tbody>
</table>
<p>В деньгах при CPL 1500 ₽: заявка, отвеченная на следующий день, стоит вам тех же полутора тысяч, но приносит почти впятеро меньше квалов. Цена квалифицированного лида (назовём её эффективным CPL): 12 500 ₽ при ответе в первые пять минут — и 60 000 ₽ при ответе назавтра. Реклама в обоих случаях отработала одинаково.</p>
<h2 id="_2">Как снять замер у себя</h2>
<p>Понадобятся два таймстампа на заявку: создание и первый исходящий контакт. Дальше — запрос уровня:</p>
<pre><code class="language-sql">SELECT
  date_trunc('week', l.created_at)            AS week,
  l.source,
  extract(hour FROM l.created_at)             AS hour_of_day,
  percentile_cont(0.5) WITHIN GROUP (ORDER BY a.first_touch - l.created_at) AS median_frt,
  percentile_cont(0.9) WITHIN GROUP (ORDER BY a.first_touch - l.created_at) AS p90_frt,
  count(*) FILTER (WHERE a.first_touch IS NULL) AS never_answered
FROM leads l
LEFT JOIN (SELECT lead_id, min(created_at) AS first_touch
           FROM activities WHERE direction = 'outbound' GROUP BY lead_id) a
  ON a.lead_id = l.id
GROUP BY 1, 2, 3;
</code></pre>
<p>Три решения в этом запросе важнее самого запроса.</p>
<ul>
<li><strong>Медиана и p90, не среднее.</strong> Пара заявок, отвеченных через неделю, утащит среднее в космос; медиана покажет типичный случай, p90 — хвост, в котором и живут потери.</li>
<li><strong>LEFT JOIN и счётчик <code>never_answered</code>.</strong> Заявки, по которым исходящего контакта не было вообще, — самая дорогая категория, и при INNER JOIN она молча исчезает из отчёта.</li>
<li><strong>Разрез по источнику и часу.</strong> Без него следующий раздел превратит ваш замер в самообман.</li>
</ul>
<h2 id="_3">Четыре ловушки корреляции</h2>
<p>Наивная выгрузка «FRT против конверсии» почти всегда покажет эффект сильнее реального. Причины:</p>
<p><strong>1. Время суток.</strong> Ночные и выходные заявки получают медленный ответ — и они же по составу холоднее дневных (импульсные, «просто прицениться»). У медленности и низкой конверсии здесь общая причина — час поступления заявки; прямой связи в таких данных меньше, чем кажется. Обход: сравнивать скорость с конверсией внутри одного часового слота, а слоты — между собой отдельно.</p>
<p><strong>2. Источник.</strong> Заявкам с «горячих» каналов менеджеры отвечают быстрее — видят знакомый источник и хватают. В общей выгрузке это читается как «быстрый ответ конвертит», хотя работает интент канала. Обход: разрез по источнику обязателен, сравнение — только внутри источника.</p>
<p><strong>3. Обратная причинность.</strong> Опытный менеджер быстрее берёт заявки, которые выглядят жирными (крупный запрос, знакомая компания). Скорость здесь следствие качества лида. Обход до конца не существует; частично помогает сравнение по менеджерам с разной дисциплиной на одинаковом пуле.</p>
<p><strong>4. Выжившие.</strong> Если считать конверсию только по отвеченным заявкам, а неотвеченные выкинуть, картина улучшится сама собой. Неотвеченная заявка — это ответ «бесконечность минут», и она обязана сидеть в знаменателе.</p>
<p><span class="vrez">Замечание</span> После очистки от всех четырёх эффект остывания обычно сохраняется, но сжимается — условно с «в 5 раз» из наивной выгрузки до «в 2–3 раза». Этого всё равно достаточно, чтобы SLA первого ответа был дешевле любого улучшения кампаний: он не требует бюджета вообще.</p>
<h2 id="_4">Чего без эксперимента не узнать</h2>
<p>Честная причинная оценка требует рандомизации — случайно задерживать ответ половине клиентов. Такой тест дорог и этически сомнителен, делать его не предлагаю. Доступные квазиэксперименты:</p>
<ul>
<li><strong>Естественные провалы.</strong> Отпуска, болезни, недоукомплектованные смены — периоды, когда скорость падала по внешним причинам при том же трафике. Сравнение конверсии таких периодов с обычными — грубая, но честная оценка.</li>
<li><strong>До/после внедрения SLA.</strong> Ввели дежурство и алерты — сравните квартал до и после с поправкой на сезон и структуру источников. Слабее рандомизации, сильнее голой корреляции.</li>
</ul>
<h2 id="_5">Что делать практику</h2>
<ol>
<li>Снять факт: медиана и p90 FRT по источникам и часам, доля неотвеченных. По регламенту у всех «15 минут»; по факту я видел p90 в часах у команд, искренне уверенных в обратном.</li>
<li>Поставить SLA в минутах на рабочие часы и отдельное правило на ночь/выходные (автоответ с обещанием времени + первый слот утра).</li>
<li>Алерт, который невозможно пропустить, — в мессенджер дежурному, не письмом на общую почту.</li>
<li>Пересчитать эффективный CPL по корзинам скорости — это аргумент, который переводит разговор с «менеджеры стараются» на язык денег.</li>
</ol>
<h2 id="_6">Где это не работает</h2>
<ul>
<li><strong>Тендерный и комитетный B2B.</strong> Когда решение принимает закупочная процедура месяцами, минуты первого ответа решают мало — там важнее полнота ответа.</li>
<li><strong>Заявка-бронь.</strong> Если форма — запись на конкретный слот (клиника, сервис), интерес зафиксирован самой записью, остывание слабое.</li>
<li><strong>Премиум с консьержем.</strong> Там скорость и так в SLA, а сделку решает качество сопровождения.</li>
</ul>
<p><span class="vrez">Откуда числа</span> Таблица остывания и CPL — модельная прикидка: форма кривой согласуется с известными исследованиями скорости ответа (InsideSales/HBR о кратном падении контактируемости после первых минут) и с тем, что я видел в выгрузках за 10 лет, но ваши коэффициенты будут своими. Метод замера выше — как раз способ их снять.</p>
<h2 id="_7">Краткие выводы</h2>
<ol>
<li>Время первого ответа — метрика денег: остывшая заявка стоит столько же, а конвертит в разы хуже. Эффективный CPL по корзинам скорости делает это видимым.</li>
<li>Мерить медиану и p90 с разрезом по источнику и часу; неотвеченные заявки держать в знаменателе.</li>
<li>Наивная корреляция преувеличивает эффект: время суток, источник, обратная причинность и выжившие работают на приукрашивание. После очистки эффект меньше, но остаётся.</li>
<li>SLA первого ответа — редкий рычаг конверсии с нулевым медиабюджетом.</li>
</ol>
<p>Какая у вас медиана и p90 времени первого ответа — по факту из CRM? И в чём измеряется ваш хвост p90 — в минутах или в сутках?</p>]]></content:encoded></item>
<item><title>Постоянные скидки — налог на слабый оффер</title><link>https://evstygney.ru/notes/skidki-nalog-na-offer/</link><guid isPermaLink="true">https://evstygney.ru/notes/skidki-nalog-na-offer/</guid><pubDate>Fri, 17 Jul 2026 09:00:00 +0300</pubDate><description>Скидка 20% режет маржу вдвое и приучает базу ждать распродажу. Когда скидка — инструмент, а когда плата за то, что продукт не убеждает в полную цену.</description><content:encoded><![CDATA[<p>Если товар продаётся только в акцию, скидка перестала быть инструментом роста и стала платой за слабый оффер — за то, что в полную цену продукт не убеждает купить.</p>
<p>Смотрите, что постоянная скидка делает с экономикой. Товар за 1000 ₽, себестоимость 600, маржа 400. Дали −20% — продаёте за 800. Маржа упала с 400 до 200, то есть вдвое. Чтобы вернуть ту же прибыль, надо продать не на 20% больше штук, а в два раза больше. Акция почти никогда столько не добавляет.</p>
<p><span class="vrez">Что происходит с базой</span> Клиент быстро обучается. Он видит, что у вас раз в месяц −20%, и перестаёт покупать по полной — просто ждёт следующую распродажу. Вы своими руками приучили лучшую часть аудитории не платить полную цену. Теперь даже те, кто купил бы и так, ждут купон.</p>
<p><span class="vrez">В деньгах</span> Это двойная потеря: режете маржу на каждой продаже и сдвигаете всю базу в режим «куплю на скидке». Через полгода полная цена становится фикцией, а нормой — цена со скидкой.</p>
<p><span class="vrez">Решение</span> Скидку использовать как событие с поводом и сроком — распродажа склада, праздник, — а не как постоянный фон. Если без скидки не продаётся вообще, чинить надо оффер: ценность, гарантию, упаковку, доказательства. Это дольше, чем нарисовать −20%, зато не разрушает экономику.</p>
<p><span class="vrez">Замечание</span> Есть бизнесы, где скидки и распродажи — часть модели: фэшн-аутлеты, маркетплейсы. Речь не про них, а про тех, кто скидкой затыкает слабую продажу и называет это маркетингом.</p>
<p>Подведём итог: постоянная скидка лечит симптом и усиливает болезнь — и платите вы за это маржой каждый раз.</p>
<p>Какая доля ваших продаж проходит вообще без скидки — по полной цене, потому что продукт того стоит?</p>]]></content:encoded></item>
<item><title>Война ставок: как два рекламодателя удвоили друг другу цену клика и ничего не выиграли</title><link>https://evstygney.ru/articles/auction-bid-war/</link><guid isPermaLink="true">https://evstygney.ru/articles/auction-bid-war/</guid><pubDate>Thu, 16 Jul 2026 09:00:00 +0300</pubDate><description>Симуляция войны ставок в аукционе второй цены: как два рекламодателя удваивают друг другу цену клика, формула потолка ставки и роль автостратегий.</description><content:encoded><![CDATA[<p><span class="vrez">TL;DR</span> В аукционах второй цены вы платите не свою ставку, а ставку соседа снизу — поэтому каждое повышение бьёт не по вам, а по тому, кто выше, и провоцирует ответ. Ниже симуляция войны двух рекламодателей по раундам: за шесть ходов цена топ-клика выросла с 41 до 105 ₽ при том же трафике и той же конверсии. Дальше — формула потолка ставки из экономики клиента (маржа × конверсия клика в сделку), почему гонку всегда выигрывает игрок с LTV, при чём тут автостратегии и когда правильный ход — выйти из аукциона. Все числа модельные. Чтение — минут семь.</p>
<p>Два рекламодателя месяцами двигают ставки друг под друга. Торговая площадка растёт по выручке, а в отчётах обоих лиды дорожают «из-за рынка» — и оба искренне винят рынок. Я Егор, занимаюсь перформансом, и этот сюжет вижу в разных нишах годами; разберём механику «рынка» на числах. Всё в статье — <strong>модельная прикидка, не из реального проекта</strong>: важна логика, абсолюты условны.</p>
<h2 id="_1">Как устроена цена клика</h2>
<p><span class="vrez">Простыми словами</span> В аукционах семейства второй цены (GSP/VCG — на них исторически строятся торги в поисковой рекламе) победитель платит не то, что поставил сам, а чуть больше ставки следующего за ним участника.</p>
<p>Из этого свойства растут два следствия, которые двигают всю статью.</p>
<p>Первое: ваша ставка — это не ваша цена. Это <strong>цена того, кто стоит над вами</strong>. Подняв ставку и оставшись вторым, вы не потратили ни рубля дополнительно — но подняли счёт лидеру.</p>
<p>Второе: раз цена лидера зависит от преследователя, гонка двух участников разгоняется их же руками. Каждый отвечает на подорожание своим повышением — и дорожает уже сопернику. Площадка в этой схеме — единственная сторона, у которой выручка растёт при любом исходе.</p>
<p><span class="vrez">Замечание</span> Реальный аукцион Директа сложнее учебной второй цены: ставка умножается на прогноз CTR и коэффициенты качества, показы разыгрываются по трафаретам, а точная формула — коммерческая тайна и периодически меняется. Для метода это не помеха: свойство «платишь по соседу снизу» сохраняется, а вместе с ним и вся механика ниже.</p>
<h2 id="_2">Симуляция: шесть ходов войны</h2>
<p>Три участника. A и B воюют за первое место, C — фоновый игрок со ставкой 30 ₽, которую не меняет. Шаг цены — 1 ₽. A и B перебивают друг друга по очереди, каждый раз с запасом ~20%.</p>
<table>
<thead>
<tr>
<th>Ход</th>
<th>Ставка A</th>
<th>Ставка B</th>
<th>Топ</th>
<th>Цена клика топа</th>
<th>Цена клика второго</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>50</td>
<td>40</td>
<td>A</td>
<td>41</td>
<td>31</td>
</tr>
<tr>
<td>1</td>
<td>50</td>
<td>60</td>
<td>B</td>
<td>51</td>
<td>31</td>
</tr>
<tr>
<td>2</td>
<td>72</td>
<td>60</td>
<td>A</td>
<td>61</td>
<td>31</td>
</tr>
<tr>
<td>3</td>
<td>72</td>
<td>86</td>
<td>B</td>
<td>73</td>
<td>31</td>
</tr>
<tr>
<td>4</td>
<td>104</td>
<td>86</td>
<td>A</td>
<td>87</td>
<td>31</td>
</tr>
<tr>
<td>5</td>
<td>104</td>
<td>124</td>
<td>B</td>
<td>105</td>
<td>31</td>
</tr>
</tbody>
</table>
<p>Что произошло за шесть ходов. Цена топ-клика выросла с 41 до 105 ₽ — в 2,6 раза. Число показов в категории не изменилось, конверсия сайта не изменилась, покупателей больше не стало: вся дельта — плата за очерёдность между двумя участниками. А второе место весь матч стоило 31 ₽ — его цена определяется фоновым C и войной вообще не задета.</p>
<p>Теперь в лидах. При конверсии клика в заявку 3% лид с первой позиции на ходе 5 стоит 3 500 ₽, со второй — 1 033 ₽. Разница трафика между первой и второй позицией — процентов 15–25 кликов (зависит от трафарета и запроса). То есть на ходе 5 участники платят <strong>тройную цену лида за пятую часть дополнительного объёма</strong>. Если экономика не отбивает такой предельный CPL — топ в этом аукционе покупать просто не нужно, и таблица сообщает это до списания бюджета.</p>
<h2 id="_3">Потолок ставки: формула</h2>
<p>Чтобы решать «воевать или выходить», нужна одна величина — максимальная ставка, при которой клик ещё не генерирует убыток:</p>
<pre><code>max_CPC = маржа_на_клиента × CR(клик → сделка)
</code></pre>
<p>Маржа на клиента — с учётом повторных покупок, если они есть. И вот здесь гонка решается ещё до первого хода.</p>
<p>Продавец с разовой сделкой: маржа 5 000 ₽, конверсия клика в сделку 1,2% → потолок <strong>60 ₽</strong>. Конкурент с подпиской или повторными покупками: маржа на клиента за горизонт 16 000 ₽, та же конверсия → потолок <strong>192 ₽</strong>. Вернитесь к таблице: на ходе 3 цена топа (73 ₽) уже выше потолка первого игрока — каждый следующий клик приносит ему убыток, который он увидит в P&amp;L через месяц. Второй же может спокойно сидеть в войне до 190 ₽ и пересидит любого «разового» соперника. Не потому, что лучше настроил кампанию — у него длиннее экономика клиента.</p>
<p><span class="vrez">Простыми словами</span> Гонку ставок выигрывает тот, кто больше зарабатывает на одном покупателе за всю его жизнь. Ставка — только видимая часть; торгуются на самом аукционе LTV двух бизнесов.</p>
<h2 id="_4">При чём тут автостратегии</h2>
<p>Возразить легко: «ставками давно управляет автостратегия, вручную никто не воюет». Верно — и это ничего не меняет по существу. tCPA и целевая ДРР — это тот же потолок ставки, просто заданный в других единицах и делегированный роботу, который торгуется на каждый показ, чаще и хладнокровнее человека.</p>
<ul>
<li>Занизили целевой CPA → робот сам выйдет из подорожавшего аукциона, и вы увидите падение трафика. Это не «стратегия сломалась» — это ваш потолок сработал как задуман.</li>
<li>Завысили → робот будет исправно финансировать чужую гонку вашими деньгами, а отчёт покажет «рост CPA по рынку».</li>
</ul>
<p>Война ставок между двумя автостратегиями с завышенными целями выглядит ровно как таблица выше, только раунды занимают минуты вместо недель.</p>
<h2 id="_5">Что делать практику</h2>
<ul>
<li><strong>Посчитать потолок по формуле для каждой кампании.</strong> Маржа на клиента × конверсия клика в сделку, по данным CRM, не по средним из головы. Это одна ячейка в таблице, а решает больше, чем недельная оптимизация ставок.</li>
<li><strong>Сравнить потолок с фактической ценой топа</strong> (отчёты о доле выигрышей и цене позиций в кабинете). Потолок ниже — не воевать: вторая-третья позиция, как видно из симуляции, может стоить втрое дешевле при сопоставимом объёме.</li>
<li><strong>Уходить туда, где сосед не торгуется.</strong> Низкочастотные и длинные запросы, свой сегмент, гео и часы с меньшей конкуренцией: та же аудитория часто достаётся по цене фонового игрока C.</li>
<li><strong>Поднимать потолок, а не ставку.</strong> Потолок растёт от двух вещей: конверсии (оффер, посадочная, скорость ответа на заявку) и маржи на клиента (повторные продажи, средний чек). Каждый пункт конверсии сверху — это законное право торговаться выше без убытка. У соперника этого права от вашей ставки не убавится, а вот экономику вашу оно догонит.</li>
</ul>
<h2 id="_6">Где эта модель врёт</h2>
<ul>
<li><strong>Симуляция — учебная.</strong> Живой аукцион считает ставку с прогнозом CTR и качеством объявления, объём трафика по позициям задают трафареты, участников больше двух, и они меняются по часам. Числа в таблице иллюстрируют механику; свой аукцион замеряйте своими отчётами.</li>
<li><strong>Не всякая дорогая ниша — «война».</strong> Иногда клик дорожает, потому что в аукцион пришли игроки с честно большей экономикой (страховки, финансы, недвижимость). Против LTV-преимущества тактика ставок бессильна — там конкурируют продуктом.</li>
<li><strong>Полный уход из топа имеет цену.</strong> На витринных запросах первая позиция — ещё и элемент присутствия: уступив её надолго, вы отдаёте не только клики, но и привычку аудитории видеть вас первым. Эффект медленный и на коротком окне не измеряется — честно говорю, что в формулу потолка он не входит.</li>
</ul>
<p><span class="vrez">Откуда числа</span> Ставки, конверсии и маржи — модельная прикидка на округлённых числах; шаг перебивки 20% и разница трафика позиций 15–25% — типовые ориентиры из практики. Метод воспроизводится на своих данных: цена позиций — из отчётов кабинета, конверсии и маржа — из CRM.</p>
<h2 id="_7">Краткие выводы</h2>
<ol>
<li>В аукционе второй цены ваша ставка задаёт цену сопернику сверху. Гонка двух участников кормится их же повышениями: в симуляции топ-клик подорожал в 2,6 раза при неизменном трафике.</li>
<li>Второе место в той же войне стоило 31 ₽ против 105 ₽ у топа — при разнице объёма в 15–25%. Предельная цена этого объёма и есть решение, покупать ли первое место.</li>
<li>Потолок ставки = маржа на клиента × конверсия клика в сделку. Гонку выигрывает длинная экономика клиента, и автостратегии этого не отменяют — они лишь исполняют заданный вами потолок быстрее.</li>
<li>Потолок поднимают конверсия и LTV. Ставка без них — только взнос в выручку площадки.</li>
</ol>
<p>Посмотрите цену клика в своём главном аукционе год назад и сейчас: если она выросла на десятки процентов при том же трафике, кто-то финансирует чью-то гонку — возможно, вашу. Считали ли вы свой потолок ставки по CRM-данным — и насколько он ниже фактической цены топа?</p>]]></content:encoded></item>
<item><title>Маркетинг не видит сделок: главная дыра B2B-аналитики</title><link>https://evstygney.ru/notes/marketing-ne-vidit-sdelok/</link><guid isPermaLink="true">https://evstygney.ru/notes/marketing-ne-vidit-sdelok/</guid><pubDate>Wed, 15 Jul 2026 09:00:00 +0300</pubDate><description>Лидов всё больше, касса стоит: маркетинг оптимизирует то, что видит. Что чинить вместо сайта — сквозную аналитику до выручки по каждому источнику.</description><content:encoded><![CDATA[<p>Спросите в B2B-компании, какой у маркетинга главный технический проект на год, — почти наверняка ответят «переделать сайт». Хотя дороже всего компании обходится другое: маркетинг не видит, чем его лиды закончились в продажах.</p>
<p>Типичная картина в компании на 300 млн – 2 млрд: маркетинг отчитывается лидами. Лидов всё больше, они всё «качественнее», графики ползут вверх. А касса стоит. Потому что маркетинг видит свою работу только до момента «заявка передана в продажи» — что стало с ней дальше, до него не доходит.</p>
<p><span class="vrez">Простыми словами</span> Если маркетинг не знает, какие лиды закрылись в деньги, он оптимизирует то, что видит: количество и стоимость заявок. И честно делает их больше и дешевле. Вот только дешёвый лид и лид, который платит, — это часто разные лиды.</p>
<p><span class="vrez">В деньгах</span> Полгода роста «качественных лидов» при стоящей выручке — это полгода бюджета, потраченного на заявки, которые не доходят до сделки. На цифрах среднего B2B это легко миллионы, ушедшие в улучшение того, что не приносит денег.</p>
<p><span class="vrez">Что чинить</span> Не сайт и не новые каналы. Сквозную аналитику до выручки: чтобы по каждому источнику было видно не «сколько заявок», а «сколько денег и с каким циклом сделки». Тогда маркетинг начинает крутить экономику, а не отчётность.</p>
<p><span class="vrez">Замечание</span> В B2B это труднее, чем в e-com: длинный цикл, сделки в CRM ведут руками, часть закрывается офлайн. Идеальной точности не будет. Но даже грубая привязка лида к сделке меняет то, на что тратится бюджет.</p>
<p>Подведём итог: пока маркетинг не видит сделок, он улучшает заявки. А деньги вы ждёте от выручки.</p>
<p>По каким источникам вы знаете не стоимость лида, а стоимость закрытой сделки?</p>]]></content:encoded></item>
<item><title>Классифайд или Директ: сравнение по CPL врёт в обе стороны</title><link>https://evstygney.ru/articles/classifieds-vs-direct/</link><guid isPermaLink="true">https://evstygney.ru/articles/classifieds-vs-direct/</guid><pubDate>Tue, 14 Jul 2026 09:00:00 +0300</pubDate><description>Почему сравнение классифайда и Директа по CPL врёт в обе стороны: предельный CPA сделки по ступеням бюджета, насыщение спроса и правило сплита.</description><content:encoded><![CDATA[<p><span class="vrez">TL;DR</span> Спор «классифайд или Директ» обычно решают сравнением CPL — и это источник плохих сплитов бюджета. Лиды этих каналов разной природы (контакт по конкретному товару против заявки «поговорить»), каналы по-разному насыщаются, и у обоих есть доля продаж, которая случилась бы и без денег. Метод: считать не средний CPL, а <strong>предельный CPA сделки по ступеням бюджета</strong> — и заполнять каналы в порядке предельной цены, пока ступени не сравняются. Ниже числовая модель с таблицей, поправка на инкрементальность и блок, где метод ломается. Чтение — минут семь.</p>
<p>Привет, я Егор. Веду перформанс — и работаю на стороне площадки, так что сразу выкладываю конфликт интересов на стол. Поэтому статья устроена как метод, а не как агитация: все числа — <strong>модельная прикидка, не из реального проекта</strong>, а расчёт собран так, чтобы вы повторили его на своих данных и не верили мне на слово.</p>
<h2 id="cpl">Почему CPL здесь не метрика</h2>
<p><span class="vrez">Простыми словами</span> Классифайд — площадка объявлений, куда покупатель приходит с уже сформированным спросом и выбирает из витрины (авто, недвижимость, техника, услуги). Контекст — реклама по поисковым запросам, которая перехватывает спрос раньше, на этапе выбора.</p>
<p>Сравнивать их по цене лида мешают три вещи.</p>
<p><span class="vrez">Лид ≠ лид</span> Контакт с классифайда — человек, который посмотрел конкретный товар с ценой и фото и нажал «позвонить». Лид из Директа — заявка с лендинга, часто на этапе «расскажите подробнее». Конверсия в сделку у них отличается в разы, поэтому сравнение по CPL сломано уже на входе.</p>
<p><span class="vrez">Каналы по-разному насыщаются</span> Спрос внутри классифайда конечен: категория в вашем регионе даёт фиксированное число контактов в месяц, и продвижение лишь перераспределяет их долю в вашу пользу. Чем выше вы уже стоите в выдаче, тем дороже каждый следующий контакт. Директ упирается в потолок позже, но стартует с более дорогой сделки.</p>
<p><strong>У обоих есть неинкрементальная доля.</strong> Часть контактов с платного продвижения вы собрали бы и без него — с органической позиции в той же витрине. В Директе ту же роль играют брендовые запросы. Про это ниже отдельно.</p>
<h2 id="_1">Считаем на модели</h2>
<p>Вводные: продавец товара длительного выбора, маржа на сделке — 40 000 ₽. Классифайд: базовый пакет размещения уже оплачен, считаем только бюджет на продвижение поверх. Конверсия контакта в сделку — 8% (человек звонит по конкретному товару). Директ: CPC 45 ₽, конверсия клика в лид 3%, лида в сделку — 6% (заявка «на разговор»). Разложим бюджет ступенями по 100 000 ₽ и посмотрим на <strong>предельные</strong> величины — что приносит именно следующая сотня тысяч.</p>
<table>
<thead>
<tr>
<th>Ступень бюджета</th>
<th>Классифайд: +контактов</th>
<th>Пред. CPL</th>
<th>Пред. CPA сделки</th>
<th>Директ: +лидов</th>
<th>Пред. CPL</th>
<th>Пред. CPA сделки</th>
</tr>
</thead>
<tbody>
<tr>
<td>Первые 100 000 ₽</td>
<td>+250</td>
<td>400 ₽</td>
<td>5 000 ₽</td>
<td>+67</td>
<td>1 500 ₽</td>
<td>25 000 ₽</td>
</tr>
<tr>
<td>Вторые 100 000 ₽</td>
<td>+140</td>
<td>714 ₽</td>
<td>8 930 ₽</td>
<td>+63</td>
<td>1 590 ₽</td>
<td>26 500 ₽</td>
</tr>
<tr>
<td>Третьи 100 000 ₽</td>
<td>+40</td>
<td>2 500 ₽</td>
<td>31 250 ₽</td>
<td>+56</td>
<td>1 790 ₽</td>
<td>29 800 ₽</td>
</tr>
</tbody>
</table>
<p>Что видно из таблицы. Первые две сотни тысяч в классифайде покупают сделку за 5–9 тысяч — Директ рядом не стоит. А вот третья сотня тысяч в классифайде приносит сделку уже за 31 250 ₽ — дороже, чем первая сотня в Директе. Вы упёрлись в дно спроса категории: выше витрины не прыгнуть, продвижение начало толкаться само с собой.</p>
<p>Теперь главный фокус. Посчитайте по той же таблице <strong>средний</strong> CPL классифайда на бюджете 300 000 ₽: 430 контактов, 698 ₽ за контакт — против 1500 ₽ в Директе. По средним классифайд «в два раза лучше», и отчёт скажет: наращивайте. По предельным — третью сотню тысяч надо было отнести в Директ. Средние величины прячут перелом; видно его только на ступенях.</p>
<p><span class="vrez">Замечание</span> Форма кривой насыщения у каждой категории и региона своя. В категории с большим спросом перелом наступит на миллионах, в узкой нише — на первых ста тысячах. Снимается это только своей историей трат: бюджет по месяцам против контактов по месяцам.</p>
<h2 id="_2">Поправка на инкрементальность</h2>
<p>В <a href="/articles/last-click-attribution/">статье про атрибуцию</a> я разбирал, почему «канал привёл продажу» и «без канала продажи бы не было» — разные утверждения. Здесь эта поправка обязательна с двух сторон.</p>
<p><span class="vrez">Классифайд</span> Вы и без продвижения стоите в выдаче — на неё приходит органическая доля контактов. Продвижение поднимает вас выше, но часть «купленных» контактов — те же люди, которые долистали бы и до старой позиции. Если инкрементальность продвижения 80%, предельный CPA всех ступеней делится на 0,8 — и перелом в таблице сдвигается на более раннюю ступень.</p>
<p><span class="vrez">Директ</span> Симметрично: брендовые запросы приписывают кампании людей, которые уже шли к вам. Считать канал стоит по небрендовой части — иначе Директ выглядит лучше, чем работает.</p>
<p>Честный способ снять оба коэффициента — эксперимент: отключить продвижение на части объявлений (или бренд-кампанию на части регионов) и сравнить с контролем. Грубый способ — сравнить динамику контактов в месяцы с продвижением и без, если такие были в истории.</p>
<h2 id="_3">Метод целиком</h2>
<ol>
<li><strong>Развести природу лидов.</strong> Снять свои конверсии в сделку отдельно для контактов классифайда и лидов контекста — из CRM, не из ощущений.</li>
<li><strong>Построить ступени.</strong> По истории трат (или тестами с шагом в месяц) снять предельные контакты и лиды на каждую следующую порцию бюджета.</li>
<li><strong>Поправить на инкрементальность</strong> оба канала — экспериментом или хотя бы грубой оценкой по истории.</li>
<li><strong>Заполнять от дешёвой предельной сделки к дорогой.</strong> Лить в канал, пока его предельный CPA не сравняется с предельным CPA соседа, — и переключаться. Оптимум — равные предельные цены сделки, а не «весь бюджет в канал с лучшим средним».</li>
<li><strong>Пересматривать раз в квартал.</strong> Кривые насыщения плавают по сезону и конкуренции; точка перелома — не константа.</li>
</ol>
<h2 id="_4">Где метод ломается</h2>
<ul>
<li><strong>В категории нет живого классифайда</strong> — сравнивать нечего, вопрос закрыт географией спроса.</li>
<li><strong>Малые бюджеты.</strong> На 50 000 ₽ в месяц ступени не построить: шума больше, чем сигнала. Тогда проще тест «месяц туда, месяц сюда» с одинаковой посадкой.</li>
<li><strong>B2B и сложные услуги.</strong> Там, где сделка закрывается полгода и вручную, предельный CPA считается только при связке маркетинга с CRM — без неё метод не запустится.</li>
<li><strong>Классифайд не создаёт спрос.</strong> Он собирает сформированный. Если задача — вывести новый продукт или категорию, у витрины вас ещё никто не ищет; тут работает охват и контекст по смежным запросам, и сравнивать каналы по CPA сделки рано.</li>
<li><strong>Зависимость от площадки.</strong> Складывая 100% производительности в один классифайд, вы отдаёте рычаг цен его прайс-листу — говорю это, работая на той стороне. Диверсификация каналов стоит денег — считайте это ценой страховки.</li>
</ul>
<p><span class="vrez">Откуда числа</span> Все значения в таблице — модельная прикидка на округлённых числах для наглядности: важна логика предельных величин, сами числа условны. Ваши кривые насыщения, конверсии и точка перелома будут другими — потому метод и построен вокруг съёма этих величин на своих данных.</p>
<h2 id="_5">Краткие выводы</h2>
<ol>
<li>Лид классифайда и лид Директа — разные сущности с разной конверсией в сделку. Сравнение каналов начинается с CPA сделки, снятого из CRM.</li>
<li>Классифайд насыщается об дно спроса категории; в модели третья сотня тысяч подняла предельный CPA с 5 000 до 31 250 ₽. Средний CPL этот перелом прячет.</li>
<li>Оба канала требуют поправки на инкрементальность: органическая позиция в витрине и брендовые запросы приписывают каналам чужие продажи.</li>
<li>Рабочее правило сплита: заполнять каналы от дешёвой предельной сделки к дорогой до выравнивания предельных цен.</li>
</ol>
<p>Посчитайте предельный CPA последней сотни тысяч в вашем главном канале — вы уверены, что она всё ещё дешевле первой сотни в соседнем? И знаете ли вы, на каком бюджете у вас наступает перелом?</p>]]></content:encoded></item>
<item><title>Скорость ответа на заявку: бесплатный рычаг конверсии</title><link>https://evstygney.ru/notes/skorost-otveta-na-zayavku/</link><guid isPermaLink="true">https://evstygney.ru/notes/skorost-otveta-na-zayavku/</guid><pubDate>Mon, 13 Jul 2026 09:00:00 +0300</pubDate><description>Ответ в первые 5 минут доводит заявку до сделки в разы чаще, чем через час. Где обычно дырка и как замерить своё реальное время первого ответа.</description><content:encoded><![CDATA[<p>Есть рычаг конверсии, который не стоит ни рубля рекламного бюджета: через сколько минут вы перезваниваете по заявке.</p>
<p>Цифра, которую неприятно проверять у себя: по разным замерам, ответ на заявку в первые 5 минут доводит её до сделки в разы чаще, чем ответ через час. Не на проценты — в разы. Человек оставил заявку на пике желания, и это желание остывает по минутам. Через час он уже листает конкурентов или передумал вовсе.</p>
<p><span class="vrez">В деньгах</span> Реклама привела заявку за 1500 ₽. Менеджер перезвонил через два часа и попал на «спасибо, я уже купил в другом месте». Полторы тысячи — в мусор, и так с каждой остывшей заявкой. Это дороже, чем любой неоптимизированный ключ в кампании.</p>
<p><span class="vrez">Где обычно дырка</span> Заявки падают на почту, которую смотрят два раза в день. Или в CRM без уведомлений. Или менеджер обедает, а лиды копятся. Реклама при этом работает идеально — деньги утекают между «заявка пришла» и «менеджер её увидел».</p>
<p><span class="vrez">Решение</span> Замерьте своё реальное время первого ответа — не по регламенту, а по факту, на выборке за неделю. Поставьте цель в минутах и уведомление, которое невозможно проигнорировать. Это дешевле и быстрее, чем в сотый раз перетряхивать рекламные кампании.</p>
<p><span class="vrez">Замечание</span> Скорость не спасёт плохой оффер и не заменит квалификацию лида. Но при прочих равных пять минут против часа — это бесплатная прибавка к конверсии, которую вы уже оплатили рекламным бюджетом.</p>
<p>Подведём итог: вы платите за заявку полную цену, а потом теряете её на том, что некому быстро снять трубку.</p>
<p>Через сколько минут в среднем у вас отвечают на заявку — и кто-нибудь это вообще считает?</p>]]></content:encoded></item>
<item><title>Аукцион Директа: как вы платите за клики конкурента</title><link>https://evstygney.ru/notes/aukcion-platite-za-konkurenta/</link><guid isPermaLink="true">https://evstygney.ru/notes/aukcion-platite-za-konkurenta/</guid><pubDate>Fri, 10 Jul 2026 09:00:00 +0300</pubDate><description>Поднимая ставку, вы двигаете всю лестницу цен под собой. Кто выигрывает гонку ставок, при чём тут LTV и куда уходить, если экономика слабее.</description><content:encoded><![CDATA[<p>Когда вы поднимаете ставку, чтобы обогнать конкурента в Директе, вы поднимаете цену клика и ему тоже. Аукцион устроен так, что за вашу гонку платят оба.</p>
<p>Объясню механику. В аукционе вы платите не свою ставку, а чуть выше ставки того, кто идёт следом за вами. Задрав ставку, вы двигаете вверх всю лестницу под собой. Конкурент видит, что подорожало, поднимает свою — и теперь дороже стало уже вам. Два бизнеса разогревают аукцион деньгами друг друга, а площадка считает выручку.</p>
<p><span class="vrez">В деньгах</span> Допустим, клик стоил 50 ₽. Вы с соседом месяц бодаетесь за первое место — клик стал 80 ₽. Трафик тот же, конверсия та же, но каждый лид подорожал на 60%. Никто не вырос, оба заплатили больше.</p>
<p><span class="vrez">Кто выигрывает гонку</span> Тот, у кого выше LTV. Он может позволить себе дорогой клик, потому что отбивает его на втором и третьем заказе. Если у вас разовая продажа, а у соседа подписка или повторные покупки, в лобовой гонке ставок вы проиграете заранее — он вас просто пересидит.</p>
<p><span class="vrez">Решение</span> Не выигрывать там, где у вас нет преимущества по экономике. Уходить в запросы, где конкурент не торгуется, в свой узкий сегмент, в рост LTV (это честно поднимает ваш потолок ставки) — а не толкаться лбами по общим высокочастотным запросам.</p>
<p><span class="vrez">Замечание</span> Цифры выше — иллюстрация механики, а не замер вашего аукциона: реальный шаг цены зависит от ниши и числа игроков. Но направление верное — лобовая гонка ставок дорожает для всех её участников сразу.</p>
<p>Подведём итог: место в выдаче покупается ставкой, а удерживается экономикой клиента. Ставка без экономики просто разоряет.</p>
<p>За какие запросы вы бодаетесь прямо сейчас — и выше ли у вас LTV, чем у того, с кем бодаетесь?</p>]]></content:encoded></item>
<item><title>Брендовый трафик в отчёте агентства: заслуга или налог</title><link>https://evstygney.ru/notes/brendovyy-trafik-zasluga/</link><guid isPermaLink="true">https://evstygney.ru/notes/brendovyy-trafik-zasluga/</guid><pubDate>Wed, 08 Jul 2026 09:00:00 +0300</pubDate><description>Продажи по запросам с вашим названием агентство записывает себе. Как разделить отчёт на брендовые и небрендовые запросы и что видно во второй части.</description><content:encoded><![CDATA[<p>В отчёте агентства есть строка, которая льстит всем и врёт почти всем: продажи с брендового трафика.</p>
<p>Это когда человек уже знает вашу компанию, гуглит её по названию, кликает по вашему же объявлению наверху выдачи и покупает. Агентство ставит эту продажу себе в результат. А купил бы он и так — название-то он вбил сам, по памяти.</p>
<p><span class="vrez">Простыми словами</span> Часть рекламного бюджета оплачивает клиентов, которые и без рекламы дошли бы до кассы. Вы платите за клик по дороге, которую человек и так знал.</p>
<p>Прикидка по рунету: в нишах с узнаваемым именем на брендовые запросы приходится 20–40% «рекламных» продаж в отчёте. При бюджете 1 млн в месяц это 200–400 тыс., размазанных по людям, которые уже ваши.</p>
<p><span class="vrez">Как проверить</span> Попросите разбить отчёт на два: брендовые запросы (с вашим названием) и небрендовые (категория, конкуренты, общие слова). Работу рекламы — сколько новых клиентов она приводит — видно только во второй части. Первая — это скорее налог на узнаваемость, чем заслуга канала.</p>
<p><span class="vrez">Замечание</span> Совсем выключать брендовую рекламу обычно нельзя: уберёте — на ваш запрос встанет конкурент и перехватит готового клиента. Но считать её отдельно и не платить агентству процент за «защиту вашего же имени» — можно и нужно.</p>
<p>Подведём итог: пока брендовые и небрендовые продажи свалены в одну строку, вы не знаете, сколько реклама приводит новых клиентов, а сколько просто провожает старых до кассы за ваши же деньги.</p>
<p>Какая доля ваших «рекламных» продаж — это люди, которые и так искали вас по названию?</p>]]></content:encoded></item>
<item><title>Last-click врёт, а вы платите ему зарплату: как атрибуция назначает не тех героев</title><link>https://evstygney.ru/articles/last-click-attribution/</link><guid isPermaLink="true">https://evstygney.ru/articles/last-click-attribution/</guid><pubDate>Wed, 08 Jul 2026 09:00:00 +0300</pubDate><description>Как last-click систематически хвалит низ воронки и топит охваты: числовая модель, коридор из нескольких моделей атрибуции и где всё это ломается.</description><content:encoded><![CDATA[<p><span class="vrez">TL;DR</span> Last-click систематически переписывает заслуги вниз воронки: брендовый поиск и ретаргет выглядят героями, охваты и верх воронки — балластом. Дальше сценарий предсказуемый: режем «убыточный» верх → через месяц-два проседает и «прибыльный» низ, потому что кормить его было нечем. Ни одна модель атрибуции не показывает правду: все они делят заслугу по своему правилу и ни одна не измеряет реальный вклад канала. Правду про вклад канала даёт только эксперимент на инкрементальность (holdout / geo-lift). Ниже — числовая модель, коридор из нескольких моделей вместо поиска «правильной», и честный блок про то, где это ломается. Чтение — минут восемь.</p>
<p>Привет, я Егор. 10 лет в performance-маркетинге, через мои руки прошли миллиарды рублей рекламных бюджетов — точную цифру не назову, NDA. Сегодня разберём атрибуцию — механизм, из-за которого в отчётах наказывают правильные каналы и премируют неправильные. Будут числа, таблица и разбор допущений. Все цифры в статье — <strong>модельная прикидка, не из реального проекта</strong>; важна логика, а сами числа условны.</p>
<h2 id="last-click-">Что не так с last-click, если по-взрослому</h2>
<p>Определение для порядка, одной строкой.</p>
<p><span class="vrez">Простыми словами</span> Атрибуция — это правило, по которому вы делите одну продажу между несколькими рекламными касаниями, которые к ней привели. Last-click отдаёт 100% заслуги последнему клику перед покупкой.</p>
<p>Last-click часто списывают на «неточность». Точность тут ни при чём: он <strong>смещён в одну сторону систематически</strong>. Последним касанием почти всегда оказывается то, что стоит у самого края покупки: брендовый поиск (человек уже решил и вбил ваше имя), ретаргет (догнали того, кто и так возвращался), прямой заход. А то, что создало спрос за две недели до этого — охватная кампания, статья, видео, — в момент покупки уже не «последнее» и получает ноль.</p>
<p>Дальше включается управленческая логика, и она губительна. В отчёте верх воронки убыточен → его режут → спустя лаг проседает и низ, потому что брендовый поиск не берётся из воздуха, его кто-то должен был создать. Классический способ зарезать себе продажи, глядя в «объективный» отчёт.</p>
<h2 id="_1">Считаем на модели</h2>
<p>Возьмём простую воронку из двух касаний. Канал A — охватная кампания (создаёт спрос, работает вверху). Канал B — брендовый/ретаргет (собирает уже прогретых внизу). 1000 покупок, у каждой был путь. Разложим одни и те же покупки по разным моделям атрибуции.</p>
<p>Пусть реальные пути такие (это вход модели, помечаю честно):</p>
<ul>
<li>400 покупок: касание только B (пришли по бренду сами, A их не касался);</li>
<li>100 покупок: касание только A (увидели охват, купили без брендового догона);</li>
<li>500 покупок: сначала A, потом B (охват создал спрос, бренд/ретаргет закрыл).</li>
</ul>
<p>Теперь смотрим, кому разные модели припишут эти 1000 покупок.</p>
<table>
<thead>
<tr>
<th>Модель</th>
<th>Заслуга канала A (верх)</th>
<th>Заслуга канала B (низ)</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Last-click</strong> (последнему касанию)</td>
<td>100</td>
<td>900</td>
</tr>
<tr>
<td><strong>First-click</strong> (первому касанию)</td>
<td>600</td>
<td>400</td>
</tr>
<tr>
<td><strong>Linear</strong> (поровну между касаниями)</td>
<td>350</td>
<td>650</td>
</tr>
<tr>
<td><strong>Position-based</strong> 40/20/40</td>
<td>350</td>
<td>650</td>
</tr>
</tbody>
</table>
<p>Одни и те же 1000 покупок. По last-click канал A принёс 100 продаж, по first-click — 600. Разница в шесть раз — следствие одного только выбора правила деления заслуги. Округление и «погрешность атрибуции» тут ни при чём. Если вы платите бонус команде по last-click, канал A выглядит кандидатом на отключение. Отключаете — и теряете те 500 покупок «A→B», где охват был обязательным первым звеном. В отчёте следующего месяца это прилетит как падение брендового поиска, и виноватым назначат совсем другой канал.</p>
<p><span class="vrez">Замечание</span> Position-based и linear не «правильнее» last-click. Они просто размазывают заслугу по другому произвольному правилу. Строки position-based и linear совпали не случайно: на путях из двух касаний схема 40/20/40 вырождается в 50/50 — среднего касания, которому положены 20%, здесь просто нет. Ни одна строка в таблице не измерила, что было бы, если бы канала A не было. А именно это — единственный вопрос, который имеет значение.</p>
<h2 id="_2">Почему «выбрать правильную модель» — неправильная постановка</h2>
<p>Здесь обычно начинается спор, какая модель атрибуции лучше. Спор беспредметный: <strong>все модели отвечают на вопрос «как поделить», а бизнесу нужен ответ на вопрос «что изменится, если убрать канал».</strong> Это разные вопросы, и второй атрибуцией в принципе не решается.</p>
<p>Пример, где это видно без всякой математики: брендовый поиск. Last-click припишет ему гору продаж. Но большая часть этих людей уже вбила ваше название — они бы дошли до покупки и без объявления, просто кликнув на органическую выдачу. Заслуга рекламы здесь — только те продажи, которых без неё бы не случилось. Клики, прошедшие через объявление, в этот счёт не попадают автоматически. Это называется инкрементальность, и атрибуция к ней слепа по построению: она работает только с путями, которые уже случились.</p>
<p><span class="vrez">Простыми словами</span> Атрибуция считает, через какие двери прошли покупатели. Инкрементальность считает, скольких покупателей эти двери реально привели, а не просто оказались у них на пути.</p>
<h2 id="_3">Что измеряет вклад канала: эксперимент</h2>
<p>Единственный способ узнать инкрементальный вклад канала — поставить эксперимент, в котором часть аудитории канал не видит, и сравнить группы.</p>
<ul>
<li><strong>Holdout / PSA-тест.</strong> Выключаем канал (или показываем плейсхолдер) на случайной доле аудитории, смотрим разницу в конверсии между теми, кто видел, и контрольной группой. Разница — это инкремент. Так проверяют ретаргет и брендовый поиск, и результат регулярно неприятный: часть «заслуженных» продаж случилась бы и без показа.</li>
<li><strong>Geo-lift.</strong> Гео-эксперимент: в части регионов канал крутим, в сопоставимой части — нет, разницу выручки чистим статистикой (тот же принцип, что в A/B, только единица — регион). Рабочий инструмент для охватных каналов, которые нельзя разрезать по пользователю.</li>
<li><strong>Инкрементальность самого дорогого канала — в первую очередь.</strong> Мерить всё сразу не нужно. Начните с канала, в который льёте больше всего денег и которому last-click рисует лучшие цифры: там цена ошибки максимальная.</li>
</ul>
<p><span class="vrez">Чем плох этот метод (честно)</span> Эксперименты стоят денег и времени: вы сознательно недопоказываете рекламу части аудитории и на время теряете часть выручки в контрольной группе — это плата за знание. Geo-lift шумит на малых объёмах и требует сопоставимых регионов, которых не всегда хватает. Holdout по брендовому поиску технически неудобно ставить. Идеальной чистоты не будет.</p>
<p><span class="vrez">Чем хорош</span> Это единственный метод из перечисленных, который отвечает на главный вопрос: что будет, если канал убрать. Одна честная цифра инкремента по дорогому каналу переигрывает любой красивый дашборд атрибуции.</p>
<h2 id="_4">Что с этим делать практику в понедельник</h2>
<p>Если бюджета на эксперименты и data-driven атрибуцию нет — вот минимум, который снимает большую часть боли:</p>
<ul>
<li><strong>Смотрите на коридор из моделей.</strong> Положите рядом last-click и first-click по каждому каналу. Канал, который по last-click «убыточен», а по first-click — герой, трогать нельзя без эксперимента: это ваш верх воронки. Расхождение моделей — это карта того, кто создаёт спрос, а кто собирает.</li>
<li><strong>Вынесите брендовый поиск в отдельную строку</strong> и не смешивайте с небрендовым. Его «заслуги» — самые спорные, и именно он раздувает last-click.</li>
<li><strong>Считайте лаг.</strong> Если после паузы охватного канала брендовый поиск падает через 2–4 недели — вы только что наблюдали инкрементальность бесплатно, самым болезненным способом.</li>
<li><strong>Для дорогого канала поставьте один holdout или geo-тест.</strong> Не ради науки — ради того, чтобы не резать бюджет вслепую по показаниям заинтересованной стороны.</li>
</ul>
<p><span class="vrez">Откуда числа</span> Все значения в таблице и в примерах — модельная прикидка на round-числах для наглядности, не выгрузка из реального проекта. Ваши распределения путей будут другими — потому и стоит снять их у себя и посмотреть, насколько сильно расходятся модели именно в вашей воронке.</p>
<h2 id="_5">Где этот разбор не работает</h2>
<ul>
<li><strong>Короткий цикл, один канал, мало данных.</strong> Если у вас 50 заказов в месяц и один источник, вся эта история про мультитач избыточна — там атрибуция не проблема номер один.</li>
<li><strong>Оффлайн-конверсии и длинный B2B.</strong> Когда сделка закрывается руками в CRM через полгода, ни одна модель атрибуции клика туда не дотянется — там нужна сквозная аналитика до выручки, это отдельный разговор.</li>
<li><strong>Data-driven атрибуция (Markov / Shapley) не отменяет эксперимент.</strong> Она делит заслугу умнее — по вероятностям путей, — но вопрос у неё тот же: «как поделить». Инкремент из неё не достать. Лучше linear, но holdout не заменяет.</li>
</ul>
<h2 id="_6">Краткие выводы</h2>
<ol>
<li>Last-click смещён систематически: хвалит низ воронки, топит верх. Так устроено само правило деления заслуги.</li>
<li>Любая модель атрибуции — произвольное правило деления заслуги. На одних и тех же 1000 покупок last-click и first-click разошлись в шесть раз.</li>
<li>«Что изменится, если убрать канал» отвечает только эксперимент — holdout или geo-lift. Начинать с самого дорогого канала.</li>
<li>Без бюджета на эксперименты — минимум это коридор из двух моделей (last- и first-click) и брендовый поиск отдельной строкой.</li>
</ol>
<p>А какой моделью атрибуции размечен ваш дашборд прямо сейчас — вы её выбирали осознанно, или она досталась по умолчанию? Если по умолчанию — велик шанс, что вы уже год премируете не тот канал.</p>]]></content:encoded></item>
<item><title>Какая задача у маркетинга? Три ответа, которые не совпадают</title><link>https://evstygney.ru/notes/zadacha-marketinga/</link><guid isPermaLink="true">https://evstygney.ru/notes/zadacha-marketinga/</guid><pubDate>Mon, 06 Jul 2026 09:00:00 +0300</pubDate><description>Собственник, РОП и маркетолог отвечают по-разному, бюджет один. Как записать задачу маркетинга одним предложением и перестать платить за активности ни для чего.</description><content:encoded><![CDATA[<p>Простой эксперимент на ближайшую планёрку. Спросите по очереди собственника, РОПа и маркетолога: «Какая задача у маркетинга в нашей компании?» По моему опыту, три ответа совпадают примерно никогда.</p>
<p>Собственник скажет «продажи». РОП — «нормальные лиды, а не как сейчас». Маркетолог — «узнаваемость, трафик и поддержка отдела продаж». Каждый после этого возвращается к работе над своей версией. Бюджет один, направления три.</p>
<p>Чем это кончается в деньгах: маркетинг без согласованной задачи оптимизирует то, что проще всего показать на слайде. Охваты растут, подписчики прибавляются, отчёты толстеют. Прикидка по компаниям, где я это видел: до трети маркетингового бюджета уходит на активности, которые никто не привязывал к выручке. Они не вредны — они просто ни для чего.</p>
<p><span class="vrez">Решение</span> Одно предложение, написанное собственником и подписанное всеми тремя: «Задача маркетинга на этот год — X, измеряем по Y, бюджет Z». Например: «Поток квалифицированных лидов для отдела продаж, метрика — лиды по согласованному чек-листу не дороже N ₽, всё остальное — по остаточному принципу».</p>
<p><span class="vrez">Замечание</span> Формулировка будет неидеальной, и это нормально. Спорная задача, записанная на бумаге, управляется лучше, чем идеальная, живущая у каждого в голове в своей редакции.</p>
<p>Подведём итог: прежде чем спрашивать с маркетинга результат, проверьте, что вы втроём одинаково понимаете, какой результат заказан.</p>
<p>Проведите этот эксперимент с тремя ответами на ближайшей планёрке — и посмотрите, насколько разойдутся версии.</p>]]></content:encoded></item>
<item><title>+10% к цене выгоднее +10% к рекламному бюджету</title><link>https://evstygney.ru/notes/cena-vygodnee-trafika/</link><guid isPermaLink="true">https://evstygney.ru/notes/cena-vygodnee-trafika/</guid><pubDate>Fri, 03 Jul 2026 09:00:00 +0300</pubDate><description>Модель магазина на 100 млн: рост бюджета почти не двигает прибыль, рост цены на 10% её удваивает. Где рычаг ломается и как тестировать.</description><content:encoded><![CDATA[<p>Самый дешёвый рост выручки спрятан в прайс-листе. Туда почти никто не смотрит — все смотрят в рекламный кабинет.</p>
<p>Покажу на прикидке. Магазин: выручка 100 млн, себестоимость 60, реклама 15, прочие расходы 20. Прибыль — 5 млн.</p>
<p>Способ первый, любимый: добавить +10% к рекламному бюджету. В идеальном мире это +10% выручки. Но реклама не масштабируется линейно — горячая аудитория уже выбрана, каждый следующий клиент дороже предыдущего. Реально получите +5–7%, CAC подрастёт, прибыль почти не сдвинется.</p>
<p>Способ второй: поднять цены на 10%. Часть клиентов отвалится — пусть уйдёт даже 10% продаж. Выручка останется около тех же 100 млн. Но эти «новые» 10% цены легли почти целиком в прибыль: себестоимость на упавших заказах вы уже не платите. Прибыль удваивается — из 5 млн в ~10 млн.</p>
<p><span class="vrez">Простыми словами</span> +10% к бюджету собственник чувствует инстинктивно. +10% к цене — страшно: «уйдут клиенты». Уходят не все, а арифметика прибыли — на стороне цены.</p>
<p><span class="vrez">Замечание</span> Рычаг ломается там, где товар сравнивают в один клик — маркетплейсы, агрегаторы, идентичный SKU: подняли на 10% — ушло не 10% покупателей, а половина. Работает он там, где сравнить в лоб нельзя: бренд, сервис, бандл, ниша, B2B. Поэтому цену не задирают по всему прайсу «на веру», а поднимают на одной категории и смотрят: при этой экономике можно потерять до 20% покупателей и всё равно выйти в плюс по прибыли. Потеряли больше — откатили.</p>
<p>Подведём итог: рост бюджета вы обсуждаете каждый месяц, рост цены — раз в пятилетку. А прибыли он приносит больше.</p>
<p>Когда вы последний раз поднимали цены — и что тогда по факту произошло с продажами и прибылью?</p>]]></content:encoded></item>
</channel>
</rss>