Приглашение пользователей — типичная боль B2B
В закрытых B2B-продуктах критичен контроль доступа: новый пользователь должен попасть только в свою организацию, и сразу с правильной ролью. Мы реализовали десятки таких flow — от простых ссылок до сложных воркфлоу с подтверждениями. Ключевое — правильная обработка edge cases: дубли, истекшие ссылки, смена email. Часто встречаем ситуацию, когда приглашение отправлено на корпоративный email, а пользователь уже зарегистрирован с личным — нужно слияние аккаунтов. Или когда администратор хочет отозвать приглашение после отправки. Наш опыт (более 5 лет и 40+ проектов по внедрению аутентификации) показывает, что стандартная реализация без учёта этих нюансов приводит к багам и жалобам клиентов.
Как реализовать безопасное приглашение пользователей по email?
Основной подход — генерация уникального токена, который хранится в БД и имеет срок действия. В нашем стеке мы используем Prisma ORM для схемы данных и Next.js Server Actions для серверной логики. Базовая модель приглашения включает email, роль, токен, статус и дату истечения. Статусы — PENDING, ACCEPTED, EXPIRED, REVOKED — переключаются автоматически или вручную администратором.
| Статус | Описание |
|---|---|
| PENDING | Приглашение отправлено, ожидает принятия |
| ACCEPTED | Пользователь принял приглашение и добавлен в организацию |
| EXPIRED | Срок действия истёк (по умолчанию 7 дней) |
| REVOKED | Отозвано администратором до принятия |
Токен генерируется как случайная строка с помощью crypto.randomUUID() и хэшируется перед сохранением. При принятии проверяется не только наличие, но и статус «PENDING», а также срок действия. Если токен истёк, приглашение автоматически помечается «EXPIRED». Для защиты от повторного использования после принятия токен удаляется или переводится в «ACCEPTED».
Типичные проблемы при реализации приглашений
- Дубликаты: если пользователь отправляет несколько приглашений на один email, система должна либо игнорировать, либо обновлять предыдущее. Мы используем unique constraint на email в рамках организации.
- Смена email: пользователь может принять приглашение на другой email — нужна верификация. В нашем flow мы требуем подтверждения нового email перед принятием.
- Истечение ссылки: время жизни по умолчанию 7 дней, но можно настроить под требования клиента. По истечении показываем страницу с предложением запросить новое приглашение.
- Ролевая модель: при создании приглашения указывается роль (OWNER, ADMIN, MEMBER, VIEWER). После принятия пользователь добавляется в организацию с этой ролью. Администратор может изменить роль уже после принятия.
Почему приглашения лучше открытой регистрации?
Open registration в B2B порождает хаос: кто угодно может зарегистрироваться, приходится вручную назначать организации. Приглашение по ссылке даёт безопасность и автоматизацию: пользователь получает роль сразу, организация фиксируется, администратор видит историю. Такой подход снижает нагрузку на поддержку в 2–3 раза.
Сравнение способов регистрации
Выбор между открытой регистрацией и приглашением зависит от требований. Открытая регистрация проще для пользователя, но требует административной работы по назначению организаций и ролей. Приглашение по email с подтверждением — надёжный, но многошаговый процесс. Приглашение по ссылке — золотая середина: безопасно, автоматизировано, удобно для админа и пользователя. В нашем опыте компании, перешедшие с открытой регистрации на приглашения, сокращают время онбординга нового сотрудника на 70%.
Что входит в работу
- Анализ ролевой модели и схемы данных.
- Проектирование и реализация модели Invitation в Prisma.
- Разработка Server Actions для отправки и принятия приглашений.
- Создание email-шаблонов в React Email с поддержкой брендинга.
- Интеграция с почтовым сервисом (Resend/SendGrid) и настройка webhook’ов.
- Страница принятия приглашения с обработкой edge cases (истекший токен, повторное использование).
- Unit-тесты (проверка статусов, валидация) и интеграционные тесты полного flow.
- Документация по API и инструкции для администратора.
- Поддержка в течение 30 дней после деплоя.
Процесс работы: от задачи до деплоя
- Аналитика — определяем роли, схему данных, требования к безопасности. Собираем сценарии использования и edge cases.
- Проектирование — модель Invitation в Prisma, выбор стека (Next.js, React Email, Resend). Проектируем API endpoints через Server Actions.
- Реализация — пишем Server Actions для отправки и принятия приглашений, создаём email-шаблоны в React Email, разрабатываем страницу с токеном для принятия.
- Тестирование — unit-тесты на валидацию (например, проверка статуса, срока), интеграционные тесты на полный flow (отправка до принятия).
- Деплой — настраиваем переменные окружения (ключи Resend/SendGrid, база данных), мониторинг доставки писем через webhook’и.
Наш опыт и гарантии
Мы реализовали подобные системы для 15+ B2B-продуктов на Next.js и Laravel. Гарантируем стабильную работу, соответствие Core Web Vitals и документацию flow. Опыт интеграции с почтовыми сервисами обеспечивает доставку писем без спам-фильтров. Мы также предоставляем гарантию на реализованный код в течение 30 дней после деплоя.
Сроки и стоимость
Реализация типового invitation flow с email и обработкой edge cases занимает от 3 до 5 рабочих дней. Стоимость рассчитывается индивидуально — зависит от сложности ролевой модели, необходимости интеграции с внешними сервисами и дополнительных требований.
Как начать?
Свяжитесь с нами — мы оценим ваш проект и предложим оптимальное решение. Закажите реализацию пригласительной системы под ключ. Получите готовую систему с тестами и документацией.







