A/B Маркет — порядок инфо на карточке буст-оффера value-first vs price-first
Doppy / SWIPIX · Android · флаг ANDROID_GLASSES_OFFER_VALUE_FIRST_ENABLED ·
Snapshot PostHog 17.06.2026 · Окно сравнения 12.06 → 16.06 (сбалансированный 50/50, полные дни) · 17.06 — partial, только в дневном графике
Вердикт (17.06)
Победителя пока нет, картина 3 слоёв держится (без разворотов vs 16.06):
Intent-воронка (PostHog): ничья, все шаги n.s. (p>0.6). Чекаут-намерение точечно чуть выше у value-first (+0.3 п.п.), но шум.
Реальная оплата буста (ClickHouse, арм↔покупка по backend uid, джойн покрывает 93% плательщиков): value-first впереди — CR Маркет→оплата 2.48% vs 1.69% (+0.79 п.п.), $287 vs $186 (+$101). Направление устойчиво по всем 4 метрикам, но при n=24/33 ещё не значимо (p=0.147). Это разворот сигнала vs intent.
Retention guardrail (PostHog, единая когорта рег 12–13.06, одна база): value-first ниже контроля на D1/D2/D3 (~−2 п.п. каждый день), но ни один день не значим (p>0.08, n≈0.9K/арм). Прежний «D2 значимо» снят — был артефактом несопоставимых когорт (тенурный control из канареечной раскатки 100% c 05.06). Кривая теперь монотонна. Флаг «следить», не деградация.
Итого: гипотеза «ценность раньше цены → больше покупок» держит первое подтверждение на реальных деньгах, но недонабрана (за сутки payers 21→24 / 30→33, значимости всё нет); параллельно — guardrail-наблюдение по удержанию (направление вниз, незначимо). Решение — дозреть до ~18–21.06.
Выборка control
1 832
uniq в Маркете за окно
Выборка value-first
1 767
uniq в Маркете за окно
CR Маркет→реальная оплата
1.69% / 2.48%
control / value-first · CH, фиат
Лидер по оплате
value-first
+0.79 п.п. CR, n.s. (p=0.147)
Воронка покупки буста по армам (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
(фиат, gate через paygate-webhook status=paid). Арм берётся из PostHog, мапится на backend uid (distinct_id=mongo user_id) и джойнится с покупками в CH — джойн покрывает 93% плательщиков (57/61), поэтому разрез по армам корректен (детали покрытия — в оговорках ниже).
Сигнал обратный intent-воронке: по реальной оплате value-first впереди (CR 2.48% vs 1.69%, +0.79 п.п.), хотя при n=24 vs 33 это пока не значимо.
Метрика
Control (price-first)
value-first
Δ абс
z
p
значимость
Зашли в Маркет (база, матчимые uid)
1 418
1 330
—
—
—
Уник. плательщики буста (фиат)
24
33
+9
—
—
Кол-во фиат-покупок буста
24
33
+9
—
—
Выручка, $ (USD-эквив.)
$185.58
$286.75
+$101.17
—
—
CR Маркет → купил буст фиатом
1.69%
2.48%
+0.79 п.п.
+1.45
0.147
n.s.
Выручка на 1 зашедшего в Маркет
$0.131
$0.216
+$0.085
—
—
Оговорки.
(1) Фиат-only: только external + непустой fiat_asset, internal $DOPPY не считается.
(2) Покрытие джойна (важно, чтобы не путать два числа): по плательщикам — 93% (57 из 61 фиат-плательщиков буста за окно несут арм; 4 не в эксперименте/pre-Identify, $21.63 — теряем не 37%, а ~7% денег). По знаменателю (зашедшие в Маркет) — ~76% (1 418/1 832 ctrl, 1 330/1 767 vf), почти симметрично по армам (77% / 75%) → минимальный bias знаменателя. CR считается на матчимой субпопуляции; pre-Identify трафик и cross-arm юзеры исключены.
(3) Малый n: 24 vs 33 плательщика. Направление в пользу value-first устойчиво по всем 4 метрикам (payers / purchases / $ / CR), но p=0.147 — значимости нет. Дозреет с накоплением трафика.
(4) Окно CH = 12–16.06 (полные дни, paygate settled). 17.06 в реальной оплате не берём — paygate-данные за сегодня неполные.
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–13.06 (сбалансированное окно 50/50, без канарейки/тенурных), и НЕ экспонированы до 12.06. Один знаменатель на все дни (день+3=16.06 полностью дозрел на 17.06). Активность = Session_Start по person_id, strict day-N.
Метрика
Control
value-first
Δ абс (п.п.)
z
p
значимость
D1
17.3% (158/913)
15.0% (133/887)
−2.3 п.п.
-1.33
0.183
n.s.
D2
11.8% (108/913)
9.6% (85/887)
−2.2 п.п.
-1.54
0.124
n.s.
D3
10.1% (92/913)
7.8% (69/887)
−2.3 п.п.
-1.71
0.088
n.s.
Кривая монотонна (как и должно на одной когорте): control 17.3% ≥ 11.8% ≥ 10.1%; value-first 15.0% ≥ 9.6% ≥ 7.8%. База D1=D2=D3 = 913 / 887 на арм — одна и та же.
Оговорки.
(1) Направление — вниз, но НЕ значимо ни на одном дне. value-first ниже контроля на D1/D2/D3 (−2.3 / −2.2 / −2.3 п.п.), но при n=913/887 все p>0.08. Прежний «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.
Буст = 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) — это и есть блоки «реальная оплата по армам» выше. Покрытие джойна асимметрично по сторонам воронки: по знаменателю (зашедшие в Маркет) матчится ~76% (1 418/1 832 ctrl, 1 330/1 767 vf — почти симметрично 77%/75%, минимальный bias знаменателя); по числителю (плательщики) — 93% (57 из 61 фиат-плательщиков буста за окно несут арм; 4 не в эксперименте/pre-Identify, $21.63). Так что CH-разрез по армам не «невозможен» и не теряет 37% — он почти полон по плательщикам, считается на матчимой субпопуляции. Главная оговорка — малый n (24/33), p=0.147, значимости нет (см. блок «реальная оплата» и п.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.