# Події, властивості й користувачі

> Мова продуктових даних: що записує подія і чим властивості події відрізняються від властивостей користувача.

- Курс: [Продуктова аналітика: від даних до рішень](https://productovi.com/uk/courses/product-analytics.md)
- Модуль: Що саме ми вимірюємо?
- Урок 1/32, ~28 хв
- Джерело: https://productovi.com/uk/courses/product-analytics/events-properties-users

## Де ти працюєш

**Alex Tutor:** Вітаю на курсі. Уяви **Halves** — невеликий застосунок, який ділить рахунки між сусідами по квартирі, парами та компаніями в подорожі. Є безкоштовна версія і платний тариф Halves Plus. Тебе щойно взяли до її продуктової команди.

**Alex Tutor:** Maya, яка керує продуктом, і Theo, маркетолог зростання, приноситимуть тобі справжні питання, а ти відповідатимеш на них даними застосунку. Починаємо з основ: сьогодні розберемо, що насправді каже один рядок сирого логу подій.

![Троє сусідів по квартирі за кухонним столом ділять довгий паперовий чек, розірваний на рівні смужки; один із них тримає телефон.](https://productovi.com/courses/product-analytics/inline/events-properties-users-illustration-2.webp)

*Halves живе в таких моментах: спільний рахунок і компанія, яка хоче поділити його чесно.*

## Що каже один рядок

**Maya:** Розробники надіслали сирий експорт за минулий тиждень: 147 рядків, у яких я нічого не розумію. Що там узагалі є?

**Sofia:** Кожен рядок починається з часу, id користувача і слова на кшталт `app_opened`. Тобто рядок — це одна дія людини?

**Alex Tutor:** Майже. Кожен рядок — це **подія (event)**: запис про те, що щось сталося. Вона відповідає на питання **хто** (`user_id`), **що** (`event`) і **коли** (`event_time`, в UTC). Решта колонок — подробиці.

**Набір даних (CSV):** [Тринадцять рядків із логу подій Halves, 1–4 червня](https://productovi.com/datasets/product-analytics/events-properties-users/halves-events-excerpt.csv)

Кілька рядків, вибраних з експорту за минулий тиждень, у порядку часу. Час в UTC.

- `event_time`: Коли це сталося, в UTC
- `user_id`: Хто: акаунт у Halves
- `event`: Що сталося
- `platform`: Де записано подію: ios, android або server
- `entry_method`: Лише для expense_added: manual, receipt_scan або recurring
- `amount_usd`: Сума в доларах США для витрат і розрахунків
- `settlement_id`: Лише для settle_up_recorded: до якого розрахунку належить рядок

**Alex Tutor:** Рядок 4: через дві хвилини після відкриття застосунку u007 додав витрату на 116 дол., відсканувавши чек.

**Sofia:** А `entry_method` і `amount_usd` — це й є подробиці?

**Alex Tutor:** Так, **властивості події (event property)**. Вони описують саме цей момент. Наступна витрата тієї самої людини може мати іншу суму й інший спосіб.

![Один паперовий чек, приколотий до коркової дошки, до нього прикріплені маленька фігурка людини, крихітний годинник і бирка.](https://productovi.com/courses/product-analytics/inline/events-properties-users-illustration-3.webp)

*Одна подія: хто, що й коли, плюс подробиці, які описують лише цей момент.*

> **Вправа:** Прочитай рядок 10 з уривка: `2026-06-04T18:12:00Z, u020, expense_added, android, manual, 91`. Що він записує?

## Властивості події та властивості користувача

**Sofia:** У файлі користувачів теж є колонки: `signup_date`, `acquisition_channel`, `timezone`. Це також властивості подій?

**Alex Tutor:** Ні, це **властивості користувача (user property)**. Вони описують людину, а не момент, тому однакові для всіх її подій.

**Набір даних (CSV):** [Ті самі шість людей у файлі користувачів](https://productovi.com/datasets/product-analytics/events-properties-users/halves-users-excerpt.csv)

Один рядок на людину. Ці значення не змінюються від події до події.

- `user_id`: Акаунт у Halves
- `signup_date`: Дата створення акаунта
- `platform`: Платформа телефона користувача: ios або android
- `acquisition_channel`: Звідки користувач прийшов у Halves
- `timezone`: Домашній часовий пояс користувача
- `is_internal`: true для акаунта команди, false для клієнта

**Alex Tutor:** Швидкий тест: чи може значення відрізнятися у двох подій з різницею в хвилину? Сума витрати — може. Канал, з якого людина прийшла, — ні.

**Theo:** Хочу знати, чи люди з платних соцмереж додають більше витрат, ніж запрошені. Де шукати відповідь?

**Alex Tutor:** В обох файлах. Беремо події `expense_added`, для кожного `user_id` шукаємо рядок у файлі користувачів і групуємо за `acquisition_channel`. Властивості події кажуть, що сталося, а властивості користувача розбивають це за тим, хто.

![Властивості події описують один момент і змінюються від події до події, властивості користувача описують людину. Знайди user_id, щоб розбити те, що сталося, за тим, хто.](https://productovi.com/courses/product-analytics/diagrams/m1-l1-event-vs-user-properties-uk.png)

*Об'єднай два файли за user_id, щоб розбити події за тим, хто їх зробив.*

> **Вправа:** Які з цих колонок — **властивості користувача**, а не властивості події?

**Alex Tutor:** Ще одна перевірка щодо запитання Theo, перш ніж іти далі: де має жити канал реєстрації?

> **Вправа:** **Правда чи ні:** щоб розбити події `expense_added` за каналом залучення, кожна подія `expense_added` має містити `acquisition_channel` як властивість події.

## Що варто робити подією

**Sofia:** А Halves Plus теж може бути подією? Щось на кшталт `user_is_premium`?

**Alex Tutor:** Бути на Plus — це стан, тобто властивість користувача. А *почати* тріал — це мить, тобто подія.

**Alex Tutor:** Події називають за схемою «об'єкт + дія в минулому часі»: `expense_added`, `group_created`, одна назва на всіх платформах. Якщо Android пише `addExpense`, кожен звіт покаже дві половинки одного числа.

**Sofia:** А екрани? «Показано екран балансів» — теж подія?

**Alex Tutor:** Лише якщо цього потребує якесь питання. Записують дії, від яких залежить рішення, а не кожен дотик: кожна подія мусить лишатися правильною в кожному релізі.

> **Вправа:** Що з цього Halves варто записувати як **події**?

**Alex Tutor:** Повернімося до Halves Plus. Двоє розробників запропонували два способи це записувати. Який із них тримає дані чесними?

> **Вправа:** Maya хоче знати, хто користується Halves Plus і коли люди починають тріал. Який варіант ти обереш?

## Хто записав: застосунок чи сервер

**Sofia:** Рядок 1 дивний. У u001 витрата на 420 дол. о 06:00 UTC, а платформа — `server`.

**Alex Tutor:** Бачиш `entry_method = recurring`? Передплатники Plus можуть зробити рахунок регулярним, як-от оренду, і сервер додає його за розкладом. Власник u001 у цей час міг спати.

**Alex Tutor:** Це **серверна подія (server-side event)**: її записує бекенд, а не застосунок. Вона не губиться, коли телефон офлайн, але може статися без жодної дії людини.

![Уночі невелика серверна шафа надсилає чек за оренду в телефон на тумбочці, поки його власник спить.](https://productovi.com/courses/product-analytics/inline/events-properties-users-illustration-4.webp)

*Серверна подія записується за розкладом, навіть коли застосунку ніхто не торкається.*

**Alex Tutor:** Із подіями застосунку навпаки: це справжні дії, але телефон без зв'язку може надіслати їх пізніше.

**Maya:** Тобто якщо я порахую «людей, які додали витрату», u001 туди потрапить?

**Alex Tutor:** Якщо рахувати рядки — так. Це виправимо в наступному уроці. А поки що до кожного рядка варто питати: хто або що його спричинило?

> **Вправа:** **Правда чи ні:** рядок з `event = expense_added`, `platform = server` і `entry_method = recurring` показує, що користувач відкрив Halves і додав витрату.

**Alex Tutor:** Тепер порахуй, тримаючи це запитання в голові: хто в уривку справді щось зробив сам?

> **Вправа:** Скільки **різних користувачів** у 13-рядковому уривку мають хоча б одну подію, записану застосунком (платформа `ios` або `android`, а не `server`)?

## Один платіж, два рядки

**Sofia:** І ще: `s004` є двічі, від u013 і від u014, обидва рази на 185 дол. Вони заплатили одне одному?

**Alex Tutor:** Ні, це один платіж. Той, хто платить, записує розрахунок, а коли друга людина його підтверджує, її телефон записує подію ще раз. Той самий `settlement_id`, два рядки.

**Alex Tutor:** Лог правильний. Але на питання «скільки було розрахунків?» відповідають id, а не рядки.

**Sofia:** Виходить, щоб читати лог, треба знати, як працює продукт, а не лише назви колонок.

**Alex Tutor:** Саме так. Для кожної події варто записати, хто її запускає, де вона записується і які властивості несе. З такого списку починається **план трекінгу (tracking plan)**, і наприкінці модуля ти складеш власний.

> **Вправа:** В уривку три рядки `settle_up_recorded`. Скільки розрахунків (платежів) вони описують?

## Твоя черга: спроєктуй подію

**Maya:** Наступного місяця сканування чеків саме ділитиме рахунок між людьми. Я захочу знати, як часто вечері ділять саме так. Що записувати?

**Sofia:** `expense_added` з `entry_method = receipt_scan` і ще щось про поділ?

**Alex Tutor:** Добрий початок. Залиш наявну подію замість нової `dinner_scanned` і додай властивості для наступних питань Maya: скільки людей, як поділено, у якій групі.

**Alex Tutor:** Для кожної подробиці виріши: вона описує цей момент чи людину? Подробиці про людину вже є у файлі користувачів.

> **Вправа:** Хтось у групі для подорожі сканує в Halves чек за вечерю на 120 дол. і ділить його порівну на 4 людей. Назви подію, яка має це записати, і перелічи її властивості. Для кожної властивості вкажи, чи це властивість події, чи властивість користувача, і чому.

> **Головне**
>
> - **Подія** записує, хто, що і коли, плюс властивості.
> - **Властивості події** описують один момент (сума, спосіб внесення); **властивості користувача** описують людину (дата реєстрації, канал, часовий пояс) і підтягуються з таблиці користувачів.
> - Стан (бути на Plus) — це властивість; зміна стану (початок тріалу) — подія.
> - **Серверні події** можуть статися без участі людини; події із застосунку фіксують справжні дії, але можуть надходити із запізненням.
> - Одна дія може залишити кілька рядків: розрахунок записують обидві сторони під одним `settlement_id`.

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

- Наступний урок: [Загальна кількість, унікальні користувачі й пастки підрахунку](https://productovi.com/uk/courses/product-analytics/counting-traps.md)

---
Productovi Learning. Безкоштовно, читати можна без реєстрації.
