Торговые события #40
Notifications
Due Date
No due date set.
Blocks
Depends on
#41 Сериализатор, приёмники и проигрыватель с CLI
ddmitry/clickstream-data-platform
#39 День-функция: трафик, сессии, pageview
ddmitry/clickstream-data-platform
Reference: ddmitry/clickstream-data-platform#40
Reference in New Issue
Block a user
Part of #4.
Цель
День-функция, часть вторая: таксономия торговых событий.
add_to_cartиpurchaseвплетаются в сессии, появляется каталог товаров — клиентскаясторона становится целой: широкое событие, таксономия, анонимность, N:1.
Что войдёт
add_to_cart: массивыproduct*с одним товаром;GoalsReached(две цели: корзина и покупка — цели дублируют события, это нормально).
purchase: состав заказа, блокpurchase*, ровно один элемент вpurchaseID; сырой JSONecommerce, как отдаёт Метрика.клиентском
purchase(урок о расхождениях).с каждой куки.
ClientID, никаких email и user_id.Критерии приёмки
purchaseмассивpurchaseIDнесёт ровно один элемент (тест).представлении (тест).
product*одной длины;ecommerce— валидный JSON,согласованный с массивами (тест).
подпотока не сдвигает трафиковый (иерархия подпотоков, тест).
Границы
orders) — этап 3.честная, без потерь и дублей; структура подпотоков лишь не должна им
мешать.
Сначала прочитать
3, 4, 5.
data/catalog/products.csvприходит готовым из #39, здесь он толькочитается.
Проверка
make testТорговые события и каталог товаровto Торговые событияРешения перед реализацией приняты в грилинге 2026-08-02 и записаны в спеку генератора, раздел 9 (блок «Решено при исполнении #40»). Здесь — только то, что меняет постановку тикета.
Выход за исходные границы. Метка «покупатель» из плана состава до сих пор ни на что не влияла: кто купит, решал одинаковый для всех бросок в дне. Решено сделать её значимой — помеченный доходит до заказа заметно чаще прочих. Воронка живёт в коде #39, поэтому #40 её правит и сдвигает трафиковый поток. Сейчас это ничего не стоит: манифест ещё не собран (#42).
Что добавилось к составу работы:
order_idбэкенда;purchaseRevenue;orjsonпоявляется здесь, а не в #41: сыройecommerceсобирает канонический сериализатор.Критерии приёмки прирастают тремя:
Хвосты соседним этапам (записаны в раздел 8 спеки): заказу с промокодом бэкенд обязан дать скидку (этап 3); расхождение сумм само не появится — цены каталога кратны рублю,
Float64не плывёт, классamount_deltaпридётся создавать намеренно (этап 4).Ветка задачи:
feat/40-trade-events.Холодное ревью первой редакции решений нашло две дыры уровня решений. Обе закрыты, спека переписана — читать раздел 9, блок «Решено при исполнении #40». Здесь только то, что меняет постановку против предыдущего комментария.
1. Метка покупателя получает второй рычаг. Одного лифта конверсии мало: метки в событии нет (кликстрим анонимен), а кука живёт меньше двух визитов за снимок — второй покупке негде случиться. Лифт поднял бы долю кук с двумя покупками с 2% до 6%, и «постоянный покупатель» так и не появился бы. Поэтому помеченные ещё и дольше живут и чаще возвращаются — это правка плана состава (#38), а не только воронки (#39).
2. Копейки в части цен каталога. Сейчас все 180 цен кратны рублю, поэтому копеечная дисциплина существует лишь на словах, а урок про Float64 беспредметен. Часть цен получает копейки:
productPriceокругляется самим форматом,purchaseRevenueнесёт точную сумму. Правкаdata/catalog/products.csv— файл заведён в #39.Границы работы, итог. Тикет правит три чужих участка: план состава (#38), воронку (#39) и каталог (#39). Манифест ещё не собран (#42), поэтому сдвиг потока сейчас ничего не стоит.
Критерии приёмки — замена. Предыдущий комментарий предлагал «общее число покупок и доля визитов с корзиной не сдвинулись». Он больше не годится: аудитория намеренно подрастёт. Вместо него:
База до правок, средний день канонического мира: аудитория 6 710, визитов 9 249, событий 44 436, визитов с корзиной 780 (8,4%), с покупкой 221 (2,4%). После правок числа состава мира в спеке перемеряются и переписываются.
Оговорка к исходному критерию. «Счётчики покупок и двухкуковых пар сходятся с планом состава» — счётчика покупок в плане нет (
PlanCounters), и раздел 1 спеки прямо говорит, что торговые счётчики появятся только здесь. Сходятся пары; счётчик покупок либо заводится в плане этим тикетом, либо критерий читается про пары.Работа выполнена в ветке
feat/40-trade-events, тесты 353 → 383,make lintи
make typecheckзелёные.Перемеренные числа канонического мира: аудитория 6 637–7 595 (в среднем
7 166), визитов 9 879, событий 49 509, визитов с корзиной 765 (7,7%), с
покупкой 240 (2,4%), пар в горизонте 192 — все три вилки раздела 5
выдержаны.
Два слепых ревью дали 9 находок (2 MAJOR, 5 MINOR, 2 NIT), все закрыты,
перепроверки обеих линий — ALL_CLOSED.
Из находок стоит назвать две: полночь могла срезать покупку, оставив
страницу подтверждения, — теперь граница суток забирает подтверждение
вместе с его покупкой; и четыре сторожа, проходивших при подмене
проверяемого, — усилены мутантами.
Решения, записанные в спеку §9 этим тикетом: счётчик покупок в план не
заводится (сверяются пары),
CART_PERCENTопущен с 8 до 6 какединственное число мира вне двух рычагов, резерв суток под торговый
хвост.