45 000 лидов в месяц с Reels: я искал формулу виральности и понял, почему её ищут не там

За месяц я построил машину, которая оценивает сценарий Reels ещё до съёмки. На свежей нетронутой выборке из 25 рилсов получил Spearman 0.535, p=0.007. И всё равно «формулы виральности» не существует: одни и те же хуки попадают и в топ-15, и в дно-15 у одного автора. Текст хука — 20% сигнала. Остальные 80% — arousal, ритм, момент публикации. Маркетологи продают вам формулу на двадцать процентов и называют это наукой.

Зачем

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

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

Не оракул. Не «генератор виралов». Машина из компонентов: банк хуков, формула скоринга, фильтр анти-плагиата, изоляция тестового стенда. Каждый прибавляет вероятность на единицы процентов. На горизонте ста рилсов эти проценты складываются.

Точечный выстрел оценивается по одному ролику. Система — по распределению из ста.

Идея харнесса

Карпати в karpathy/autoresearch показал каркас, где AI-агенты автономно крутят циклы экспериментов на nano-LLM training. Применил ту же идею к виральности — только цикл не пять минут на тренировку, а секунды на исторический backtest:

  1. Берём проаудиченных доноров — авторов с виралами и дохляками.
  2. Извлекаем text-features из каждого ролика.
  3. Субагент-оценщик получает только сценарий (без plays/likes), выдаёт predicted_viral_index.
  4. Оркестратор знает actuals — сравнивает predict vs actual.
  5. Через 100 итераций harness либо стабилизируется, либо мы понимаем, что универсальной формулы нет.

Параллель не выдуманная. Hit Song Science — академическая дисциплина с 1999 года, предсказывает хиты по звуковым признакам. Лучшие модели достигают R² ≈ 0.6 при тщательном feature engineering. Если для песни с миллионами размеченных треков — 0.6, наивно ждать большего на short-form video.

Потолок задан с самого начала. Не «всегда угадывает», а вытаскивает максимально возможный сигнал в пределах потолка.

Данные. Survivorship bias и dead-zone

Я попробовал автоматизировать выбор доноров: отсортировал 109 baseline-конкурентов по росту followers за 17 дней, выкатил top-13.

С клиентом-стратегом прошёл вручную по списку. 10 из 13 забраковали. AI-мультики, шлак-новости, копипаст без своего голоса.

Follower-growth измеряет активность алгоритмической воронки, а не качество контента. Растут конвейеры с cadence ≥3 рилсов в день. Авторские эксперты с одним рилсом в три дня в эту автосортировку не попадают, хотя именно их паттерны переносимы.

После ручного отбора — 9 доноров: 4 RU и 5 EN. Имена не привожу: некоторые — прямые конкуренты. У всех talking head + авторский голос. Через Apify выкачал по 100 рилсов на каждого, через Gemini Lite прогнал extract по 33-полевому промпту. Стоимость — около $1.50 за полного донора.

Сначала я делал то, что делают все: брал top-15 у каждого автора и строил банки хуков. Получился банк на 689 hooks.

И тут пришёл первый честный момент. Заказчик спросил:

«Виральные = чёрный лебедь? Это же актуальность рынка. У нас по 30 у каждого, не все вирусные. Как мы учитываем?»

Survivorship bias. Если ты строишь модель только на победителях, ты никогда не узнаешь, что из их паттернов реально работает, а что — стандартная практика, которая иногда вирусит по удаче.

Решение — dead-zone class. Те же 9 доноров, но bottom-15 рилсов каждого, с фильтром age_days ≥ 14. Re-pull, extract, отдельный каталог. Всего 131 dead-zone reel. В банк хуков для генератора не идёт — иначе генератор начнёт повторять «не работает».

Асимметрия данных:

«Bottom» — относительная категория. Cross-author классификатор с target=abs plays учится на размере аудитории, а не на качестве контента. Формула должна быть within-author, не universal.

Изоляция: harness должен быть неподкупным

