A/B Маркет — порядок инфо на карточке буст-оффера value-first vs price-first · ТЕСТ ОТКЛЮЧЁН

Doppy / SWIPIX · Android · флаг ANDROID_GLASSES_OFFER_VALUE_FIRST_ENABLED · Snapshot PostHog 03.07.2026 · Окно сравнения 12.06 → 02.07 (сбалансированный 50/50, полные дни) · 03.07 — partial, только в дневном графике
⛔ Тест отключён. Флаг ANDROID_GLASSES_OFFER_VALUE_FIRST_ENABLED выключен — валидного 50/50-сплита больше нет. Данные ниже — финальные на окно 12.06 → 02.07 (снапшот 03.07). Ежедневный авто-рефреш остановлен, цифры не меняются.
Данные и окно — одни и те же (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 (Firebase-мост, единая когорта первого показа флага 12.06–29.06, одна база): value-first ниже контроля на D1/D2/D3 (−0.9 / −1.5 / −0.5 п.п.), но ни один день не значим (p>0.10, n=4043/3854). Считано на канонике Firebase user_pseudo_id (арм-флаг мостится на backend uid), а НЕ PostHog — PostHog занижал абсолют retention на ~5–7 пп (D1 казался 22% вместо реальных 29.7%). Направление вниз сохраняется, кривая монотонна. Флаг «следить», не деградация.
Итого: на очищенных данных (is_fraud=0 + дедуп) гипотеза «ценность раньше цены → больше покупок» не подтверждается — реальная оплата в паритете (n.s., p=0.34), слабый крен к price-first. Параллельно — guardrail по удержанию (направление вниз, незначимо). Решение — дозреть, монетизация ещё набирает n.
Выборка control
4 880
uniq в Маркете за окно
Выборка value-first
4 801
uniq в Маркете за окно
CR Маркет→реальная оплата
6.04% / 5.97%
control / value-first · CH, фиат, is_fraud=0
Лидер по оплате
price-first
−0.07 п.п. CR, n.s. (p=0.886)

Воронка покупки буста по армам (uniq person_id, строгий порядок шагов)

Control — price-first (сначала цена)

Value-first (сначала заработок)

Конверсия шаг-к-шагу и дельта между армами

ШагControlvalue-first CR ctrlCR vfΔ абс (п.п.)zpзначимость
База конверсии — 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Δ абсzpзначимость
Зашли в Маркет (база, матчимые uid)4 4014 304
Уник. плательщики буста (фиат)266257−9
Кол-во фиат-покупок буста269261−8
Выручка, $ (USD-эквив.)$2013.21$1936.44−$76.77
CR Маркет → купил буст фиатом6.04%5.97%−0.07 п.п.-0.140.886n.s.
Выручка на 1 зашедшего в Маркет$0.457$0.450−$0.008
Оговорки. (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 · Firebase

Что это — ЕДИНАЯ фиксированная когорта, каноника Firebase (переведено с PostHog 10.07)

Считаем на Firebase, НЕ на PostHog. PostHog distinct_id сбрасывается на Identify и занижает удержание на ~5–7 пп (D1 казался 22% вместо реальных 29.7%). Арм — это feature-флаг PostHog, поэтому мостим (R2): арм-флаг из posthog_events_message (distinct_id = 24-hex backend uid) → активность из Firebase firebase_doppy_raw (backend uid = splitByChar(':',user_id)). Идентичность и активность — Firebase user_pseudo_id, канон R10/R2.
Когорта: юзеры, чей первый в истории показ флага пришёлся на 12.06–29.06 (сбалансированное окно 50/50, без канарейки/тенурных), не экспонированы до 12.06. Один знаменатель на все дни (день+3 дозрел). Активность = session_start (Firebase), strict day-N. Покрытие моста ~68% (доля арм-uid с Firebase-активностью) — симметрично по армам, база меньше PostHog-когорты (4043/3854 vs 5760/5691).
МетрикаControlvalue-firstΔ абс (п.п.)zpзначимость
D129.7% (1202/4043)28.8% (1110/3854)−0.9 п.п.-0.910.364n.s.
D222.2% (896/4043)20.7% (797/3854)−1.5 п.п.-1.600.109n.s.
D317.5% (709/4043)17.0% (657/3854)−0.5 п.п.-0.570.566n.s.
Кривая монотонна (как и должно на одной когорте): control 29.7% ≥ 22.2% ≥ 17.5%; value-first 28.8% ≥ 20.7% ≥ 17.0%. База D1=D2=D3 = 4 043 / 3 854 на арм — одна и та же (Firebase-мост).
Оговорки. (1) Направление — вниз, но НЕ значимо ни на одном дне. value-first ниже контроля на D1/D2/D3 (−0.9 / −1.5 / −0.5 п.п.), но при n=4 043/3 854 все p>0.10. Вывод устойчив к смене источника: на PostHog арм-дельта была той же (−0.9 / −1.1 / −0.5 пп) — занижался лишь абсолют, не направление. Трактуем как guardrail-флаг «следить», не деградацию. (2) Покрытие моста ~68%: база на Firebase (4043/3854) — это арм-uid с найденной Firebase-активностью (непустой user_id); недоехавшие ~32% симметричны по армам, арм-дельта несмещена. MDE при текущем n ~по D1 ≈ 3 п.п. (3) Когорта = первый в истории показ флага 12.06–29.06, экспонированные до 12.06 исключены; cross-arm (na>1) исключены; активность (Firebase session_start) до day+3.

Методология и оговорки

Что считали

  • Шаги: 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 401/4 880 ctrl, 4 304/4 801 vf — почти симметрично 90%/90%, минимальный bias знаменателя); по числителю (плательщики) — 89% (523 из 589 фиат-плательщиков буста за окно несут арм; 66 не в эксперименте/pre-Identify, $401.70). Так что CH-разрез по армам не «невозможен» и не теряет 37% — он почти полон по плательщикам, считается на матчимой субпопуляции. Главная оговорка — малый n (266/257), p=0.886, значимости нет (см. блок «реальная оплата» и п.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.