diff --git a/docs/audits/2026-05-04-revenue-and-marketing-roast.md b/docs/audits/2026-05-04-revenue-and-marketing-roast.md index f8a7b61f4..e34b00fe9 100644 --- a/docs/audits/2026-05-04-revenue-and-marketing-roast.md +++ b/docs/audits/2026-05-04-revenue-and-marketing-roast.md @@ -22,6 +22,38 @@ Sergeant — **інженерний шедевр у пошуках продук --- +## Update 2026-05-04 — owner decisions (актуалізовано перед launch-екзекуцією) + +Власник `@Skords-01` ухвалив рішення по 15 ключових питаннях прожарки. Цей блок фіксує, **що прийнято**, **що відкладено**, і **що відхилено** з рекомендацій нижче. План-document — [`docs/initiatives/0010-revenue-first-launch.md`](../initiatives/0010-revenue-first-launch.md). + +**Прийнято (вношу в фази 1–6):** + +- **Pricing v3** ($7/міс / $49/рік, ₴ UA-only на старті, trial безкоштовний без прив'язки картки) — фаза 1.1 ADR-0045. +- **Apple + Google + Email/password fallback** через Better Auth — фаза 4.3 (нова). +- **Activation v2 metric**: Mono+5cat+1budget ≤72h — фаза 5.1. +- **A/B тест 2 тижні** goal-first vs `vibe_picks` (без прямої заміни) — фаза 5.2. +- **PH launch на ~50 paying + 20 reviews** (компроміс безпеки і швидкості) — DONE-критерій. +- **`apps/console` → `tools/console/`** як ankle-PR (одна година, поза фазами 1–6). + +**Відхилено з рекомендацій:** + +- **OpenClaw freeze** — owner вирішив **NOT freeze**, працюємо паралельно. Bot, marketing-агент, ops-агент, AI-щоденник — все лишається активним. Не блокує revenue track, але і не in-scope developer-time на 4 тижні цієї ініціативи. +- **Mobile deprecate** (Capacitor АБО Expo) — owner вирішив підтримувати **обидва паралельно**, Capacitor primary до завершення Expo-нативки. ADR-0047 фіксує це рішення (не deprecate, як рекомендовано в §3 нижче). +- **Public metrics dashboard** (`/api/public/metrics`) — out of scope, окрема decision власника пізніше. Видалено з фази 6. +- **Hero copy auto-pick** ("Mono + AI fin-coach" в рекомендації нижче) — owner залишив open question, фінал перед merge PR 6.1. + +**Відкладено як `[OPEN]`-питання (не блокують ініціативу):** + +- **Назва "Sergeant" rename track** — окрема ініціатива в Q4 2026 (за бажанням). +- **Hero positioning final pick** — обираємо перед merge фази 6.1 (placeholder copy у PR). +- **3 cross-module AI insights** — брейншторм окремо post-launch. +- **EUR/USD pricing** — після UA-MVP (~50–100 paying). +- **ФОП оформлення** — у планах власника, готуємо інтеграцію припускаючи що ФОП буде до фази 3.1 (T-7 deadline у §Ризики 0010). + +Усі рекомендації нижче (§3) — **as-of original audit** (до owner-decisions). Що з них прийнято/відхилено — звіряй з цим блоком, не з §3. + +--- + ## 1. Що зараз є насправді (evidence-based) | Шар | Стан у коді | Стан у документації | diff --git a/docs/initiatives/0010-revenue-first-launch.md b/docs/initiatives/0010-revenue-first-launch.md index f1c62555d..62d00e213 100644 --- a/docs/initiatives/0010-revenue-first-launch.md +++ b/docs/initiatives/0010-revenue-first-launch.md @@ -1,7 +1,7 @@ -# 0010 — Revenue-first launch: ship paid, freeze scope, focus wedge +# 0010 — Revenue-first launch: ship paid, focus wedge -> **Last validated:** 2026-05-04 by @sonher468. **Next review:** 2026-08-02. -> **Status:** Proposed (план PR-ів; перший PR — цей документ + аудит-сорс) +> **Last validated:** 2026-05-04 by @Skords-01. **Next review:** 2026-08-02. +> **Status:** Proposed (decisions locked, scope final; перший PR — цей документ + аудит-сорс + owner-decisions) > **Priority:** P0 (Sprint 1–4) > **Owner:** `@Skords-01` > **ETA:** 4 тижні (фаза 0 — поточний PR; фази 1–6 — 4 спринти по 1 тижню) @@ -9,7 +9,7 @@ ## TL;DR -Sergeant має 0 paying users, 0 ₴ MRR, 0 рядків білінг-коду — і 7 467 рядків плану монетизації. Ця ініціатива зупиняє інші front-и розширення скоупу (новий модуль, OpenClaw, мульти-mobile) і фокусує всі найближчі 4 тижні на **shipping реального білінгу + одного wedge-позиціонування + одного публічного landing-у**. Перший PR (цей) — docs-only: фіксує decision-baseline (нова pricing-модель, scope-freeze) і реєструє PR-план. Наступні PR-и реалізовують білінг від міграцій до Customer Portal-у. +Sergeant має 0 paying users, 0 ₴ MRR, 0 рядків білінг-коду — і 7 467 рядків плану монетизації. Ця ініціатива фокусує наступні 4 тижні на **shipping реального білінгу (Stripe + Apple/Google/Email auth) + activation v2 (Mono-wedge) + публічного landing-у з EN-локаллю**. OpenClaw і `apps/console` лишаються активними паралельно; mobile-strategy — Capacitor primary, Expo довершуємо нативку, обидва підтримуються. Перший PR (цей) — docs-only: фіксує decision-baseline (pricing v3, mobile-strategy ADR, ФОП-track, scope hero/insights як open-questions) і реєструє PR-план. Наступні PR-и реалізовують білінг від міграцій до Customer Portal-у і Apple/Google sign-in. ## Чому зараз @@ -17,27 +17,33 @@ Sergeant має 0 paying users, 0 ₴ MRR, 0 рядків білінг-коду - **Конкуренти живі і ростуть.** personalEverything, LifeShift 360, Phaseo вже у проді з тим самим «all-in-one» value-prop. Кожен тиждень без launch — це CAC, який доведеться платити, щоб відіграти share. - **Pricing-модель v1 економічно нежиттєздатна.** ₴99/міс при ≈$5/користувача API costs (Anthropic) = негативна gross margin на Pro tier. Це треба виправити **до** першого Stripe-чека, не після. - **Технічний skeleton монетизації** [(`docs/launch/06-monetization-architecture.md`)](../launch/06-monetization-architecture.md) розписаний на 691 рядок без жодного рядка `subscriptions` SQL у `apps/server/src/migrations/`. Час перейти від v2-плану до коду. -- **Tech-debt + scope expansion блокують velocity.** OpenClaw (573 рядки roadmap), `apps/console`, paralleled mobile (Capacitor + Expo) — все це додає maintenance burden, але не виручку. Фрізимо. +- **High-friction signup.** Email + password + verify email — це 4 кроки, що дають ~30–50% drop-off на signup-екрані (industry baseline). Apple + Google sign-in (через Better Auth) знизять friction до ≤10%. +- **OpenClaw і `apps/console` лишаються активними паралельно** до фази 6 — owner ухвалив, що NOT freeze. Просто не блокують revenue track. Mobile: Capacitor залишається primary до завершення Expo-нативки; обидва стеки підтримуються паралельно (рішення зафіксовано в ADR-0047 — фаза 1.2). ## Скоуп **In:** -1. Зафіксувати рішення про pricing v3 (Free + Pro tier, $7/міс / $49/рік, видалити Plus + Lifetime + pay-per-feature). -2. Заморозити OpenClaw v0, `apps/console` як прод-фічу, і вибрати один mobile стек (Expo або Capacitor — рішення в окремому PR на основі `0002-mobile-platform-decision`). -3. Реалізувати реальний білінг: `subscriptions` + Stripe webhook events table, Stripe SDK, `getUserPlan()` + `requirePlan()`, paywall UI, Stripe Checkout CTA, Customer Portal redirect. -4. Pivot activation metric і onboarding на Mono-led wedge (FTUX S5 carry-over). -5. Реальний публічний лендинг (mini-product page + email capture) з трекінгом у PostHog + EN-локаль на pricing. -6. Public metrics dashboard (MRR/WAU/D7/activation) — single source of truth для build-in-public. +1. Зафіксувати рішення про pricing v3 (Free + Pro tier, **$7/міс / $49/рік, ₴ UA-only на старті**, видалити Plus + Lifetime + pay-per-feature; trial безкоштовний без прив'язки картки). +2. Зафіксувати mobile-strategy ADR: **Capacitor primary** до завершення Expo-нативки, обидва підтримуються паралельно (продовжує `0002-mobile-platform-decision`). +3. Реалізувати реальний білінг: `subscriptions` + Stripe webhook events table, Stripe SDK, `getUserPlan()` + `requirePlan()`, paywall UI, Stripe Checkout CTA, Customer Portal redirect. ФОП-оформлення — у планах власника, **готуємо інтеграцію припускаючи що ФОП буде до фази 3.1** (T-7 deadline у §Ризики). +4. Auth multi-provider: **Apple + Google + Email/password fallback** через Better Auth (фаза 4.3) — щоб мінімізувати signup friction перед launch-ем. +5. Activation v2 metric (Mono+5cat+1budget ≤72h) і **A/B тест** goal-first onboarding vs `vibe_picks` 2 тижні; переможений лишаємо у проді. +6. Реальний публічний лендинг (mini-product page + email capture) з трекінгом у PostHog + EN-локаль на `/` і `/pricing`. +7. Перенос `apps/console` → `tools/console/` (ankle-PR scope `chore`, поза фазами 1–6) — щоб `apps/` чітко означало «product». **Out:** -- LiqPay/Paddle/Fondy інтеграції — слідують за Stripe MVP (фаза 7+, не в скоупі цієї ініціативи). -- Реалізація cross-module AI-інсайтів — окрема ініціатива пост-launch. -- Бренд-зміна / rename з «Sergeant» — потребує user-research, окрема ініціатива. +- **OpenClaw freeze / deprecate** — out of scope, працюємо паралельно (owner decision 2026-05-04). +- **Public metrics dashboard** (`/api/public/metrics`, MRR/WAU/D7) — out, відкладено до окремого decision власника. +- **Hero copy / positioning final pick** — out, винесено як [OPEN] у §Ризики; copy для лендингу формулюємо placeholder-ами в фазі 6.1, підставляємо фінальний варіант перед merge. +- **3 cross-module AI insights pick** — out, винесено як [OPEN] у §Ризики (брейншторм окремо, кандидати в audit-сорсі). +- **Бренд-зміна / rename з «Sergeant»** — out, окрема ініціатива (винесено як [OPEN] у §Ризики). +- LiqPay/Paddle/Fondy інтеграції — слідують за Stripe MVP (наступна ініціатива). - B2B / corporate / marketplace треки — out, не зараз. - Mass-видалення docs / playbooks — окремий cleanup, не блокуючий launch. -- Apple App Store / Play Store submission — слідує за веб-launch + 100 paid (наступна ініціатива). +- Apple App Store / Play Store submission — слідує за веб-launch + 50 paid (наступна ініціатива). +- Mobile-stack deprecate — Capacitor + Expo обидва живуть до окремого decision (NOT в цій ініціативі). ## План змін @@ -59,36 +65,34 @@ Sergeant має 0 paying users, 0 ₴ MRR, 0 рядків білінг-коду --- -### Фаза 1 — pricing & scope ADR-и (3 PR) +### Фаза 1 — pricing & mobile ADR-и (2 PR) #### PR 1.1 `docs-adr-pricing-v3` (scope: `docs`) -- `docs/adr/0045-pricing-v3-single-tier.md` — ADR про перехід на 2-тірну модель (Free + Pro $7/міс / $49/рік). -- Оновити `docs/launch/01-monetization-and-pricing.md` — додати «Update 2026-05-XX: pricing v3 затверджено» зі статусом «Superseded by ADR-0045» на застарілих секціях. +- `docs/adr/<0045-pricing-v3-single-tier>.md` — ADR про перехід на 2-тірну модель: **Free + Pro $7/міс / $49/рік, ₴ UA-only на старті, trial безкоштовний без прив'язки картки.** +- Оновити `docs/launch/01-monetization-and-pricing.md` — додати «Update 2026-05-XX: pricing v3 затверджено» зі статусом «Superseded by ADR-0045» на застарілих секціях (Plus tier, Lifetime ₴2999, pay-per-feature). - Додати freshness-update header. **Залежить від:** Фаза 0. **Acceptance:** ADR-0045 з `Status: Accepted`, lint:governance-sync зелений, governance-matrix оновлено. -#### PR 1.2 `docs-adr-openclaw-park` (scope: `docs`) +#### PR 1.2 `docs-adr-mobile-strategy` (scope: `docs`) -- `docs/adr/0046-openclaw-park-until-100-paid.md` — ADR про заморозку OpenClaw v0. -- Оновити `docs/launch/openclaw-roadmap.md` — `Status: Parked` + посилання на ADR. -- Оновити `docs/initiatives/` README — якщо OpenClaw має ініціативу, переводимо в `Parked`. +- `docs/adr/<0047-mobile-strategy-capacitor-primary>.md` — продовжує `0002-mobile-platform-decision`: **Capacitor — primary** mobile-shell до завершення Expo-нативки; **обидва стеки підтримуються паралельно**, deprecate жодного. Конкретний рішення «коли Expo стане primary» — окремий ADR пізніше (триггер: Expo має feature parity з web). +- Оновити `docs/initiatives/0002-mobile-platform-decision.md` — додати «Update 2026-05-04: рішення владника не deprecate, а підтримувати обидва паралельно. Capacitor primary до Expo feature-parity.» **Залежить від:** Фаза 0. -**Acceptance:** ADR-0046 з `Status: Accepted`, openclaw-roadmap.md явно `Parked`. +**Acceptance:** ADR-0047 з `Status: Accepted`, `apps/mobile/README.md` і `apps/mobile-shell/README.md` мають freshness-header з рішенням. -#### PR 1.3 `docs-adr-mobile-pick` (scope: `docs`) +> **Зняте з фази 1:** ADR-0046 (OpenClaw park) — owner ухвалив працювати паралельно. Якщо в майбутньому стане очевидним, що OpenClaw блокує revenue, переоцінимо окремою ініціативою. -- `docs/adr/0047-mobile-stack-final-pick.md` — фіналізація `0002-mobile-platform-decision`: один stack залишається, інший — deprecated до видалення (T-30 / T-7 / T-1 cadence уже шипнутий у [#1633](https://github.com/Skords-01/Sergeant/pull/1633)). -- Оновити `docs/initiatives/0002-mobile-platform-decision.md` — phase 3 closure plan. +#### Ankle-PR (поза фазою 1, scope: `chore`) -**Залежить від:** Фаза 0. +`chore-console-move-to-tools` — переніс `apps/console/` → `tools/console/`. Сигналізує «це internal tool, не product». Maintenance — той самий. ~1 година роботи. -**Acceptance:** ADR-0047 з `Status: Accepted`, deprecation календар у readme `apps/`. +**Acceptance:** `apps/console/` зник, `tools/console/` працює (CI зелений), CODEOWNERS оновлено. --- @@ -189,7 +193,7 @@ Sergeant має 0 paying users, 0 ₴ MRR, 0 рядків білінг-коду --- -### Фаза 4 — paywall UI + замінити static pricing (2 PR) +### Фаза 4 — paywall UI + Pricing + Auth multi-provider (3 PR) #### PR 4.1 `feat-web-paywall-and-plan-hooks` (scope: `web`) @@ -210,7 +214,7 @@ Sergeant має 0 paying users, 0 ₴ MRR, 0 рядків білінг-коду - Замінити статичний `apps/web/src/core/PricingPage.tsx` на 2-тірну модель з реальним CTA → `POST /api/billing/checkout`. - Видалити waitlist-форму (карається за окремим path `/waitlist` як legacy 3 місяці). - Customer Portal link для існуючих Pro юзерів. -- USD/EUR auto-detect через Stripe price localization. +- **Pricing — ₴ UA-only на старті (без USD/EUR auto-detect — out of scope для MVP).** - PostHog події: `PRICING_VIEWED`, `PRICING_CTA_CLICKED`, `CHECKOUT_OPENED`. **Залежить від:** PR 4.1. @@ -220,6 +224,25 @@ Sergeant має 0 paying users, 0 ₴ MRR, 0 рядків білінг-коду - E2E happy-path: visit /pricing → click CTA → land on Stripe Checkout (test mode) → return → plan = pro. - a11y axe-core зелений. +#### PR 4.3 `feat-web-auth-multi-provider` (scope: `web`) + +- Better Auth wiring: **Apple Sign-In + Google Sign-In + Email/password fallback** на `/sign-in` і `/sign-up`. + - Apple: native `Sign in with Apple` (web + mobile-shell). + - Google: OAuth one-click. + - Email/password: лишається як fallback для юзерів без Apple/Google. +- ENV: `APPLE_CLIENT_ID`, `APPLE_TEAM_ID`, `APPLE_PRIVATE_KEY`, `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET`. +- Better Auth playbook: `.agents/skills/better-auth-best-practices/SKILL.md` (canonical recipe — слідуємо точно). +- PostHog події: `SIGNUP_PROVIDER_SELECTED`, `SIGNUP_COMPLETED` з `provider` dimension. + +**Залежить від:** PR 4.2 (можна паралельно, мінімум). + +**Acceptance:** + +- 3 sign-in кнопки на `/sign-in`, активна перша яку вибирає юзер. +- E2E: новий юзер може sign-up через Google за ≤3 кліки і потрапити на dashboard < 5 секунд. +- Drop-off на signup ≤15% (PostHog funnel — measure 7 днів після production rollout). +- Better Auth migrations застосовані (Apple/Google provider tables). + --- ### Фаза 5 — activation pivot до Mono-wedge (2 PR) @@ -231,24 +254,31 @@ Sergeant має 0 paying users, 0 ₴ MRR, 0 рядків білінг-коду **Залежить від:** Фаза 0 (можна паралельно з фазою 2). -#### PR 5.2 `feat-web-onboarding-goal-first` (scope: `web`) +#### PR 5.2 `feat-web-onboarding-goal-first-ab-test` (scope: `web`) -- Замінити `vibe_picks` UI на goal-first single-screen wizard: «Я хочу контролювати витрати» → одразу Mono OAuth + 5 categorize. -- Перенести fitness/nutrition/routine модулі в «cross-sell» картки на dashboard. -- PostHog події: `ACTIVATION_V2_HIT`, `ONBOARDING_GOAL_PICKED`. +- **A/B тест 50/50** через PostHog feature flag `onboarding_v2`: + - **Variant A (control):** поточний `vibe_picks` flow (без змін). + - **Variant B (test):** goal-first single-screen wizard: «Яку фінансову мету хочете досягти?» (3 варіанти: «Зекономити ₴X», «Стати фінансово грамотним», «Контролювати витрати») → одразу Mono OAuth + 5 categorize → dashboard. +- Перенести fitness/nutrition/routine модулі в «cross-sell» картки на dashboard (для обох variants). +- PostHog події: `ACTIVATION_V2_HIT`, `ONBOARDING_GOAL_PICKED`, `ONBOARDING_VIBE_PICKED` з dimension `variant`. - Carry-over від [`docs/launch/ftux-sprint-plan.md`](../launch/ftux-sprint-plan.md) S5. +- **Decision rule (через 2 тижні після rollout):** залишити variant з вищим `activation_v2` rate. Втрачений variant видалити окремим cleanup-PR. **Залежить від:** PR 5.1. -**Acceptance:** E2E: новий юзер може досягти `activation_v2` за 4 хвилини (рекординг tester-сесії). +**Acceptance:** + +- E2E (для variant B): новий юзер може досягти `activation_v2` за ≤4 хвилини (рекординг tester-сесії). +- A/B feature flag активний; PostHog dashboard показує обидва flows. --- -### Фаза 6 — публічний лендинг + EN locale + public metrics (2 PR) +### Фаза 6 — публічний лендинг + EN locale (1 PR) #### PR 6.1 `feat-web-landing-and-en-locale` (scope: `web`) -- `apps/web/src/core/.tsx` (route `/`, новий) — hero «Український Mono + AI = персональний фінансовий сержант» + 1 demo GIF + email capture (PostHog). +- `apps/web/src/core/.tsx` (route `/`, новий) — hero **{HERO_PLACEHOLDER}** (фінальний copy — open question, обираємо перед merge: див. §Ризики «Hero positioning»). Кандидати: «Український Mono + AI fin-coach», «AI-щоденник, який знає вашу мету», «Mono → інсайти за 30 секунд», «Замініть 5 додатків одним». До фінального вибору shipимо placeholder + email capture. +- 1 demo GIF + email capture → PostHog `LANDING_EMAIL_CAPTURED`. - EN-локаль для `/`, `/pricing`, paywall — мінімальний i18n setup (react-i18next або lingui — рішення в окремому ADR-0048 у скоупі цього PR). - Sitemap + robots.txt + OG-image. @@ -259,15 +289,9 @@ Sergeant має 0 paying users, 0 ₴ MRR, 0 рядків білінг-коду - Lighthouse ≥ 90 у performance/a11y/SEO. - `lang="uk"` / `lang="en"` коректно підтягуються. - Email capture → PostHog `LANDING_EMAIL_CAPTURED` event. +- Hero copy фіналізований owner-ом перед merge (без placeholder-у). -#### PR 6.2 `feat-server-public-metrics-dashboard` (scope: `server`) - -- `GET /api/public/metrics` — повертає cached MRR, WAU, D7 retention, activation rate. Cache 1 година. -- Public Notion-style page на `/metrics` (web) — пов'язує build-in-public з реальними цифрами. - -**Залежить від:** PR 5.1, PR 4.2. - -**Acceptance:** `/api/public/metrics` повертає фактичні (не stub) числа з Postgres. +> **Знято з фази 6:** PR 6.2 (public metrics dashboard) — owner ухвалив відкласти. Endpoint може бути додано окремою ініціативою пізніше. --- @@ -276,62 +300,71 @@ Sergeant має 0 paying users, 0 ₴ MRR, 0 рядків білінг-коду - [ ] PR-и фази 0 (цей PR) + фази 1–6 змерджені. - [ ] Перший Stripe webhook у проді записаний у `stripe_webhook_events`. - [ ] Перший платний користувач: `subscriptions.plan = 'pro'` AND `subscriptions.provider = 'stripe'` AND `subscriptions.current_period_end > NOW()`. -- [ ] `/pricing` показує реальні CTA → Stripe Checkout (не waitlist), test mode + live mode обидва зелені у smoke-e2e. -- [ ] OpenClaw roadmap явно `Parked` через ADR. -- [ ] Один mobile-stack deprecated через ADR з конкретним deletion-датою. +- [ ] `/pricing` показує реальні CTA → Stripe Checkout (не waitlist), test mode + live mode обидва зелені у smoke-e2e. **₴ UA-only.** +- [ ] Apple + Google + Email sign-in активні; signup drop-off ≤15% (PostHog funnel, 7 днів production data). +- [ ] Mobile-strategy ADR-0047 із `Status: Accepted` (Capacitor primary, Expo paralleled, обидва підтримуються). - [ ] `activation_v2` доступна як метрика у PostHog dashboard. -- [ ] Public metrics endpoint живий, перший публічний build-in-public пост відсилається на `/metrics`. -- [ ] EN-локаль працює на `/` і `/pricing`. +- [ ] A/B тест goal-first vs `vibe_picks` запущено; рішення про переможця прийнято через 2 тижні після rollout. +- [ ] EN-локаль працює на `/` і `/pricing`; hero copy фіналізований owner-ом перед merge PR 6.1. - [ ] Усі PR-и пройшли CI зелено + a11y axe-core + Lighthouse budget. - [ ] Усі нові docs мають freshness header + Status badge (Hard Rule #10). - [ ] `docs/launch/01-monetization-and-pricing.md` оновлено: pricing v3 — current state, не план. +- [ ] Ankle-PR `chore-console-move-to-tools` змерджено (`apps/console/` → `tools/console/`). ## Метрики успіху (вимірюються через 30 днів після фази 6) -| Метрика | Поріг go/no-go | Target | Джерело | -| ------------------------------------------- | -------------- | ------ | ----------------------------- | -| Перший платний (`provider='stripe'`) | ≥ 1 | ≥ 10 | SQL `subscriptions` | -| Activation rate (v2) | ≥ 15 % | ≥ 30 % | PostHog funnel | -| Days to first paid | ≤ 28 | ≤ 14 | calendar | -| `/pricing` → checkout open conversion | ≥ 5 % | ≥ 12 % | PostHog | -| Stripe webhook idempotency violations | 0 | 0 | `stripe_webhook_events` audit | -| Cross-stack mobile maintenance hours / week | < 2 h | 0 h | `docs/diagnostics/` | - -## Ризики та митиґація - -| Ризик | Мітигація | -| -------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Founder заперечує pricing v3 ($7/міс) як «занадто дорого для UA» | ADR-0045 містить кваліф-бенчмарки (Stripe / Apple IAP / global B2C SaaS). Якщо not approved — пропустити фазу 1.1 і shipити з ₴99 (відомо що неекономічно). | -| Stripe / LiqPay не доступні для UA-юрособи | Stripe Atlas (Delaware LLC) — стандарт для UA founders. Окрема legal-track ADR-0049 (out of scope цієї ініціативи, але блокер на фазу 3). | -| Webhook delivery flakey у тесті | `stripe trigger` локально + nock cassettes у CI. Production — exponential backoff на own retry queue. | -| OpenClaw freeze викликає frustration у founder | Frame як «pause for 90 днів», не «delete». Roadmap залишається у репо, просто `Status: Parked`. Розблокується автоматично після `100 paying users`. | -| Goal-first onboarding знижує initial engagement metric (D1 active modules) | A/B флаг `onboarding_v2` на 50% / 50% перші 2 тижні; rollback якщо `activation_v2` < `activation_v1` × 1.2. | -| EN-локаль ламає UA copy | i18n setup тільки для `/` + `/pricing` + paywall — НЕ для всього застосунку. Інші сторінки залишаються UA-only до окремої i18n-ініціативи. | -| Public metrics endpoint показує 0 / погані числа і шкодить бренду | Дозволити `metrics.publicVisible = false` через env-flag; паблікувати тільки коли founder вирішить. | +| Метрика | Поріг go/no-go | Target | Джерело | +| -------------------------------------- | ---------------------- | ------ | ----------------------------- | +| Перший платний (`provider='stripe'`) | ≥ 1 | ≥ 10 | SQL `subscriptions` | +| Activation rate (v2) | ≥ 15 % | ≥ 30 % | PostHog funnel | +| Days to first paid | ≤ 28 | ≤ 14 | calendar | +| `/pricing` → checkout open conversion | ≥ 5 % | ≥ 12 % | PostHog | +| Stripe webhook idempotency violations | 0 | 0 | `stripe_webhook_events` audit | +| Signup drop-off (Apple/Google/Email) | ≤ 15 % | ≤ 8 % | PostHog funnel | +| PH-launch readiness (paying + reviews) | 50 paying + 20 reviews | — | manual audit pre-launch | + +## Ризики та мітигація + +| Ризик | Owner | Мітигація | +| --------------------------------------------------------------------------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **[BLOCKER ФАЗИ 3]** ФОП ще не оформлений, Stripe потребує юрособу | `@Skords-01` | Готуємо інтеграцію припускаючи що ФОП буде до фази 3.1 (deadline T-7 від merge PR 2.2). Owner відкриває ФОП паралельно. Якщо не встигаємо — фази 3+ затримуються до оформлення. | +| Webhook delivery flakey у тесті | dev | `stripe trigger` локально + nock cassettes у CI. Production — exponential backoff на own retry queue. | +| Apple/Google sign-in потребує developer accounts + verification | `@Skords-01` | Apple Developer ($99/рік) + Google Cloud Console (free) — оформляємо паралельно з фазою 3. Без цього фаза 4.3 не може shipитись у production (можна shipити email-only first). | +| Goal-first onboarding знижує initial engagement metric (D1 active modules) | dev | A/B флаг `onboarding_v2` на 50% / 50% перші 2 тижні; rollback якщо `activation_v2` < `activation_v1` × 1.2. | +| EN-локаль ламає UA copy | dev | i18n setup тільки для `/` + `/pricing` + paywall — НЕ для всього застосунку. Інші сторінки залишаються UA-only до окремої i18n-ініціативи. | +| **[OPEN]** Hero positioning final pick (Mono+AI / goal-first / 5-apps-in-one ...) | `@Skords-01` | Placeholder copy у фазі 6.1 PR; final copy обирається owner перед merge. Якщо не вирішено — лишаємо «Український Mono + AI fin-coach» як safe default. | +| **[OPEN]** Назва «Sergeant» rename track | `@Skords-01` | Open question, не блокує цю ініціативу. Пропозиції в audit-сорсі (Tracker, Compass, Anchor, Cabinet, etc.). Окрема ініціатива в Q4 2026 (за бажанням). | +| **[OPEN]** 3 cross-module AI insights pick | `@Skords-01` | Брейншторм окремо post-launch. Кандидати в audit-сорсі. Не блокує фази 1–6. | +| **[DEFERRED]** Public metrics dashboard (`/api/public/metrics`) | `@Skords-01` | Out of scope цієї ініціативи. Окрема decision коли і чи публікувати MRR/WAU/D7. Endpoint може бути доданий пізніше. | +| **[DEFERRED]** Mobile-stack deprecate (Capacitor vs Expo final pick) | `@Skords-01` | Обидва підтримуються паралельно у цій ініціативі. Окремий decision коли Expo матиме feature parity з web (триггер: `apps/mobile` MAU > `apps/mobile-shell` MAU 30 днів поспіль). | +| **[ACTIVE PARALLEL]** OpenClaw v0 / `apps/console` як Telegram bot | `@Skords-01` | NOT freeze. Працює паралельно з revenue track. Не блокує фази 1–6, але і не in-scope (developer time на нього не з cap-у цих 4 тижнів). | ## Фази та залежності (граф) ``` -Фаза 0 (docs) +Фаза 0 (docs — цей PR) │ - ├─→ Фаза 1.1 (ADR pricing) ─┐ - ├─→ Фаза 1.2 (ADR openclaw) │ - └─→ Фаза 1.3 (ADR mobile) │ - ↓ - Фаза 2 (data layer) - │ - ↓ - Фаза 3 (stripe e2e) - │ - ↓ - Фаза 4 (paywall UI) - │ - Фаза 5.1 (activation v2) ───┤ - ↓ - Фаза 5.2 (onboarding pivot) - │ - ↓ - Фаза 6 (landing + metrics) + ├─→ Фаза 1.1 (ADR pricing v3) ─┐ + └─→ Фаза 1.2 (ADR mobile-strategy) │ + ↓ + Фаза 2 (data layer) + │ + ↓ + Фаза 3 (stripe e2e) + │ + ├─→ Фаза 4.1 (paywall + plan hooks) + ├─→ Фаза 4.2 (real /pricing) + └─→ Фаза 4.3 (Apple/Google/Email auth) ──┐ + │ + Фаза 5.1 (activation v2 metric) ─────────────────────────────────────┐ │ + ↓ ↓ + Фаза 5.2 (A/B onboarding) + │ + ↓ + Фаза 6 (landing + EN) + +Ankle-PR (поза фазами 1–6, scope: chore): + chore-console-move-to-tools ← apps/console/ → tools/console/ ``` ## Власник / ETA @@ -348,5 +381,6 @@ Sergeant має 0 paying users, 0 ₴ MRR, 0 рядків білінг-коду - **Технічний skeleton білінгу:** [`docs/launch/06-monetization-architecture.md`](../launch/06-monetization-architecture.md). - **FTUX carry-over:** [`docs/audits/2026-05-03-ftux-onboarding-roast.md`](../audits/2026-05-03-ftux-onboarding-roast.md), [`docs/launch/ftux-sprint-plan.md`](../launch/ftux-sprint-plan.md). - **Mobile picks:** [`docs/initiatives/0002-mobile-platform-decision.md`](./0002-mobile-platform-decision.md). -- **OpenClaw roadmap:** [`docs/launch/openclaw-roadmap.md`](../launch/openclaw-roadmap.md). +- **Better Auth playbook:** [`.agents/skills/better-auth-best-practices/SKILL.md`](../../.agents/skills/better-auth-best-practices/SKILL.md). +- **OpenClaw roadmap (active parallel, not in scope):** [`docs/launch/openclaw-roadmap.md`](../launch/openclaw-roadmap.md). - **Releases register (буде заповнюватись по PR):** TBD. diff --git a/docs/initiatives/README.md b/docs/initiatives/README.md index 0fd0e32a1..eb960656e 100644 --- a/docs/initiatives/README.md +++ b/docs/initiatives/README.md @@ -39,7 +39,7 @@ | 0007 | [Design-system tooling (Storybook + VR)](./0007-design-system-tooling.md) | P1 | `@Skords-01` | Sprint 2 (2 wk) | Proposed | | 0008 | [Platform hardening (rate-limit, health)](./0008-platform-hardening.md) | P1 | `@Skords-01` | Sprint 2 (1 wk) | **In progress** (2026-05-04) — Phase 1 [#1634](https://github.com/Skords-01/Sergeant/pull/1634) (`/startupz` + nested `/health/{liveness,readiness,startup}` aliases + 6 smoke tests) + Phase 2 [#1638](https://github.com/Skords-01/Sergeant/pull/1638) (centralized `RATE_LIMIT_POLICIES` registry + RFC-9239 `RateLimit-*` headers + auth migration + 12 tests) + Phase 3 [#1641](https://github.com/Skords-01/Sergeant/pull/1641) (Renovate primary + Dependabot security-only daily, [ADR-0044](../adr/0044-renovate-vs-dependabot.md), `anthropic`/`sentry`/`opentelemetry` groups) + Phase 4 [#1639](https://github.com/Skords-01/Sergeant/pull/1639) (`release-sbom.yml` workflow → SPDX + CycloneDX на published release / git tag / manual dispatch, anchore/sbom-action SHA-pinned) + Phase 5 [#1642](https://github.com/Skords-01/Sergeant/pull/1642) (runbook FAQ для probes / 429 / Renovate / SBOM). Pending merge ладают до **Done**. | | 0009 | [Agent-OS hardening (skills/playbooks/governance gates)](./0009-agent-os-hardening.md) | P1 | `@Skords-01` | Sprint 2–3 (4 wk) | **In progress** (2026-05-04) — Phase 1: 2/5 PR merged ([#1659](https://github.com/Skords-01/Sergeant/pull/1659) `pnpm lint:skills` + skills-lock SHA-256 enforcement, [#1660](https://github.com/Skords-01/Sergeant/pull/1660) Hard Rules registry `category` taxonomy 6/11/1). PR 1.3 (`tsc-files` pre-commit) deferred — заблоковано pre-existing typecheck помилками на `main` (`apps/server/.../rotateSecret.test.ts` TS2345 + `apps/web/.../HubDashboard.tsx` TS2741); потрібен hotfix-PR перед активацією. Залишок Phase 1: PR 1.2 (UA-prose linter), PR 1.4 (`playbook-schema` extension). | -| 0010 | [Revenue-first launch (Stripe MVP, scope freeze, Mono-wedge)](./0010-revenue-first-launch.md) | P0 | `@Skords-01` | Sprint 1–4 (4 wk) | Proposed (2026-05-04) — фаза 0 (цей PR з аудит-сорсом + initiative-документом). Фази 1–6: ADR-и pricing v3 / OpenClaw park / mobile pick → `subscriptions` міграції + Stripe SDK + webhook → paywall UI + real `/pricing` CTA → activation v2 (Mono-wedge) → public landing + EN-локаль + public metrics. Source: [`docs/audits/2026-05-04-revenue-and-marketing-roast.md`](../audits/2026-05-04-revenue-and-marketing-roast.md). | +| 0010 | [Revenue-first launch (Stripe MVP + Apple/Google auth + Mono-wedge)](./0010-revenue-first-launch.md) | P0 | `@Skords-01` | Sprint 1–4 (4 wk) | Proposed (2026-05-04, decisions locked) — фаза 0 (цей PR з аудит-сорсом + initiative-документом + owner-decisions). Фази 1–6: ADR pricing v3 ($7/міс, ₴UA-only, trial без картки) + ADR mobile-strategy (Capacitor primary, Expo paralleled) → `subscriptions` міграції + Stripe SDK + webhook → paywall UI + real `/pricing` CTA + Apple/Google/Email auth → activation v2 (Mono-wedge) + A/B onboarding → public landing + EN-локаль. **OpenClaw НЕ freeze** (active parallel). **Public metrics — deferred.** Source: [`docs/audits/2026-05-04-revenue-and-marketing-roast.md`](../audits/2026-05-04-revenue-and-marketing-roast.md). | | 0011 | [Foundation adoption + process discipline (post-launch sweep)](./0011-foundation-adoption-and-process-discipline.md) | P1 | `@Skords-01` | Sprint 2 (Phase 1) + post-0010 (Phases 2–4, 6 wk) | **Proposed** (2026-05-04) — subordinate to [0010-revenue-first-launch](./0010-revenue-first-launch.md) freeze. 18 PR-ів у 4 фазах: Phase 1 (4 PR, in-freeze CI-guards: PR-template / cross-branch migration-collision / vercel-staging gate / CSP_DISABLE retrospective) — старт 2026-05-05, паралельно з 0010. Phases 2–4 (foundation adoption + hardening verification + Storybook hand-off) — після 0010 launch, ~2026-06-02 → 2026-07-14. Real baseline: 2 active `useFormValidation`, 6 `useApiForm`, 0 real `` consumers, 15 manual `isLoading/isError`, 0 raw `fetch()`. Source: vector assessment 2026-05-04. | ## Статуси