Если оценщик знает, что у ролика 1.25M plays, он подгонит scoring под результат. Не специально — просто механика LLM. Attention-слой использует все доступные сигналы, включая «знакомый автор», «уже видел этот shortcode».

Поэтому оценщик у меня запускается через prompt-isolation: видит только сценарий и формулу, к файлам с метриками доступа нет физически. После него отдельный аудитор-субагент проверяет каждую цитату-evidence против транскрипта. На первом батче поймал: ChatGPT записан как named_enemy (это инструмент, не антагонист), specificity=6 даёт +0.5 (rubric требует ≥7).

Harness должен быть неподкупным. Может ошибаться — это нормально. Но если он подгоняет результат под ответ, он не ошибается. Он майнит шум.

Промах #1. Train-on-test artifact

Стартовая rubric_v1 — transplant V6 формулы, которую я калибровал раньше на medical-нише: polarizing_audio (+2.0), named_enemy (+1.5), identity_hook (+1.0), calm_authority × 1.5.

Прогнал на пяти AI-tech-роликах. Spearman 0.40 на n=5. Праздник.

Перепроверил, чуть подкрутив веса, на тех же пяти — Spearman 0.90. Ещё больший праздник.

Расширил до stratified 25 (5 квинтилей × 5) — Spearman 0.11, p=0.60.

Train-on-test artifact в чистом виде. Я калибровал формулу на тех же пяти роликах, по которым её и проверял. Она «работала», потому что просто запоминала ответы.

Простая формула не вытянула. Я остановился:

«Кто решал такие задачи и как? В мире много умных людей, наверняка кто-то уже пытался — может, оттуда что-то возьмём?»

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

Peer-reviewed pivot: arousal vs calm

Тяжёлой артиллерии оказалось много. Индустрия и академия 20+ лет занимаются ровно этой задачей: Berger & Milkman 2012 (анализ 7000 NYT-статей), STEPPS, Hopkins «Scientific Advertising» (1923), Schwartz «Breakthrough Advertising» (1966), Cialdini «Influence», Stanford SNAP cascade prediction, TikTok ML papers.

Запустил research-субагент. Через 30 минут вернулся со списком из 15 признаков, которых нет в rubric_v1, и одним выводом, который перевернул весь подход:

Berger & Milkman, JMR 2012. На 7000 NYT-статей: виральность driven by physiological arousal, не valence. High-arousal positive (awe) и high-arousal negative (anger, anxiety) — оба more viral. Low-arousal sadness — anti-viral.

Shelepenkov & Kosonogov, SSRN 2025. EEG + EMG + GSR на TikTok-просмотрах: R²=0.51 виральности объясняется autonomic arousal зрителя.

То есть calm_authority × 1.5 в нашей V6 — прямая инверсия peer-reviewed evidence. Я строил формулу против 7000 NYT-статей и не знал об этом. На массовой выборке short-form video calm = low arousal = anti-share. V6 работала на medical именно потому, что medical — исключение, где trust beats arousal. В AI-tech — нет.

Так появилась rubric_v2 на peer-reviewed основе:

Прогнал — Spearman 0.31 на новой формуле. Лучше шума, но недостаточно для production. А потом — второй поворот.

Промах #2. Главный фикс был не в формуле, а в target

Отправил спеку v2 на два независимых ревью.

Codex нашёл target mismatch. Эффект оказался больше, чем оба рецензента ожидали.

В спеке прописано:

target_v2 = log(age_normalized_views + 1) − log(rolling_pre_publish_median + 1)

Plays нормализуются по возрасту, делятся на rolling median последних 20 рилсов до публикации этого ролика (никакого leak’а из будущего), log-разница.

А в коде я считал:

viral_index = plays / median_author, где median_author — константа по всем рилсам автора, включая свежие.

Корреляция между ними 0.929. То есть в 7% случаев они меняют ranking. Эти 7% — критические.

Заменил target. Не трогал ни одну строчку формулы. На нетронутой отложенной выборке 25 свежих рилсов:

Spearman 0.535, p=0.007

