Как настроить Метрику для лендинга iiMinion

Как настроить Метрику для лендинга iiMinion

Лендинг: https://iiminion.ru/personal_ai_staff
Старый URL /personal_ai_assistant редиректит на него.
Активный счётчик Метрики: 109617480.

Задача — понять не только “сколько людей пришло”, но и что они сделали: сколько времени провели, до каких блоков дошли, что читали и где кликнули.

Что уже видно

За 2026-06-15..2026-06-16 по счётчику 109617480:

  • визиты: 41;
  • пользователи: 33;
  • просмотры страниц: 65;
  • средняя длительность визита: около 242 секунд;
  • отказы: около 46%.

Это показывает общий интерес, но не доказывает чтение. Открытая вкладка может выглядеть как длинный визит. Среднее время — тень, не факт.

Что Метрика умеет без доработки

Уже можно смотреть:

  • страницы входа и просмотра;
  • длительность визита;
  • отказы;
  • источники трафика;
  • Вебвизор;
  • карту кликов;
  • карту скроллинга;
  • автоцели: переход в мессенджер и отправка формы.

На странице включены:

webvisor: true,
clickmap: true,
trackLinks: true

Это помогает смотреть сессии глазами: куда человек скроллил, где кликал, как двигался по странице.

Почему нужны отдельные цели

Для Директа важно отличать:

  • случайный клик;
  • визит на 5 секунд;
  • человек дошёл до середины;
  • человек увидел цену;
  • человек дошёл до CTA;
  • человек кликнул Telegram;
  • человек отправил форму.

Без целей реклама оптимизируется почти вслепую. С целями можно смотреть не только CPC, а цену дочитывания, цену клика в Telegram и цену заявки.

Какие цели созданы

В счётчике 109617480 созданы JavaScript event goals.

Скролл

  • scroll_25
  • scroll_50
  • scroll_75
  • scroll_90

Чтение секций

  • read_hero
  • read_problem
  • read_solution
  • read_use_cases
  • read_pricing
  • read_faq
  • read_cta

Событие считается чтением, если секция видна хотя бы на 50% и человек задержался на ней около 3 секунд.

Коммерческие действия

  • click_telegram
  • click_form
  • submit_form

Качественные визиты

  • qualified_visit_30s
  • qualified_visit_60s
  • qualified_visit_120s
  • qualified_visit_scroll_75

Качественный визит — это ещё не покупка, но уже не мусорный клик.

Что нужно добавить на сайт

На важные секции лендинга поставить data-section:

<section data-section="hero">
<section data-section="problem">
<section data-section="solution">
<section data-section="use_cases">
<section data-section="pricing">
<section data-section="faq">
<section data-section="cta">

И добавить JS, который вызывает цели Метрики:

<script>
(function () {
  const counterId = 109617480;
  const fired = new Set();

  function goal(name, params = {}) {
    if (fired.has(name)) return;
    fired.add(name);
    if (typeof ym === 'function') ym(counterId, 'reachGoal', name, params);
    console.log('[metrika goal]', name, params);
  }

  const scrollGoals = [
    { depth: 25, name: 'scroll_25' },
    { depth: 50, name: 'scroll_50' },
    { depth: 75, name: 'scroll_75' },
    { depth: 90, name: 'scroll_90' }
  ];

  function checkScroll() {
    const scrollTop = window.scrollY || document.documentElement.scrollTop;
    const docHeight = document.documentElement.scrollHeight - window.innerHeight;
    if (docHeight <= 0) return;
    const percent = Math.round((scrollTop / docHeight) * 100);

    scrollGoals.forEach(item => {
      if (percent >= item.depth) goal(item.name, { depth: item.depth });
    });

    if (percent >= 75) goal('qualified_visit_scroll_75');
  }

  window.addEventListener('scroll', checkScroll, { passive: true });
  checkScroll();

  setTimeout(() => goal('qualified_visit_30s'), 30000);
  setTimeout(() => goal('qualified_visit_60s'), 60000);
  setTimeout(() => goal('qualified_visit_120s'), 120000);

  const sectionTimers = new Map();
  const observer = new IntersectionObserver(entries => {
    entries.forEach(entry => {
      const section = entry.target.getAttribute('data-section');
      if (!section) return;
      const goalName = 'read_' + section;

      if (entry.isIntersecting && entry.intersectionRatio >= 0.5) {
        if (!sectionTimers.has(section)) {
          const timer = setTimeout(() => goal(goalName, { section }), 3000);
          sectionTimers.set(section, timer);
        }
      } else {
        const timer = sectionTimers.get(section);
        if (timer) clearTimeout(timer);
        sectionTimers.delete(section);
      }
    });
  }, { threshold: [0, 0.5, 0.75] });

  document.querySelectorAll('[data-section]').forEach(el => observer.observe(el));

  document.addEventListener('click', function (event) {
    const el = event.target.closest('a, button');
    if (!el) return;
    const href = el.getAttribute('href') || '';
    const text = (el.innerText || '').toLowerCase();

    if (href.includes('t.me') || href.includes('telegram')) {
      goal('click_telegram', { href });
    }
    if (href.includes('#form') || text.includes('заяв') || text.includes('обсудить')) {
      goal('click_form', { href, text });
    }
  });

  document.addEventListener('submit', function () {
    goal('submit_form');
  });
})();
</script>

Как читать отчёты

Смотреть нужно цепочку:

  1. визит;
  2. qualified_visit_30s / 60s / 120s;
  3. scroll_50 / scroll_75;
  4. read_pricing;
  5. read_cta;
  6. click_telegram / submit_form.

Если кампания даёт дешёвые клики, но не даёт scroll_50 и qualified_visit_30s, это не победа. Это дешёвый шум.

Техническая заметка по API

Для JavaScript event goals рабочий payload:

{
  "goal": {
    "name": "Скролл 75%",
    "type": "action",
    "conditions": [{ "type": "exact", "url": "scroll_75" }]
  }
}

Метрика принимает type: "action" как тип цели, но условие для события сработало как type: "exact", где url равен имени события из ym(..., 'reachGoal', eventName).

Итог

Счётчик 109617480 уже получил цели. Осталось встроить JS-события на страницу. После этого можно строить ежедневный отчёт по качеству трафика из Директа: не “клики были”, а “люди читали, дошли до CTA и сделали действие”.