惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
aimingoo的专栏
aimingoo的专栏
B
Blog RSS Feed
V
Visual Studio Blog
P
Proofpoint News Feed
云风的 BLOG
云风的 BLOG
博客园 - 【当耐特】
大猫的无限游戏
大猫的无限游戏
Application and Cybersecurity Blog
Application and Cybersecurity Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
The Cloudflare Blog
B
Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Apple Machine Learning Research
Apple Machine Learning Research
M
MIT News - Artificial intelligence
Know Your Adversary
Know Your Adversary
I
InfoQ
T
The Exploit Database - CXSecurity.com
V
Vulnerabilities – Threatpost
C
Cisco Blogs
Spread Privacy
Spread Privacy
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Palo Alto Networks Blog
Simon Willison's Weblog
Simon Willison's Weblog
月光博客
月光博客
博客园 - Franky
Project Zero
Project Zero
G
Google Developers Blog
S
SegmentFault 最新的问题
博客园 - 聂微东
P
Privacy & Cybersecurity Law Blog
The GitHub Blog
The GitHub Blog
阮一峰的网络日志
阮一峰的网络日志
P
Privacy International News Feed
T
Threat Research - Cisco Blogs
S
Schneier on Security
Microsoft Security Blog
Microsoft Security Blog
G
GRAHAM CLULEY
S
Security @ Cisco Blogs
Martin Fowler
Martin Fowler
A
Arctic Wolf
T
Tenable Blog
L
LINUX DO - 最新话题
TaoSecurity Blog
TaoSecurity Blog
Hugging Face - Blog
Hugging Face - Blog
有赞技术团队
有赞技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Увеличиваем продажи без слез аналитика
Andrey_Biryukov · 2026-05-27 · via Все публикации подряд на Хабре

Увеличиваем продажи без слез аналитика

Простой

8 мин

13K

Привет, Хабр! Меня зовут Андрей Бирюков. Я являюсь независимым экспертом в области ИТ и ИБ, преподаю в учебных центрах и пишу книги.

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

  • event_name = “Click

  • event_name = “form_submit_2

  • event_name = “send

  • event_name = «Пользователь нажал кнопку» (кириллицей, да)

Вас можно поздравить, вы стали жертвой событийного бардака. Типичная история: разработчики просто «запилили трекинг, как просили». А ведь просили вы, скорее всего, что‑то вроде: «Сделайте, чтобы видно было, кто что делает».

И что мы имеем в итоге — у нас есть воронка, но считать по ней нельзя. Потому что этапы размыты, события дублируются, а пользователь может скачать файл 50 раз и засчитать себе 50 лидов.

В этой статье мы представили гайд, посвященный тому, как спроектировать систему событий, которая будет работать как часы, начиная с первого касания и до закрытой сделки.

Шаг 1. Забудьте слово «Click»

Начнем с названий событий. Событие не должно называться по типу действия в интерфейсе. То есть название события «Click» — это плохой вариант. Вместо этого называем события по их бизнес‑смыслу.

Примеры боли и решений:

Вы говорите разработчику

Он делает

Аналитик потом

«Отправь событие на клик по кнопке „Оставить заявку“»

click_button_feedback

Не поймет, это заявка, подписка или просто нажатие

«Отследи отправку формы»

form_send

А какая форма? Карьеры? Скидки? Консультации?

«Событие на успешную отправку»

success

Простите, что? Успех чего? Регистрации? Платежа? Скачивания?

В общем, как в той «баянистой» картинке:

А теперь серьезно.

Правило. Схема именования: [объект]__[действие]_[результат]

Вот несколько примеров:

lead__created_success — лид создался;

payment__completed_initial — первая оплата прошла;

file__downloaded_brochure — скачали брошюру.

Здесь в качестве разделителей выступает двойное подчеркивание, если событие с частями. И никакого CamelCase и no_spaces.

Для лучшего понимания давайте выполним небольшой тест‑драйв. Откройте любой сырой лог событий и найдите три самых непонятных названия. Затем переименуйте их в своей голове по новой схеме.

Шаг 2. Нарисуйте воронку на салфетке перед тем, как писать техническое задание

Аналитик и разработчик часто говорят на разных языках. Аналитик — про «лиды, клиенты, жизненный цикл». Разработчик — про «DOM‑дерево, асинхронные вызовы, колбэки». Ваша задача — переложить воронку на события до того, как разработчик начнет писать код.

