0% прочитано

Клік ще не означає успішну дію: коли записувати аналітичну подію

Клік по кнопці "Копіювати посилання" показує намір користувача, але не доводить, що посилання справді потрапило до буфера обміну. Якщо дія може завершитися помилкою, подію успіху варто записувати лише після фактичного завершення операції.

26 жовтня 2026 р. 8 хв читанняФронтенд

Кнопка натиснута. Обробник події запустився. Здається логічним одразу збільшити лічильник.

Але якщо користувач натиснув "Копіювати посилання", а navigator.clipboard.writeText() завершився помилкою, посилання не було скопійоване.

Тобто клік відбувся, але успішна дія - ні.

Намір користувача і фактичний результат - це дві різні речі, і аналітика має їх розрізняти.

Якщо дія може завершитися помилкою, подію успіху потрібно записувати після підтвердженого результату, а не одразу після кліку.

Клік показує намір, але не підтверджує результат

Клік відповідає на запитання: користувач намагався виконати дію?

Якщо ж показник має означати успішне копіювання, збереження, завантаження або надсилання, одного кліку недостатньо.

Між натисканням кнопки та результатом може бути асинхронна операція, яка завершується успіхом або помилкою.

Межа фактичного успіху
клік  |  vспроба виконати дію  |  +--> успіх --> записати подію успіху  |  +--> помилка --> не рахувати успіх

Типова помилка: записувати подію занадто рано

Подія записується до підтвердження копіювання
async function copyLink(url) {    track('copy_link');     await navigator.clipboard.writeText(url);}

У цьому варіанті copy_link записується ще до того, як браузер підтвердив копіювання.

Якщо writeText() завершиться помилкою, аналітика вже міститиме успішну дію, якої насправді не було.

У результаті показник поступово починає рахувати спроби, хоча його назва створює враження, що він рахує успішні копіювання.

Подію успіху потрібно записувати після завершення операції

Окремі події для успіху та помилки
async function copyLink(url) {    try {        await navigator.clipboard.writeText(url);         track('copy_link_succeeded');    } catch (error) {        track('copy_link_failed');    }}

Тепер copy_link_succeeded з’являється лише після успішного завершення writeText().

Помилку можна рахувати окремо, якщо це потрібно для технічного спостереження.

Головне - не змішувати спробу, успіх і помилку в один показник.

Повідомлення користувачу має підкорятися тій самій межі

Підтвердження лише після фактичного успіху
async function copyLink(url) {    try {        await navigator.clipboard.writeText(url);         track('copy_link_succeeded');        showToast('Посилання скопійовано');    } catch (error) {        showToast('Не вдалося скопіювати посилання');    }}

Якщо інтерфейс показує "Посилання скопійовано" до завершення операції, користувач може отримати підтвердження дії, яка не відбулася.

Тому повідомлення в інтерфейсі та аналітична подія успіху мають спиратися на той самий підтверджений результат.

Назва події має відповідати тому, що ми реально вимірюємо

Три різні факти - три різні події
copy_link_clickedcopy_link_succeededcopy_link_failed

copy_link_clicked означає, що користувач натиснув кнопку.

copy_link_succeeded означає, що посилання справді записане в буфер обміну.

copy_link_failed означає, що спроба завершилася помилкою.

Ці значення можуть бути близькими, але вони відповідають на різні запитання.

Успішне копіювання ще не доводить фактичного поширення

Якщо показник SHARES збільшується після кнопки "Копіювати посилання", щонайменше потрібно дочекатися успішного запису в буфер обміну.

Але навіть після цього ми знаємо лише, що посилання скопійоване. Ми ще не знаємо, чи користувач справді комусь його надіслав.

Цю різницю я окремо розбираю в окремому матеріалі про дію поширення та перехід за поширеним посиланням.

Та сама логіка корисна для інших дій, де результат може відрізнятися від наміру:

  • збереження форми;
  • завантаження файла;
  • надсилання повідомлення;
  • створення платежу;
  • додавання в закладки;
  • зміна налаштувань.

Якщо операція може завершитися помилкою, подію успіху потрібно прив’язувати до підтвердженого результату.

Негативний тест тут не менш важливий за позитивний

Мінімальний набір перевірок
1. Клік запускає спробу копіювання.2. Успішний writeText() записує подію успіху.3. Помилка writeText() не записує подію успіху.4. Повідомлення "скопійовано" з'являється лише після успіху.5. Помилка має окреме повідомлення.

Позитивний тест доводить, що подія записується після успіху.

Негативний тест доводить не менш важливу річ: система не рахує успішною дію, яка завершилася помилкою.

Аналітика має описувати факт, а не припущення

Клік - це факт. Спроба виконати дію - теж факт. Успішне завершення - окремий факт.

Проблема починається тоді, коли одна подія називається так, ніби вона означає іншу.

Якщо показник говорить "посилання скопійовано", він повинен з’явитися після успішного копіювання. Якщо показник говорить "кнопку натиснуто", його можна записати одразу.

Хороша аналітика починається з точного визначення моменту, коли вимірювана дія справді відбулася.

Не рахуй намір як результат. Подію успіху записуй там, де успіх уже підтверджений.