Раздел 42 · Аналитика данных с нуля

Маркетинговая атрибуция: UTM, first touch, last touch и линейная модель

middle~20 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Мира · маркетолог магазина настолок «Кубик»

Отчёт сайта говорит, что треть выручки приносят «прямые заходы», а ВКонтакте почти ничего. Директор хочет урезать соцсети. Но я же вижу, что люди приходят к нам из соцсетей! Кто приводит покупателей?

Мы снова в «Кубике», где уже искали лучших клиентов в боссе блока D и делили их на сегменты в уроке про RFM. Тогда мы смотрели на заказы. Сегодня посмотрим на то, что было до заказа: откуда человек пришёл на сайт и сколько раз заходил, прежде чем купить.

Один заказ, четыре визита

Клиент 2858 купил в марте настолок на 11 030 ₽. Перед этим он заходил на сайт ещё трижды:

SELECT t.id, t.visited_at, t.utm_source, t.utm_medium, t.utm_campaign, t.order_id
FROM visits c
JOIN visits t ON t.customer_id = c.customer_id
 AND t.visited_at BETWEEN c.visited_at - interval '14 days' AND c.visited_at
WHERE c.order_id = 4893
ORDER BY t.visited_at;
  id   |       visited_at       | utm_source | utm_medium | utm_campaign | order_id
-------+------------------------+------------+------------+--------------+----------
 14451 | 2026-03-04 22:47:53+00 | vk         | social     | NULL         |     NULL
 14562 | 2026-03-07 16:47:53+00 | newsletter | email      | digest-16    |     NULL
 14617 | 2026-03-08 21:47:53+00 | newsletter | email      | digest-6     |     NULL
 14765 | 2026-03-11 16:12:53+00 | NULL       | NULL       | NULL         |     4893

4 марта он увидел пост ВКонтакте и посмотрел каталог. 7 и 8 марта открыл два письма рассылки. 11 марта набрал адрес сайта сам и оформил заказ. Кто заработал эти 11 030 ₽: ВКонтакте, рассылка или «прямой заход»?

Ответ зависит от договорённости, и эта договорённость называется моделью атрибуции. Разберём четыре модели и посмотрим, как от выбора модели меняется ответ Мире.

Откуда сайт знает источник

Ссылку в посте или письме маркетолог размечает метками в адресе:

https://kubik.shop/catalog?utm_source=newsletter&utm_medium=email&utm_campaign=digest-6

Это UTM-метки. Их три главные:

  • utm_source: площадка, откуда пришли. yandex, vk, newsletter, ozon;
  • utm_medium: тип канала. cpc (платная реклама), organic (поиск без рекламы), email, social, marketplace;
  • utm_campaign: конкретная кампания. Номер письма digest-6 или промокод welcome10.

Сайт записывает метки вместе с визитом в таблицу visits. Один визит это одно посещение сайта, то есть сессия. Визиты с метками и без перед заказом называют касаниями. У визита, на котором клиент оформил заказ, заполнен order_id: это закрывающий визит. Он есть у каждого заказа.

Если человек набрал адрес сам или открыл закладку, меток нет: utm_source пуст. Это прямой заход. Таких визитов 5672 из 19 361.

SELECT coalesce(utm_source, 'direct') AS source, utm_medium, count(*) AS visits
FROM visits
GROUP BY 1, 2
ORDER BY visits DESC;

Окно касаний

Сначала договоримся, какие визиты вообще считаются причастными к заказу. Пост, который клиент видел год назад, вряд ли привёл сегодняшнюю покупку. Берём окно: визиты того же клиента за 14 дней до закрывающего визита, включая его самого. Это обычное соединение таблицы с собой из урока 27: c это закрывающий визит, t все визиты-касания.

Выручку заказа считаем как в боссе блока D: сумма qty * price по позициям, без отменённых заказов. Позиции сначала сворачиваем в строку на заказ, иначе получим размножение строк из урока 26:

WITH order_revenue AS (
  SELECT o.id, sum(i.qty * i.price) AS revenue
  FROM orders o
  JOIN order_items i ON i.order_id = o.id
  WHERE o.status <> 'cancelled'
  GROUP BY o.id
), touches AS (
  SELECT c.order_id, r.revenue, t.id, t.visited_at,
         coalesce(t.utm_source, 'direct') AS source
  FROM visits c
  JOIN order_revenue r ON r.id = c.order_id
  JOIN visits t ON t.customer_id = c.customer_id
   AND t.visited_at BETWEEN c.visited_at - interval '14 days' AND c.visited_at
)
SELECT count(DISTINCT order_id) AS orders, round(count(*)::numeric / count(DISTINCT order_id), 2) AS touches_per_order
FROM touches;

6191 заказ, в среднем 2,6 касания на заказ. Только у 1471 заказа касание одно, закрывающий визит. У остальных путь из двух-восьми визитов, и заслугу надо как-то делить.

урок из курса

Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.