Appearance
Тарифы и лимиты
Последняя сверка с кодом: 2026-06-12
Источник правды:backend/src/constants/planLimits.ts,GET /api/plans
Аудитория: PM, аналитики, QA
1. Тарифы
| Лимит | FREE | BASE | PRO |
|---|---|---|---|
| Событий на аккаунт | 3 | 10 | ∞ |
| Файлов в событии | 100 | 1 000 | ∞ |
| Хранение файлов | 7 дней | 30 дней | 90 дней |
| Видео: макс. длина | 30 сек | 2 мин | 10 мин |
| Макс. размер файла | 50 МБ | 100 МБ | 500 МБ |
| Модерация загрузок | ❌ | ✅ | ✅ |
| Брендинг события (лого, фон, цвет) | ❌ | ✅ | ✅ |
| Закрытый QR / private events | ❌ | ✅ | ✅ |
null в коде = «без ограничений».
2. Что применяется где
| Лимит | Где проверяется |
|---|---|
| Число событий | POST /api/events → middleware requirePlanEventCreate → assertCanCreateEvent |
| Файлов в событии | TUS onUploadFinish → assertEventMediaCapacity |
| Размер файла | TUS policy → assertFileSizeWithinPlanLimit |
| Длина видео | TUS / metadata |
| Брендинг | POST /events/:id/branding/:kind → assertCustomBrandingAllowed |
| Модерация | EventSettings.moderationEnabled (UI скрыт на FREE) |
| Приватный QR | EventSettings.qrAccess (MEMBERS_ONLY / INVITE_ONLY) |
SUPER_ADMIN: обходит все план-лимиты через bypassesPlanLimits().
3. UX при превышении лимита
| Ситуация | HTTP | Код | UI |
|---|---|---|---|
| Создание события при maxEvents | 403 | PLAN_LIMIT_REACHED | Toast об ошибке |
| Upload при maxFilesPerEvent | 403 | PLAN_LIMIT_REACHED | TUS error toast |
| Слишком большой файл | 403 | PLAN_LIMIT_REACHED | TUS error toast |
| Брендинг на FREE | 403 | — | Кнопка неактивна / toast |
На /pricing — сравнение тарифов. Апгрейд — не реализован (PLAN 23.5 отложено, биллинг нет).
4. EventSettings vs Plan limits
Два уровня ограничений не путать:
| Уровень | Кто управляет | Где |
|---|---|---|
| Plan limit | Платформа (нельзя обойти) | planLimitsService, middleware |
| EventSettings | OWNER (в пределах плана) | /:id/settings, EventSettings |
Пример: FREE не может включить moderationEnabled в настройках (поле скрыто в UI).
5. StorageDays
Файлы с истёкшим storageDays — автоочистка не реализована (backlog). Сейчас поле используется в UI/marketing, фактического удаления нет.
6. Биллинг
Оплата смены тарифа — отложено (PLAN 23.5). Причина: юрлицо / 152-ФЗ / Stripe+РФ.
Тариф меняется сейчас только вручную через SUPER_ADMIN → /admin/users.