Возьмите лист бумаги (да, да, реальную бумагу). Напишите сверху «Пришел на сайт». Снизу — «Купил». Между ними — этапы вашей воронки.

Например:

  • Пришел на сайт.

  • Посмотрел товар (страница карточки).

  • Добавил в корзину.

  • Начал оформление.

  • Оплатил.

Теперь для каждого этапа укажите одно единственное событие, которое означает переход на этот этап.

Этап

Событие

Пришел на сайт

session__started (срабатывает на любой странице)

Посмотрел товар

product__viewed_item (сработало — человек минимум 5 секунд был на странице, иначе не считаем)

Добавил в корзину

cart__item_added (идентификатор товара, количество)

Начал оформление

checkout__started

Оплатил

payment__completed (статус «success», сумма, метод платежа)

Важнейшее правило: один этап — одно ключевое событие. Не надо на этап «Оплатил» вешать click_pay_button, payment_processing_started, payment_success. Аналитик сам запросит детали, если надо. Ему нужна чистая воронка.

Что вы можете сделать прямо сейчас? Нарисуйте эту схему на стикере (да, тоже на бумажном) и повесьте на монитор разработчика. Пусть он видит её каждый день.

Шаг 3. Убейте 99% мусора на этапе отправки события

Самая частая жалоба аналитика: «В логах 70% — боты, роботы сканирования и наши же тестировщики, которые накликали по 300 заявок».

Здесь есть два простых фильтра, которые нужно резать на стороне клиента до отправки, а не в аналитике.

Фильтр 1. Режим разработчика

Событие не отправляется, если:

localhost, 127.0.0.1, dev- или test- в домене.

— Пользователь залогинен как tester@company.com или любой адрес с доменом вашей компании (если это внутренний тест).

Фильтр 2. Боты по User‑Agent

Перед отправкой события делаете простую проверку на JavaScript:

const botPattern = /bot|crawl|spider|scrape|scan|headless/i;
if (botPattern.test(navigator.userAgent)) {
    return; // не отправляем событие
}
```

И обязательно — фильтр на window.innerWidth > 0 (безобидный способ отсечь headless‑браузеры, которые часто не инициализируют размер окна).

На этом шаге, прямо сейчас проверьте, в каком проценте ваших сырых событий есть userAgent со словами bot, crawl или headless. Если больше 5%, — вы потеряли кучу денег на обработку мусора.

Шаг 4. Проектируйте обязательные поля как у пистолета — с предохранителем

Запомните три простых правила: событие без идентификатора пользователя — мусор. Событие без метки времени — мусор. Событие без идентификатора сессии — полумусор.

Ваша задача сделать так, чтобы эти поля были обязательными на уровне сбора. В Google Tag Manager — это настройка «Require» для полей. В собственном SDK — это проверка на бэкенде перед записью в лог.

Минимальный обязательный набор для любого события:

event_name (схема из шага 1);

user_id (если есть авторизация) или anonymous_id (если нет);

session_id (один и тот же для всей сессии);

timestamp (ISO 8601, с часовым поясом);

page_url (без UTM‑меток, они отдельно).

Если разработчик говорит: «А можно без session_id, мы его через IP и User‑Agent склеим», — не соглашайтесь. Склейка вероятностная, точность упадет. Генерируйте session_id на клиенте при первом событии и тащите его во все последующие.

Напишите однострочный документ «Обязательные поля для всех событий» и отправьте в чат с разработкой. Скажите: «Без этих полей ваши события уходят в черную дыру и не попадают в отчеты к гендиректору».

Шаг 5. Боритесь с «двойным счетом» через один флаг

Вспомним еще одну классическую проблему: пользователь нажал кнопку «Отправить» 5 раз, потому что форма долго грузилась. У вас в логах — 5 событий lead__created_success. В CRM — 1 лид. Получаем разрыв.

Решение: событие отправляется один раз на бизнес‑результат, а не на действие в интерфейсе.

Как это выглядит в коде (псевдокод для понимания):

// Плохо
document.getElementById('submit').addEventListener('click', () => {
    sendEvent('lead__created_success');
});

// Хорошо
form.addEventListener('submit', async (e) => {
    e.preventDefault();
    const response = await sendFormData();
    if (response.status === 'success' && !alreadySent) {
        sendEvent('lead__created_success', { lead_id: response.lead_id });
        alreadySent = true;
    }
});
```

Здесь нашим спасением может стать флаг alreadySent, хранящийся в памяти сессии. Пользователь может тыкать кнопку 100 раз — событие уйдет один раз.

