Product Analytics + A/B on Supabase
Business Context
Аналитическое портфолио чаще всего показывает метрики на чистом CSV. Этот проект закрывает другой сценарий — как аналитика встраивается в реальный multi-tenant продукт: авторизация, изоляция данных по организациям, путь инжеста событий и эксперимент, результат которого считается в базе, а не в ноутбуке.
Architecture
Client/seed ── POST /functions/v1/ingest (x-api-key) ──► Edge Function (Deno)
│
Streamlit ◄── email/password auth + SQL (RLS-scoped) ──► Supabase Postgres
dashboard (supabase-py, anon key) analytics + experiments
- Схемы:
analytics(organizations, api_keys, users, events, subscriptions, org_members) иexperiments(experiments, variants, assignments, metrics). - Аналитика в БД: SQL-views считают funnel, cohort retention, MRR, DAU и channel conversion (
sql/002_views.sql) — дашборд переформатирует, но не агрегирует. - A/B в БД:
experiments.v_resultsсчитает по варианту assigned/converted/conversion; χ²-тест запускается поверх в дашборде. - Ingest: Edge Function валидирует API-ключ (SHA-256 hash, не plaintext) и вставляет событие через
security definerфункцию.
Security model (RLS)
На каждой таблице включён Row Level Security. Пользователь видит только строки своей организации — дашборд безопасно открывать реальным пользователям, а не только запускать локально.
Insight
Ключевое — аналитика считается там же, где лежат данные. SQL-views и v_results означают, что метрики и экспериментальные результаты согласованы между любым клиентом, который подключается к базе: дашборд, BI-инструмент или ad-hoc SQL-запрос видят одни и те же цифры.
Impact
- Full-stack путь — instrument → ingest → isolate → analyze → experiment в одном репозитории.
- Завершённый A/B — control 32.1% vs treatment 37.2%, p = 0.0034 (χ²), +5.1pp lift.
- RLS на всех таблицах — дашборд безопасно показывать реальным пользователям.
- Переиспользованный UI — слой презентации взят из streamlit-app; заменён только слой данных.