# Чем отличается

Сравнивать по количеству возможностей бессмысленно: у зрелого SaaS их всегда
больше. Разница в четырёх вещах, где расхождение не количественное, а
принципиальное, — и в списке того, чего у нас нет, который стоит в конце
и который стоит прочитать первым.

## Одно API вместо двух

У GetCourse их два, и они независимы: разные базовые адреса, разная
аутентификация, разный формат тела, разные конверты ответа и разные названия
одних и тех же сущностей.

**Классическое API** умеет три вещи: создать пользователя, создать заказ,
запустить асинхронный экспорт. Формат — JSON в base64 внутри
form-urlencoded. Лимит экспорта — 100 запросов за 2 часа **на весь аккаунт**,
причём каждый опрос «готов ли файл» тоже расходует квоту, а экспорт однопоточный.
Чтения одного объекта нет вообще — только массовая выгрузка.

**Tech API** закрывает часть дыр, но ключ выдаётся по анкете, а документация
закрыта в `robots.txt`. Ни один из массовых интеграторов её не использует —
все работают на классическом API с его тремя действиями.

Что это меняет для интегратора практически: чтобы узнать состояние одного заказа,
нужно заказать выгрузку всех и дождаться файла. Синхронизация с CRM превращается
в ночную задачу вместо реакции на событие.

У нас один адрес, одна аутентификация, один формат, один конверт ошибок и один
справочник событий. Ключ школа заводит сама, без анкеты.

Оговорка, без которой абзац был бы враньём: **работающего API у нас пока нет.**
Оно спроектировано целиком и описано в разделе [Проект API](/api/), но маршрутов
в продукте ещё ноль. Сравнивать сегодня можно замысел с работающим — это честное
сравнение только если сказать об этом вслух.

## Права: роль — сущность, а не семьдесят галочек

У GetCourse ролей как сущности нет. Есть поле «тип» в карточке человека и около
семидесяти отдельных галочек, которые расставляются **каждому сотруднику по одной,
руками**. Ни шаблонов, ни групп, ни копирования прав с человека на человека.

Три следствия, которые практики называют болью:

- **Права почти не привязаны к объектам.** Ограничить сотрудника одним курсом можно
  только назначив его преподавателем этого курса. Одной воронкой, одним продуктом,
  одной рассылкой — нельзя. Администратор всегда администратор всего аккаунта.
- **Контакты ученика видны либо целиком, либо никак.** Состояния «работай с человеком,
  но не видь его почту и телефон» не существует. На вопрос, как закрыть контакты
  от сотрудников, поддержка отвечает: заключайте договор о неразглашении.
- **Крупные права каскадно включают пакеты других.** «Может настраивать аккаунт» разом
  добавляет управление правами, мессенджеры, хранилище, виджеты, трафик, пользователей,
  сайт, рассылки, промоакции и партнёрку. Выдать больше, чем собирался, легко.

У нас роль — сущность (ADR-049): набор прав, который выдаётся целиком и правится
в одном месте. Право сужается до курса, а контакты закрываются отдельным правом,
не связанным с правом работать с человеком.

И одна деталь, которую стоит назвать: **куратор по умолчанию видит только своих**
учеников. У GetCourse наоборот — по умолчанию всех, включая чужие ответы, а «только
своих» включается галочкой в каждом тренинге отдельно. Безопасное поведение должно
быть тем, которое получается само.

## Оформление переживает обновление

Обычный способ дать школе менять вид — задокументировать классы вёрстки. Мы этого
не делаем, и это возражение по существу.

Разметка собрана из утилитарных классов. Объявить их публичными — значит запретить
себе менять вёрстку навсегда: любая перестановка сломает оформление у всех, кто его
настроил. И сломает **молча**: CSS не падает при неверном селекторе, он просто
перестаёт применяться. Ошибки в логах не будет, письмо придёт от клиента через месяц.

Поэтому наружу объявлены два намеренных слоя:

- **[переменные оформления](/appearance/variables/)** — 84 публичных имени, которые мы
  обязуемся не переименовывать. Одна строка `--brand` перекрашивает школу целиком,
  включая тёмную тему;
- **[якоря](/appearance/anchors/)** — стабильные атрибуты на ключевых элементах, для
  случаев «уберите тень у карточки курса».

Внутреннюю разметку при этом мы меняем свободно — и именно поэтому обещание
«не сломается при обновлении» чего-то стоит.

## Данные забираются целиком

Обещание «нет вендор-лока» проверяется одним вопросом: как выглядит уход.

У нас: база на вашем сервере, доступ к PostgreSQL у вас, плюс выгрузка школы одним
архивом, включая содержимое курсов и файлы. У GetCourse выгрузка идёт по частям
и упирается в ту самую квоту 100 запросов за 2 часа: база в десятки тысяч человек
выгружается часами.

## Чего у нас нет

Самый ценный абзац страницы. Без него это буклет, а не сравнение.

**Работающего API нет.** Спроектировано подробно, реализация назначена после
ближайшего этапа. Сегодня по нему нельзя написать интеграцию.

**Продаж нет.** Ни продуктов, ни тарифов, ни заказов, ни приёма платежей. Это
следующий крупный этап. Школа, которой нужно продавать завтра, сегодня продавать
на этом не сможет.

**Рассылок и сценариев нет.** Спроектированы, не написаны.

**Вебинаров нет.**

**Якорей оформления нет ни одного.** Переменные работают, якоря появятся вместе
с ближайшими экранами.

**Приложений в App Store и Google Play не будет никогда.** Не «пока нет» — не будет
(ADR-053). Для коробки это тупик: одна установка — одна школа, значит каждой школе
понадобилось бы своё приложение со своим названием, а это сотни публикаций и сотни
ревью, плюс аккаунт разработчика и ежегодные платежи на покупателе. Вместо этого
кабинет ставится на домашний экран как PWA и открывается на весь экран, а для тех,
кто живёт в Telegram, есть отдельная оболочка. Обе показывают один и тот же кабинет.

**Зрелости.** GetCourse работает десять лет, на нём тысячи школ и найдены тысячи
краевых случаев. У нас первая установка на живой сервер прошла в августе 2026
и дала девять находок. Это не то, что чинится обещанием.

## Что дальше

- [Установка](/start/install/) — что нужно от сервера и как поставить.
- [Проект API](/api/) — что спроектировано, с честной пометкой о состоянии.
- [Обновления](/changelog/) — что изменилось и когда появится остальное.