Quintile monotonicity идеальная: Q1 → 4.00, Q2 → 4.90, Q3 → 5.88, Q4 → 6.58, Q5 → 7.00.

Главный fix — не в формуле, а в target. Когда формула плохо работает, инстинкт — крутить веса. Сначала проверь, что target соответствует спеке.

Побочный вывод про рецензентов. Codex поймал target bug — это и был главный fix. Но оба ревьюера ошиблись в предсказаниях generalization: Claude max сказал «на свежих упадёт до 0.10–0.20» (реальность 0.535, выше чем на калиброванных), Codex предсказал, что audience_breadth решит проблему (реальность ρ=−0.016). Sharp independent review ловит баги. Но плохо предсказывает, что сломается на свежих данных, — у самих рецензентов нет out-of-sample test’а.

Главное открытие. Универсальной формулы нет

Со Spearman 0.535 на одном авторе пошёл проверять — работает ли это на других.

Не работает.

АвторТипnSpearman v2
Автор DEN AI-tutorial240.535
Автор ARU AI-инфобиз300.362
Автор BRU philosophy/AI270.115
Автор CRU AI-обзоры300.156
mixed cross-authorсмесь250.11

На mixed cross-author — 0.11. Шум.

Перевожу на человеческий: формула, которая работает у одного автора, у другого даёт мусор. Внутри одного автора она ловит сигнал — какие из его сценариев зайдут лучше других. Cross-author — не ловит. У каждого свой baseline reach, аудитория, стиль, алгоритмический бэкграунд. Одни и те же rubric-features в разных аккаунтах работают по-разному.

И тут второе открытие, которое я не ожидал. Я начал смотреть, какие хуки попали и в top-15, и в bottom-15 у одного автора. Оказалось — многие. Хуки вида «X не знает Y», «3 facts about Z», «AI just dropped W» встречаются и в виралах, и в дохляках. То есть сам текст хука — 20–30% сигнала. Остальное — arousal, каданс, новизна паттерна, авторитет, аудио, момент публикации, Schwartz-уровень, кадровый ритм.

На Авторе C это видно эталонно. Top-плейс median 25K, dead median 4.9K. Разница — 5×, и universal rubric_v2 даёт отрицательный separation (−0.20): топы по формуле получают score ниже dead’ов. Его топы ничем не отличаются от dead’ов по тексту. Разница где-то ещё — момент публикации, алгоритмический weather, накопленный engagement. Контент-формула это не ловит.

Формулы виральности нет. Есть инструмент, который повышает шансы внутри одного автора процентов на пятьдесят при наличии калибровки. Это много. Кто продаёт больше — врёт.

Reels Director: продукт из формулы

Из всего этого выросло два slash-команды в Claude Code.

/director генерирует сценарии. Семплирует hook от одного донора, setup от другого, payoff от третьего, CTA от четвёртого — анти-плагиат и cross-niche bridging одновременно (банки на 689 hooks и три параллельных по setup / payoff / CTA). Субагент-rewriter натягивает на тему, сохраняя hook-структуру. Self-evaluate по rubric_v2. Отдельный adversarial-субагент с промптом «найди что плохого». Hard-constraint gate (news_drop без актуальности → black_swan flag). Multi-stage dedupe. На выходе — top-5 в Markdown.

Запуск: /director "монетизация Telegram-бота через AI". Около 3 минут, копейки на rewrite.

/evaluate-v2 оценивает готовый драфт. Layer 1–6 — universal peer-reviewed rubric_v2 (Berger-Milkman / STEPPS / Hopkins / Schwartz / Loewenstein) → predicted_v1. Layer 7 — project-specific надбавки на основе анализа 9 доноров и 131 dead-zone reels (news_drop_pattern, series_numbering, pinned_keyword_first_comment_hint). Layer 8 — donor neighborhood (топ-3 ближайших ролика). Layer 9 — dead-zone proximity (cosine sim к центроиду 131 дохляка; sim ≥ 0.7 → warning).

Вывод: два score (v1/v2), что прибавилось/вычлось, top-3 фикса с expected_lift.

