Какие идентификаторы в метрике SOMA считаются уникальными идентификаторами клиента?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Уникальные идентификаторы клиента в метрике SOMA
Что такое SOMA?
SOMA — это фреймворк для анализа клиентов в B2B SaaS. Расшифровка зависит от контекста, но обычно это означает Segmentation, Organization, Metrics, Analysis. В некоторых случаях это может быть Sub, Org, Multiplayer, Account.
В контексте уникальности клиента, SOMA часто используется для определения иерархии идентификаторов:
- S — Segment (сегмент, тип клиента)
- O — Organization (организация/компания)
- M — Master account (главный аккаунт)
- A — Account (подаккаунт, юзер)
Иерархия идентификаторов в SOMA
Уровень 1: S (Segment)
↓
Уровень 2: O (Organization)
↓
Уровень 3: M (Master Account)
↓
Уровень 4: A (Account/User)
Уровень S — Segment (Сегмент)
Определение: Категория клиента по типу, размеру или поведению.
Примеры идентификаторов:
segment_id: "enterprise"
segment_id: "mid-market"
segment_id: "smb" (Small and Medium Business)
segment_id: "startup"
segment_id: "freemium"
Как используется:
- Фильтрация по размеру клиента
- Анализ retention по типу
- Pricing разный для разных сегментов
В SQL:
SELECT
segment_id,
COUNT(DISTINCT org_id) as org_count,
AVG(mrr) as avg_mrr
FROM customers
GROUP BY segment_id;
-- Результат:
-- segment_id org_count avg_mrr
-- enterprise 150 50000
-- mid-market 500 5000
-- smb 5000 500
-- freemium 100000 0
Уровень O — Organization (Организация)
Определение: Уникальная компания, которая платит за услугу.
Примеры идентификаторов:
org_id: "abc123456" (UUID)
org_id: "company-slug" (human-readable)
company_name: "Acme Corp"
domain: "acme.com" (для B2B)
tax_id: "1234567890" (уникальный налоговый номер)
Характеристики Organization:
- Одна Organization = один платёж
- Может быть несколько пользователей
- Один level M (Master account) и несколько A (подаккаунты)
Пример:
Organization: "Acme Corp" (org_id = abc123456)
├── Master Account: Peter Johnson (user_id = user_001)
├── Sub Account 1: Alice Smith (user_id = user_002)
├── Sub Account 2: Bob Brown (user_id = user_003)
└── Sub Account 3: Carol White (user_id = user_004)
Все платежи идут на org_id = abc123456
Все три пользователя отправляют данные на org_id
Как определить Organization:
- По домену email:
SELECT
user_id,
email,
SUBSTRING_INDEX(email, '@', -1) as email_domain,
-- Если приложение учитывает домены, то все пользователи с одним доменом = одна org
FROM users;
-- alice@acme.com → org_id = acme.com
-- bob@acme.com → org_id = acme.com
-- carol@acme.com → org_id = acme.com
- По явно указанному org_id:
SELECT
user_id,
org_id,
organization_name,
organization_domain
FROM users
WHERE org_id IS NOT NULL;
- По workspace/team:
-- В Slack, Notion, Figma
SELECT
user_id,
workspace_id as org_id, -- workspace = organization
workspace_name
FROM users_in_workspace;
Важно: Organization ID должен быть уникальным и стабильным. Не меняется, если компания переименовывается или меняет домен.
Уровень M — Master Account (Главный аккаунт)
Определение: Primary administrator или owner Organization'и.
Характеристики:
master_account_id: UUID
master_account_user_id: который создал Organization
role: "Owner" или "Admin"
can_manage_billing: true
can_invite_users: true
can_delete_organization: true
Пример:
Organization: "Acme Corp"
Master Account: Peter Johnson (user_id = user_001)
- может изменять настройки Organization
- может добавлять/удалять users
- может изменять billing
- удаление Master Account удалит всю Organization
В SQL:
SELECT
org_id,
master_user_id,
user_name,
role,
created_at
FROM users
WHERE role = 'Owner' AND org_id IS NOT NULL;
-- abc123456 user_001 Peter Johnson Owner 2020-01-15
-- def456789 user_005 John Smith Owner 2021-06-20
Проблема: Что если Master Account удалит свой аккаунт?
✗ Плохо: Organization вися без owner
✓ Хорошо: Система автоматически назначает следующего Admin
✓ Хорошо: Требует явной передачи ownership
Уровень A — Account (Пользовательский аккаунт)
Определение: Индивидуальный пользователь, который может работать в системе.
Идентификаторы:
user_id: UUID
email: "alice@acme.com"
username: "alice.smith"
phone: "+1-555-0100" (в некоторых продуктах)
social_id: "google-oauth-123" (если OAuth)
device_id: "aabbccdd1234" (для мобильных приложений)
session_id: "sess-xyz789" (временный, для текущей сессии)
Характеристики:
- Один user_id = один человек (или бот)
- Может быть в одной Organization
- Может иметь разные роли (Admin, Editor, Viewer)
- Может иметь несколько сессий (мобиль + web + планшет)
Пример:
User: Alice Smith
├── user_id: user_002
├── email: alice@acme.com
├── org_id: abc123456 (Acme Corp)
├── role: Editor
└── sessions:
├── session_mobile_2024-03-26 (iPhone)
├── session_web_2024-03-26 (MacBook)
└── session_tablet_2024-03-25 (iPad)
Что считается уникальным идентификатором КЛИЕНТА?
Это главный вопрос. Ответ зависит от того, что вы считаете "клиентом".
Вариант 1: ОРГАНИЗАЦИЯ = Клиент
Определение: Клиент — это компания, которая платит деньги.
Уникальный идентификатор: org_id
Метрики:
SELECT
org_id,
organization_name,
COUNT(DISTINCT user_id) as user_count,
SUM(amount) as total_revenue,
MAX(last_active_date) as last_active
FROM customers c
LEFT JOIN users u ON c.org_id = u.org_id
GROUP BY org_id;
-- org_id name user_count revenue last_active
-- abc123456 Acme Corp 5 50000 2024-03-26
-- def456789 Tech Inc 8 75000 2024-03-25
-- ghi789012 StartupXYZ 2 5000 2024-03-20
Когда использовать: В B2B SaaS, когда платит организация.
Вариант 2: ПОЛЬЗОВАТЕЛЬ = Клиент
Определение: Клиент — это индивидуальный человек.
Уникальный идентификатор: user_id или email
Метрики:
SELECT
user_id,
email,
org_id,
first_login,
last_login,
DATEDIFF(day, first_login, last_login) as days_active,
COUNT(actions) as total_actions
FROM users u
LEFT JOIN actions a ON u.user_id = a.user_id
GROUP BY user_id;
-- user_id email org_id days_active
-- user_001 peter@acme.com abc123456 100
-- user_002 alice@acme.com abc123456 85
-- user_003 bob@acme.com abc123456 45
Когда использовать: В B2C (Consumer Apps), когда платит или использует человек напрямую.
Вариант 3: АККАУНТ = Клиент (для многоаккаунтовых приложений)
Определение: Один аккаунт = один независимый клиент (например, Telegram:
- Один user_id может быть в разных организациях
- Но это не один "клиент" в SOMA смысле
Уникальный идентификатор: Зависит от модели
Пример Slack:
Пользователь: Alice
user_id: alice_uuid
Workspace 1 (Acme Corp): workspace_id = acme_uuid
→ combined_id = "alice_uuid@acme_uuid" (Alice в Acme)
Workspace 2 (Tech Inc): workspace_id = tech_uuid
→ combined_id = "alice_uuid@tech_uuid" (Alice в Tech)
Каждая комбинация = отдельный клиент в B2B смысле.
Какой идентификатор выбрать для SOMA?
Матрица выбора:
| Вопрос | Ответ | Уникальный ID |
|---|---|---|
| Один платёж на кого? | На организацию | org_id |
| Кто платит? | Компания | org_id |
| Один юзер может быть в 1+ орг? | Да | org_id + user_id |
| Это B2B или B2C? | B2B | org_id |
| Это B2C? | B2C | user_id |
| Это платформа (как Slack)? | Комбо | workspace_id + user_id |
Практический пример: Правильная метрика в SOMA
Задача: Считать DAU (Daily Active Users) в Telegram-like приложении.
Неправильно (по умолчанию):
# Просто считаем user_id
DAU = SELECT COUNT(DISTINCT user_id)
FROM actions
WHERE DATE(created_at) = CURRENT_DATE
# Результат: 1,000,000 DAU
Правильно (по SOMA):
# Если это B2B Slack-like:
DAU_BY_ORG = SELECT
org_id,
COUNT(DISTINCT user_id) as org_dau
FROM actions
WHERE DATE(created_at) = CURRENT_DATE
GROUP BY org_id;
# Результат:
# org_id org_dau
# acme_uuid 10
# tech_uuid 25
# startup_uuid 3
# Всего организаций активных: 3
# Всего пользователей активных: 38
Вывод: В SOMA смысле:
- 38 DAU (users)
- 3 DAU (organizations)
SQL примеры для определения уникальных ID
Пример 1: Какие user_id принадлежат одной org?
SELECT
org_id,
COUNT(DISTINCT user_id) as unique_users_in_org,
STRING_AGG(user_id, ', ') as user_ids
FROM users
GROUP BY org_id
HAVING COUNT(DISTINCT user_id) > 1;
-- org_id unique_users_in_org user_ids
-- abc123456 5 user_001, user_002, user_003, user_004, user_005
-- def456789 8 user_006, user_007, ...
Пример 2: Есть ли дублирующиеся email в системе?
SELECT
email,
COUNT(DISTINCT user_id) as count_users,
STRING_AGG(user_id, ', ') as user_ids
FROM users
GROUP BY email
HAVING COUNT(DISTINCT user_id) > 1;
-- Если результат не пуст, есть проблема: один email может быть у разных user_id
-- email count_users user_ids
-- alice@acme.com 2 user_002, user_999 <-- ОШИБКА!
Пример 3: Который user_id является Master Account?
SELECT
org_id,
user_id,
email,
role
FROM users
WHERE role = 'Owner'
AND org_id IS NOT NULL
ORDER BY org_id;
-- org_id user_id email role
-- abc123456 user_001 peter@acme.com Owner
-- def456789 user_005 john@tech.com Owner
Резюме: Иерархия уникальных ID в SOMA
┌─────────────────────────────┐
│ S — Segment ID │ ("enterprise", "smb")
├─────────────────────────────┤
│ O — Organization ID │ (org_id, workspace_id)
│ Уникален в системе │ ← ГЛАВНЫЙ ИДЕНТИФИКАТОР КЛИЕНТА
├─────────────────────────────┤
│ M — Master Account ID │ (owner_user_id, admin_id)
│ Один на Organization │
├─────────────────────────────┤
│ A — Account/User ID │ (user_id, email)
│ Много на Organization │
└─────────────────────────────┘
Ответ на главный вопрос: В SOMA фреймворке, организация (O) — это основной уникальный идентификатор клиента. Все остальные ID (user_id, master_account_id) подчинены ей.
Но если ты анализируешь B2C приложение (как Instagram, Telegram для обычных юзеров), то уникальный идентификатор клиента — это user_id или email.