Test Plan: Guest Portal

♻️ Reconciled against current code — 2026-07-01. The Guest Portal isn't a separate app — it's the same PWA rendering a reduced view for a User/Member whose account has no ACTIVE membership (created via public event registration, see findOrCreateGuestMember in auth-service/src/services/guest/ and auth-service/src/handlers/publicEventsHandlers.ts). Guest data flows through the same EventRegistration model as members (registrationType: GUEST), the same admin guest roster endpoint (GET /api/admin/guests, handlers/adminGuestListHandler.ts), and the same event-registrations-roster endpoint (GET /api/events/:eventId/registrations/guests, handlers/eventRegistrationsHandler.ts) used for member attendee lists. See the green banner below for everything new on stage since Jun 19. Trust this page + the code over the older TC-GUEST-002 page where they disagree — e.g. TC-GUEST-002 predates the current admin nav path (Members → Guests) and the server-side CSV export.
🆕 New on stage — 2026-06-19 → 2026-07-01.

1. Scope

A "guest" is a User/Member record created automatically the first time someone with no MemberVu account registers for a public event (findOrCreateGuestMember, auth-service/src/services/guest/guestMemberService.ts, invoked from publicEventsHandlers.ts). Guests get portal access (password-setup email, login, a reduced dashboard) but are NOT members — no membership dues, no member directory, no members-only event pricing — until an admin/membership-chair converts them via the membership application flow. This section covers: guest login + dashboard, the guest profile "Guest" type label, admin guest-roster listing/search/export, and the PII redaction on the guest-registration roster response. Membership conversion mechanics (guest → member) live in TC-GUEST-002; new data-handling/security surfaces from this pass live in TC-GUEST-003.

2. Where it lives

AreaRoute / how to reach
Guest loginhttps://stg-rcme.membervu.com/login — same login page as members; the JWT/role determines the reduced view.
Guest dashboardGuestHomePage.tsx (frontend/pwa-app/src/pages/GuestHomePage.tsx) — renders ProfileCard with isGuest={true}, GuestWelcomeCard, GuestRegistrationsCard.
Guest "My Registrations"MyGuestsTab.tsx under Account — a member's own invited-guests tab, distinct from the guest's own dashboard.
Admin guest roster/admin/guestsAdminGuestsPage.tsx. Sidebar under Members → Guests. Search/filter by event, status, name/email.
Admin guest export"Export CSV" button on AdminGuestsPage.tsxexportAdminGuestsCSV() API client call → GET /api/admin/guests/export.csv.
Event attendee roster (member/guest view)GET /api/events/:eventId/registrations/guests — used both by the event detail page's attendee list and by member self-service views.
Prospect managementMembers → Prospects — separate from guests; a prospect has no account yet.

3. Key API endpoints

ActionEndpointGuard
Admin: list all guests (paginated)GET /api/admin/guestsEVENTS:VIEW:registrations
Admin: export guest roster CSVGET /api/admin/guests/export.csvEVENTS:VIEW:registrations
Event guest roster (member/guest view)GET /api/events/:eventId/registrations/guestsrequireLoggedInAuth + per-row PII redaction (#486)
Add a guest to own event registrationPOST /api/events/:eventId/guestsrequireMemberId()
Cancel own added guestDELETE /api/events/:eventId/guests/:registrationIdrequireMemberId()
Member's own invited-guests listGET /api/members/me/invited-guestsrequireMemberId()-scoped auth
Public event registration (creates guest account)POST /api/public/:tenantSlug/events/:eventId/register (see publicEventsHandlers.ts)public / publicActionLimiter
GDPR delete of a cancelled guest registrationDELETE /api/admin/registrations/:registrationIdEVENTS:EDIT:registrations

4. Test data (RCME seed)

5. Test Cases

TCTopicDetailed
TC-GUEST-002Guest Experience & Conversiondetailed
TC-GUEST-003🆕 Guest Experience & Data Handling (#368, #340, #486)detailed