Прямо сейчас найдите в вашей системе самое часто дублирующееся событие (подсказка: это обычно form_submit). Проверьте, есть ли там защита от двойного счета. Если нет — это ваша первая точка для исправления.

Шаг 6. Сделайте «песочницу» для новых событий, а не правку в боевых

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

Здесь вам поможет следующее правило: все новые события сначала идут в тестовый контейнер (тестовый GTM‑контейнер, dev‑ветку SDK). Там они живут не менее 2 дней, за это время вы проверяете:

  • Имя события соответствует схеме.

  • Все обязательные поля есть.

  • Нет ложных срабатываний (например, событие purchase не уходит при добавлении в корзину).

  • Только после этого событие передается в прод.

Прямо сейчас вы можете создать в Jira/Notion/Trello простой чек‑лист для принятия нового события. Три пункта: «схема имени соблюдена?», «обязательные поля есть?», «протестировано на dev 3 дня?». Без этих галочек — не выпускать.

Шаг 7. Добавьте в события «контекст сделки», а не просто «действие»

Самая частая ошибка после всех предыдущих: событие есть, но оно не связано с воронкой продаж.

Пример:

  • Вы ловите событие file__downloaded_pdf.

  • Но не знаете, к какому продукту относится этот PDF.

  • И не знаете, был ли пользователь уже лидом.

  • И не знаете, какая рекламная кампания привела этого пользователя.

Итог: все, что вы знаете, это что кто‑то что‑то скачал, но продажи от этого не приблизились. Здесь нужен обязательный блок для событий, которые находятся в середине воронки (между первым касанием и сделкой):

{
  "event_name": "file__downloaded_brochure",
  "user_id": "12345",
  "session_id": "sess_67890",
  "context": {
    "product_id": "PROD-42",
    "campaign_source": "google_cpc_summer_sale",
    "current_step": "consideration",
    "lead_id": "LD-100500",
    "is_known_lead": true
  }
}

Эти поля позволяют ответить на вопрос: «А люди, которые скачали брошюру по продукту X из кампании Y, купили потом или нет?» Без этого контекста вы никогда не построите нормальную атрибуцию.

Для начала возьмите три самых частых события в вашей системе (например, просмотр карточки, добавление в корзину, отправка контактной формы). Допишите к ним контекст из примера выше. Увидите, как много не хватает.

Итоговый чек‑лист для внедрения (повесьте над рабочим столом)

Перед тем как сказать разработчику «давай добавим событие», пробегитесь по списку:

  1. Имя — по схеме объект__действие_результат? (да/нет)

  2. Один этап = одно событие? (нет второго события для той же бизнес‑точки)

  3. Обязательные поля — user_id, session_id, timestamp есть?

  4. Защита от дублей — флаг alreadySent стоит?

  5. Отсев ботов — проверка User‑Agent и размера окна есть?

  6. Песочница — сначала на dev, потом в прод?

  7. Контекст сделки — привязано к продукту, кампании, этапу воронки?

Если хотя бы один пункт — НЕТ, событие не принимается.

На этом наш гайд можно с чистой совестью завершить. Да, возможно, он получился и не идеальным, но с его помощью ваша воронка продаж начнет приносить прибыль.

Если в событийной аналитике хаос начинается с Click, send и form_submit_2, то в финансовых моделях — с разрозненных таблиц, ручных сверок и данных, которым никто до конца не доверяет.

На бесплатных уроках OTUS разберем, как перейти от AS IS‑хаоса к TO BE‑контролю: собрать единую автоматизированную финансовую модель, сократить ручные операции и убрать «человеческий фактор» из расчетов.

  • 3 июня в 20:00. «От хаоса к контролю: как построить финансовую модель, которой можно верить». Записаться
    Обсудим, как перестать тратить большую часть времени на сбор данных и сверки, а БДР и ДДС собирать автоматически.

  • 17 июня в 20:00. «Как убрать „человеческий фактор“ из финансовых моделей: от расчёта NPV до сложных систем оплаты труда». Записаться
    Поговорим о том, как построить единую автоматизированную модель, где покупка оборудования, найм специалиста и KPI сотрудников считаются без ошибок и ручных правок.

А если хотите выбрать другое занятие под свои задачи — загляните в календарь открытых уроков.

Больше материалов про IT, аналитику, разработку и обучение — на канале OTUS в MAX. Подписывайтесь, чтобы не пропускать новые статьи, разборы и анонсы открытых уроков.