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 domain patient.pzalab.com (Phase 2 — Cloudflare Custom Hostnames, в работе)
  • Брендирован под лабораторию: логотип, цвета, название
  • Magic link auth — пациент вводит email, получает ссылку, входит на 30 дней. Без пароля
  • Заказ анализов прямо у клиники через каталог
  • Полная интерпретация результатов с визуализациями, трендами, narrative summary
  • Бесплатно для пациента — клиника оплачивает за свои объёмы

Фичи

#ФичаОписание
13.1Magic Link loginEmail → ссылка на 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 реально доступна клиенту

Связано

Источники

Источники: 1.

Сноски

  1. Сессия ildar/871a7608, 2026-02-13 — (Feb 13-16.