White-label B2B портал — клиника или лаборатория получает готовый patient-facing UI на собственном subdomain, брендированный под себя. Один из трёх integration-options. Пациент видит результаты и заказывает анализы в интерфейсе клиники, не зная что под капотом BloodGPT.
НЕ путать с PHR — там B2C app для individual users. Patient Portal — для пациентов B2B клиентов клиник, с другой экономикой (платит лаборатория, не пациент).
Что получает клиент
- Деплоится на subdomain клиники:
lab1.portal.bloodgpt.tech(Phase 1 — hash-based subdomain) или client-owned domainpatient.pzalab.com(Phase 2 — Cloudflare Custom Hostnames, в работе) - Брендирован под лабораторию: логотип, цвета, название
- Magic link auth — пациент вводит email, получает ссылку, входит на 30 дней. Без пароля
- Заказ анализов прямо у клиники через каталог
- Полная интерпретация результатов с визуализациями, трендами, narrative summary
- Бесплатно для пациента — клиника оплачивает за свои объёмы
Фичи
| # | Фича | Описание |
|---|---|---|
| 13.1 | Magic Link login | Email → ссылка на 15 минут → сессия 30 дней. One-time use |
| 13.2 | Дашборд | Welcome + counts (тесты / completed / pending orders) + последние результаты + quick-actions |
| 13.3 | Список результатов | Все тесты — id (last 8), date, params count, status (Ready/Processing/Error) |
| 13.4 | Детальный просмотр | Полная интерпретация — см. biomarker-analysis-pipeline для механики |
| 13.5 | Каталог анализов | Доступные тесты + категории + цены |
| Дальше | Заказ анализа, профиль, история | См. spec 13 |
Реализация
apps/patient-portal/ в bloodgpt-for-business (main, не feature branch — production):
- Stack: Next.js + Prisma + Mailgun (magic link emails)
- Без WorkOS — session-based через Prisma + email magic-link
- Cloud SQL Proxy к
analysis-worker-db(через Prisma) - i18n: 10 локалей (Polish, German, English, Russian и т.д.)
- Subdomain routing: middleware определяет org по
{hash}.portal.bloodgpt.tech
Дискуссия в session 871a7608 (Feb 13-16, 2026) предлагала перевести на WorkOS multi-tenant с org-context через query parameter — это дизайн, не реализовано. Сейчас остаётся на собственной auth.
Cross-domain — Phase 2
Для client-owned доменов (patient.pzalab.com) cookie не пересекает domain boundary. Решение через cloudflare-custom-hostnames + token-redirect: callback на portal.bloodgpt.tech создаёт one-time Redis token (TTL 30s), redirect на patient.pzalab.com/auth/exchange?token=xyz, там обмен на cookie на правильном домене. См. также hash-based-subdomain.
Связь с другими продуктами
- doctor-validation — опциональный режим, работает на этом portal’е (доктор approves → пациент видит verified results + stamp)
- integration-options — Patient Portal как один из трёх вариантов интеграции
- PHR — отдельный B2C продукт, не путать
- Фичи 13.4 детальный просмотр → реально рендерится через
@repo/analysis-ui(shared компоненты с PHR и b2b-platform)
Внутренняя архитектура
- patient-portal-reminders — pipeline follow-up реминдеров: LLM → Postgres + FHIR → portal → Inngest. Известные defects (FHIR-roundtrip-loss, time-of-day, unique-key collision) + cross-link на UX decision.
Открытые вопросы
- WorkOS-based multi-tenant flow (предложен в 871a7608) — будет ли реализован или остаёмся на session-based
- Phase 2 client-owned domains — статус Cloudflare Custom Hostnames интеграции
- Каталог анализов с заказом — реализован или часть spec в работе
- Параметрическая брендирование (cores, fonts, accent colors) — насколько deep customization реально доступна клиенту
Связано
- integration-options — три integration paths, Patient Portal один из них
- multi-tenant-fhir-storage — backend FHIR storage для patient data
- cloudflare-custom-hostnames — Phase 2 custom domains
- workos — обсуждался для multi-tenant auth, не используется сейчас
- hash-based-subdomain — Phase 1 subdomain pattern
- doctor-validation — поверх Patient Portal даёт «verified by doctor» mode
Источники
Источники: 1.
Сноски
-
Сессия
ildar/871a7608, 2026-02-13 — (Feb 13-16. ↩