Один пример из живого банка. У одного из RU-доноров — ролик с хуком про «ИИ-аккаунты, набирающие миллионы просмотров». Plays — 1.25M. Структура: split-screen AI-fake influencer + listicle overlay + keyword-якорь + double-redirect (DM + pinned stories). Это единица данных, на которую ссылается генератор.

Три раунда валидации

Раунд 1 на одном RU-доноре (n=30, 15 топ + 15 dead). Layer 7 на чистых регулярках. v2 теряет 0.10 на global Spearman, но даёт +36% больший разрыв между top и dead. Confusion matrix на threshold ≥5.5: v2 ловит на 1 больше реальных топов без false positives. Принимаю.

Раунд 2 на трёх RU-донорах (n=87). Layer 7 даёт +0.37–0.46 к top-dead separation на всех трёх. Сигнал стабильный. Засветились слабые места: hashtag_stuffing мёртвый (никто на RU AI-tech не стаффит хэштеги), cta_vacuum срабатывает у 70–85% всех reels — не дискриминирует, news_drop слишком широкий, caption=description штрафуется неправильно (на RU AI-tech 70–85% top-reels именно в description-стиле).

Раунд 3. Ужесточил детекторы → v2.1. v2.1 хуже v2 на двух из трёх авторов. news_drop_strict (entity + announcement_verb + numeric) развалился. RU-доноры используют news framing без канонических announcement-глаголов: «вышел», «появился», «научил», «теперь умеет». Я не прописал их в ANNOUNCEMENT_VERBS_RU. Ужесточение убило 22 из 30 trigger’ов, причём преимущественно топов.

«Ужесточение детектора» на интуиции — почти всегда overcorrection. Если изначальный сигнал не falsifiable strict-метриками, пытаться его строжить = обнулять.

Сейчас в работе четвёртый раунд: regex заменяю на LLM-judgment. Claude Opus читает каждый сценарий целиком, интерпретирует STEPPS / arousal / Schwartz / info_gap. Гипотеза: regex даёт baseline, LLM даёт реальную оценку, разница покажет, сколько сигнала мы теряем на регулярках. Цель — пробить 0.40 на pooled cross-author. Это honest потолок.

Что не работает

Финальный вердикт

Я не пишу эту статью, чтобы продать продукт. Reels Director у меня живёт как два slash-команды в Claude Code — без UI, без API, без лендинга. Инструмент для моего контент-конвейера.

Один сдвиг есть. Я перестал выбирать темы рилсов «нравится / не нравится». Теперь гоняю драфт через /evaluate-v2, смотрю breakdown по 6 layer’ам, исправляю что фиксится, оставляю что не фиксится без штрафа.

И самое нечестное про всю эту работу — формула не предскажет, какой ролик заберёт миллион просмотров. Три false negative’а у Автора A (514K plays при v2=4.0; 360K при 4.5; 126K при 4.5) — рилсы, которые формула посчитала средними, а они вирусят. Возможные причины: relatable identity hook, hidden controversy, audio-driven push, чисто алгоритмический подкат. На уровне текста этого не видно.

Финальный вердикт — честный инструмент, не оракул. Spearman 0.535 на нетронутой отложенной выборке. Top-Dead separation +1.73 у Автора A. Банк на 689 hooks из 9 доноров. 131 dead-zone reel как negative-class. Изоляция оркестратор/оценщик/аудитор. Adversarial review. Hard-constraint gate.

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

Если читаешь это и думаешь — на твоих данных тоже могло бы работать

Пиши в Telegram. Если хочешь — соберём под твою нишу: 9–12 доноров, dead-zone, калибровка на твоих роликах. Если у тебя уже есть выборка на 100+ роликах — присылай, добавлю в общий банк.

Как контент превращается в деньги

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

Записаться на вебинар

Бесплатно · Без обязательств

Дмитрий Филюта — 14+ лет в перформанс-маркетинге, управлял бюджетами 50M+ ₽/мес. Пишу про AI-монетизацию, воронки и инженерную сторону контента. Instagram @dimani, Telegram.