Короткий ответ
Нужно посчитать число уникальных пользователей с событием "просмотр" и число уникальных пользователей с событием "покупка" среди тех же пользователей (обычно с ограничением по времени от просмотра до покупки), затем разделить второе на первое.
Как это работает подробнее
используем условное агрегирование или EXISTS/JOIN, чтобы связать пользователей, совершивших оба события, и ограничить окно (например, покупка в течение 7 дней после просмотра), иначе в конверсию попадут случайные совпадения, не связанные причинно.
Пример кода
product_metrics.sql
-- PostgreSQL
WITH viewers AS (
SELECT DISTINCT user_id, MIN(event_date) AS view_date
FROM events
WHERE event_type = 'view_product'
GROUP BY user_id
),
buyers AS (
SELECT v.user_id
FROM viewers v
JOIN events e
ON e.user_id = v.user_id
AND e.event_type = 'purchase'
AND e.event_date BETWEEN v.view_date AND v.view_date + 7
)
SELECT
(SELECT COUNT(*) FROM viewers) AS viewed,
(SELECT COUNT(DISTINCT user_id) FROM buyers) AS purchased,
ROUND((SELECT COUNT(DISTINCT user_id) FROM buyers)::numeric /
(SELECT COUNT(*) FROM viewers), 3) AS conversion_rate;Что использовать на практике
- Применение. важно договориться, обязательна ли покупка именно того товара, который просматривали, или любая покупка в принципе — это сильно разные по смыслу метрики.
- Проверка или пример. Проверка: conversion_rate должен быть в (0;1].
Подводные камни
- Частая ошибка. считают конверсию по количеству событий вместо уникальных пользователей; не ограничивают временное окно, из-за чего в конверсию попадают покупки, произошедшие задолго до просмотра и не связанные с ним.