Данные и окно — одни и те же (snapshot 29.06, 12.06→28.06). Переключатель меняет только способ оценки тех же биномиальных метрик.
Вердикт (01.07, пересчёт с антифродом)
Победителя нет. После пересчёта с is_fraud=0 + дедупом реальная оплата — паритет:
- Intent-воронка (PostHog): ничья, все шаги n.s. (p>0.6). Чекаут-намерение точечно чуть выше у value-first (+0.3 п.п.), но шум.
- Реальная оплата буста (ClickHouse, mart L3, is_fraud=0 + дедуп по transaction_id, арм↔покупка по backend uid): паритет с лёгким креном к price-first (control) — CR Маркет→оплата 2.30% vs 2.02% (+0.27 п.п. в пользу control), $1100.84 vs $880.09. Направление слабое, при n=119/101 не значимо (p=0.34). Прежние 2.48/1.69% и n=24/33 были на нечищеных данных — сняты.
- Retention guardrail (PostHog, единая когорта рег 12–13.06, одна база): value-first ниже контроля на D1/D2/D3 (~−2 п.п. каждый день), но ни один день не значим (p>0.08, n≈0.9K/арм). Прежний «D2 значимо» снят — был артефактом несопоставимых когорт (тенурный control из канареечной раскатки 100% c 05.06). Кривая теперь монотонна. Флаг «следить», не деградация.
Итого: на очищенных данных (is_fraud=0 + дедуп) гипотеза «ценность раньше цены → больше покупок»
не подтверждается — реальная оплата в паритете (n.s., p=0.34), слабый крен к price-first. Параллельно — guardrail по удержанию (направление вниз, незначимо). Решение — дозреть, монетизация ещё набирает n.
Выборка control
4 879
uniq в Маркете за окно
Выборка value-first
4 798
uniq в Маркете за окно
CR Маркет→реальная оплата
2.30% / 2.02%
control / value-first · CH, фиат, is_fraud=0
Лидер по оплате
price-first
+0.27 п.п. CR, n.s. (p=0.341)
Воронка покупки буста по армам (uniq person_id, строгий порядок шагов)
● Control — price-first (сначала цена)
● Value-first (сначала заработок)
Конверсия шаг-к-шагу и дельта между армами
| Шаг | Control | value-first |
CR ctrl | CR vf | Δ абс (п.п.) | z | p | значимость |
База конверсии — uniq(person_id) на шаге «Зашёл в Маркет». CR ст.→ст. указан в воронках слева. Δ абс (в процентных пунктах) и p-value — для конверсии шага от Market_Appear (2-proportion z-test, two-sided).
Конверсия Маркет → чекаут-интент по дням
Воронка по шагам (% от Маркета)
Покупки бустов по армам реальная оплата · ClickHouse
Что это
PostHog даёт только намерение (Checkout_Buy_Tap). Здесь — реально оплаченные бусты из ClickHouse
(mart DevEvents.L3_doppy_fct_marketplace_purchases, is_glasses_purchase=1, price_fiat>0). ПЕРЕСЧЁТ 01.07 с антифродом: is_fraud=0 + дедуп по transaction_id (dup_ratio ~2.5x даже внутри is_fraud=0). Арм берётся из PostHog (флаг ANDROID_GLASSES_OFFER_VALUE_FIRST_ENABLED), мапится на backend uid (distinct_id=mongo user_id) и джойнится с покупками. Из 221 очищенного плательщика буста арм несут 220 (1 unattributed).
По реальной оплате price-first (control) слабо впереди (CR 2.30% vs 2.02%, +0.27 п.п.), но при n=119 vs 101 это НЕ значимо (p=0.34).
| Метрика | Control (price-first) | value-first | Δ абс | z | p | значимость |
| Зашли в Маркет (база, матчимые uid) | 5 183 | 4 996 | — | — | — | |
| Уник. плательщики буста (фиат, is_fraud=0) | 119 | 101 | −18 | — | — | |
| Кол-во фиат-покупок буста (дедуп tx_id) | 126 | 104 | −22 | — | — | |
| Выручка, $ (USD-эквив.) | $1100.84 | $880.09 | −$220.75 | — | — | |
| CR Маркет → купил буст фиатом | 2.30% | 2.02% | −0.27 п.п. | -0.95 | 0.341 | n.s. |
| Выручка на 1 зашедшего в Маркет | $0.212 | $0.176 | −$0.036 | — | — | |
Оговорки.
(1) Антифрод (ПЕРЕСЧЁТ 01.07): is_fraud=0 + дедуп по transaction_id — в сырье mart ~2.5x дублей строк даже после отсева фрода. Прежние цифры (262/256 плательщиков, $1923/$1871, CR 5.95%) собраны без явного is_fraud=0 и внутренне противоречивы — заменены. Фиат-only: price_fiat>0, internal $DOPPY не считается.
(2) Покрытие арм-джойна: из 221 очищенного фиат-плательщика буста 220 несут арм (1 pre-Identify/вне эксперимента). Знаменатель CR — уник. Market_Appear-reachers с известным armом (5 183 / 4 996).
(3) Малый n: 119 vs 101 плательщик. Направление слабо в пользу price-first (control), p=0.34 — значимости нет. Дозреет с накоплением трафика.
(4) Окно покупок = 12–29.06 (полные дни, paygate settled).
Retention D1–D3 по армам strict day-N · PostHog
Что это — ЕДИНАЯ фиксированная когорта (исправлено 17.06)
Методология переделана. Прежняя версия считала D1/D2/D3 на разных сужающихся окнах и брала «первый день попадания в арм за окно» — что подмешивало в control тенурных юзеров (флаг у control раскатан 100% с 05.06, у value-first — канарейка до 11.06). Их кламповало как «свежие», завышая retention контроля; кривая выходила немонотонной (D3>D2), а D2 ложно-значимым.
Теперь: одна когорта = юзеры, чей первый в истории показ флага пришёлся на 12.06–27.06 (сбалансированное окно 50/50, без канарейки/тенурных), и НЕ экспонированы до 12.06. Один знаменатель на все дни (день+3=30.06 полностью дозрел на 01.07). Активность = Session_Start по person_id, strict day-N.
| Метрика | Control | value-first | Δ абс (п.п.) | z | p | значимость |
| D1 | 22.3% (1174/5273) | 21.3% (1108/5198) | −0.9 п.п. | -1.18 | 0.240 | n.s. |
| D2 | 15.7% (830/5273) | 14.6% (760/5198) | −1.1 п.п. | -1.60 | 0.110 | n.s. |
| D3 | 12.5% (657/5273) | 11.8% (612/5198) | −0.7 п.п. | -1.08 | 0.282 | n.s. |
Кривая монотонна (как и должно на одной когорте): control 22.3% ≥ 15.7% ≥ 12.5%; value-first 21.3% ≥ 14.6% ≥ 11.8%. База D1=D2=D3 = 5 273 / 5 198 на арм — одна и та же.
Оговорки.
(1) Направление — вниз, но НЕ значимо ни на одном дне. value-first ниже контроля на D1/D2/D3 (−0.9 / −1.1 / −0.7 п.п.), но при n=5 273/5 198 все p>0.11. Прежний «D2 значимо p=0.019» был артефактом раздутых баз (window-clipping давал n≈2.5K/арм и ложную мощность) — на сопоставимой когорте значимости нет. Трактуем как guardrail-флаг «следить», не деградацию.
(2) Малая когорта: только рег 12–13.06 (2 дня сбалансированного сплита, ~0.9K/арм), чтобы день+3 был зрелым. По мере дозревания 14–16.06 база растёт, дельта уточнится. MDE при текущем n ~по D1 ≈ 5 п.п.
(3) Когорта = первый в истории показ флага в 12–13.06, экспонированные до 12.06 исключены; cross-arm (na>1) исключены; активность в окне 12–17.06.
Методология и оговорки
Что считали
- Шаги: Market_Appear → Offer_Glasses_Appear (карточка буст-оффера показана) → Offer_Glasses_Buy_Tap (тап «Купить» на карточке) → Market_Checkout_Buy_Tap (намерение оплаты).
- Метрика: uniq(person_id) на каждом шаге, строгий порядок (timestamp шага ≥ предыдущего).
- Арм:
properties['$feature/ANDROID_GLASSES_OFFER_VALUE_FIRST_ENABLED'] = true (value-first) / false (control).
- Буст = glasses: в Doppy покупка буста реализована как покупка NFT-очков, карточка оффера = Offer_Glasses_*.
Brand-фильтр Doppy
Сам флаг = чистый Doppy-фильтр. События с флагом: 100% Android, $app_name ∈ {Doppy, Swipix} — ноль Cheelee. Флаг оценивается только в Android-приложении Doppy/SWIPIX, доп. прокси не нужен.
Оговорки (flag-weakness-upfront)
1. Окно 12.06–16.06. Флаг раскатывали поэтапно: control с 05.06 (100% трафика), value-first сначала канарейкой (7 юзеров 05.06 → 261 — 11.06), сбалансированный 50/50 только с 12.06. Сравнение на полном периоде было бы смещено pre-experiment-трафиком контроля → берём только сбалансированное окно.
2. Intent-only в PostHog → оплату берём из ClickHouse через backend_uid-джойн. В PostHog НЕТ success-события покупки (Market_Checkout_Success = 1 юзер/арм за окно), воронка обрывается на намерении (Checkout_Buy_Tap). Реальные оплаченные бусты и деньги — в ClickHouse (paygate, фиат), там A/B-флага нет. Поэтому арм связывается с покупкой через backend uid (PostHog distinct_id после Identify = mongo user_id в CH) — это и есть блоки «реальная оплата по армам» выше. Покрытие джойна асимметрично по сторонам воронки: по знаменателю (зашедшие в Маркет) матчится ~90% (4 400/4 879 ctrl, 4 301/4 798 vf — почти симметрично 90%/90%, минимальный bias знаменателя); по числителю (плательщики) — 97% (518 из 535 фиат-плательщиков буста за окно несут арм; 17 не в эксперименте/pre-Identify, $101.97). Так что CH-разрез по армам не «невозможен» и не теряет 37% — он почти полон по плательщикам, считается на матчимой субпопуляции. Главная оговорка — малый n (262/256), p=0.996, значимости нет (см. блок «реальная оплата» и п.3).
3. Выборка незрелая и underpowered. 5 полных дней сбалансированного сплита (12–16.06), ~1.8K/арм. MDE по intent при текущем n ~36% rel. По реальной оплате n=24/33 плательщиков — направление в пользу value-first держится, но значимости нет (p=0.147). Дозреет ~18–21.06.
Вердикт — байесовская оценка
Резюме на языке решений (01.07):- Деньги (главная, CR Маркет→оплата): с вероятностью 50% value-first лучше контроля → то есть с ~50% он хуже. Ожидаемый аплифт -0.00 п.п., 95% CrI разницы [-1.00; +1.00] п.п. — уверенно пересекает ноль, эффекта нет. Expected loss выбрать value-first ≈ 0.20 п.п.
- Интент-воронка: слабая склонность в пользу value-first (P(B>A) 57–75%), но CrI у всех включают ноль и до денег не доходит.
- Retention (guardrail): единственный реальный сигнал — с вероятностью ~94% value-first снижает удержание (D1–D3, E[B−A] отрицательный). CrI пока чуть заходит за ноль, но масса вероятности — против.
Итого: по деньгам катить value-first смысла нет (вероятность выигрыша 50%, риск-ошибки ≈0.20 п.п.); решение Байеса совпадает с частотным «значимости нет», но добавляет: retention скорее РЕЖЕТ → не раскатывать, дать когорте дозреть.
Как читать
P(value-first > control) — апостериорная вероятность, что у value-first доля выше, чем у control
(Beta-Binomial, приор Beta(1,1) uniform). 50% = монетка/нет данных; ближе к 100% = уверенно лучше, к 0% = уверенно хуже.
Δ (пп) ± 95% CrI — ожидаемая абсолютная разница долей B−A в процентных пунктах и интервал, в котором она лежит с вероятностью 95%.
Если CrI пересекает ноль — разницы пока не видно.
Expected loss (B) — ожидаемая «недополученная» доля (пп), если выбрать value-first, а правда — на стороне control. Чем ближе к 0, тем безопаснее ставка.
Беta-Binomial по всем биномиальным метрикам
| Метрика | CR control | CR value-first |
P(B>A) | Δ E[B−A] (пп) | 95% CrI (пп) | Expected loss (B) |
Метод: приор Beta(1,1) + наблюдённые (успехи, попытки) → постериор Beta;
200 000 сэмплов, фикс. seed 20260629 (детерминированно, без Math.random — пересчитывается в daily-refresh).
Числа (n и конверсии) — те же, что в частотной вкладке. Частотные p оставлены там для сравнения.
Главная — «CR Маркет → купил буст (ФИАТ)» (реальные деньги из ClickHouse).
Интент-воронка = намерение в PostHog. Retention — guardrail (единая когорта, strict day-N).