Воронка показывает странный путь: сначала клиент оплатил заказ, потом положил товар в корзину и только затем открыл карточку. Иногда пользователь действительно действует нестандартно. Но часто система просто получила события с разной задержкой.

У события есть как минимум два времени: когда действие произошло и когда запись дошла до принимающей системы. Первое называют временем события, второе — временем получения. Очереди, офлайн-режим приложения и повторные отправки могут менять порядок поступления, не меняя реального поведения клиента.

Документация Apache Beam различает время события и время обработки, а также описывает опоздавшие данные и водяные знаки — оценки продвижения потока по времени событий. Такая оценка помогает организовать обработку, но не превращает все будущие опоздания в невозможные.

Сначала восстановите факты

Условный пример. Сервер заказа работает быстро, а приложение передало накопленные события позже.

ДействиеВремя событияВремя получения
Просмотр товара10:0010:08
Добавление в корзину10:0210:03
Покупка10:0410:05

По времени получения просмотр окажется последним. По времени события последовательность нормальная. Поэтому одной сортировки по колонке загрузки недостаточно для поведенческой воронки.

Но и клиентским часам нельзя доверять без проверки. На устройстве может быть неправильная дата. Сохраните исходное время, время получения, источник и выбранное нормализованное время. Если достоверный порядок восстановить нельзя, пометьте неопределённость, а не «исправляйте» события под желаемую воронку.

Опишите правила последовательности

Решите, что означает пройти шаг. Нужен ли просмотр именно купленного SKU? Должны ли корзина и оплата относиться к одному заказу? Разрешён ли переход между устройствами? Какой максимальный интервал между шагами?

Связь только по клиенту может соединить просмотр одного товара в понедельник с покупкой другого через месяц. Связь только по сессии, наоборот, потеряет реальный путь через несколько визитов. Оба подхода допустимы для разных вопросов, но результаты нельзя считать взаимозаменяемыми.

При одинаковых временных метках дополнительный технический ID делает сортировку воспроизводимой, однако не доказывает причинный порядок действий. Если важна строгая последовательность, потребуется более точное время или номер события, который корректно задаёт сам источник.

Уберите повторы без потери настоящих действий

Повторная доставка одного события не равна повторному действию. Для устранения дублей используйте устойчивый event_id или документированную комбинацию полей. При этом два настоящих добавления товара нельзя склеивать только потому, что они произошли в одну минуту.

Для заказа полезны отдельный order_id и версия статуса. Создание, оплата и возврат — разные события одного объекта. Сумма всех строк с этим ID не является числом заказов.

КонтрольЗачем нужен
Разница времени получения и событияИзмерить задержку по источникам
Дубли event_idОбнаружить повторную доставку
События из будущегоНайти неверные часы или преобразование зоны
Отсутствующий предыдущий шагРазличить реальный пропуск и недозагрузку
Изменение после пересчётаПонять, насколько ранняя воронка нестабильна

Разделите оперативный и итоговый отчёт

Оперативная воронка помогает заметить сбой сегодня, но может быть неполной. Итоговая строится после согласованного периода ожидания и учитывает поздние события. Срок выбирают по измеренной задержке конкретных источников и цене ожидания, а не по универсальному правилу «сутки достаточно».

Запишите, какие интервалы пересчитываются автоматически, когда сохраняется версия результата и как обрабатываются ещё более поздние данные. Для сравнения периодов используйте одинаковую степень готовности данных: вчерашний незавершённый поток нельзя напрямую сравнивать с окончательно пересчитанной прошлой неделей.

Что делать с триггерами

Аналитический пересчёт не отменяет уже отправленное письмо о брошенной корзине. Поэтому перед действием с высокой ценой ошибки полезно проверить актуальное состояние заказа в надёжном источнике и использовать установленную задержку ожидания.

После восстановления потока нельзя бездумно проиграть всю очередь заново: клиент может получить устаревшие сообщения. Нужны срок актуальности события и защита от повторного исполнения.

Исправленная последовательность повышает качество описания пути. Она не доказывает, что просмотр или письмо вызвали покупку. Для оценки влияния коммуникации по-прежнему нужен подходящий экспериментальный дизайн.

Источники

Apache Software Foundation. Watermarks and Late Data. Apache Beam Programming Guide, раздел 8.4. Проверено 22.09.2026.