Skip to content

Customer Portal 1.0.0 — Production Readiness ​

FieldValue
ScopeMarketplace module customer-portal 1.0.0 + Help Desk note portal_user_id (1.12.0 → 1.13.0)
Date2026-10-06
E2Etest:e2e:customer-portal — 3/3 passed (smoke + full human workflow)

Locked scope ​

Invite-only Contact portal accounts (email/password), separate portal-api guard, staff invite/manage UI, customer SPA for invoices/payments/quotations/contracts/Help Desk. Projects/tasks, magic-link login, public KB, Vendor Portal out of scope.

Audit report (2026-10-06) ​

IDSeverityFindingResolution
A1HighPortal login/accept did not persist workspace domain; after navigate away from ?workspace=, X-Tenant-Domain was missing → 401 on document APIsFixed: portalWorkspaceStorage (dc_saas_portal_workspace) set on login/accept; axios reads it first; cleared on logout
A2MedPlaywright tenant project omitted customer-portal testMatchAdded to playwright.config.ts
A3MedSmoke/workflow needed video: 'off' (ffmpeg missing in some agents)Top-level test.use({ video: 'off', … })
A4LowContract create in e2e omitted required start_dateFixed in workflow seed
A5InfoInvite tokens are hash-only (no plaintext in API)E2E plants known token via runBackendTinker after real invite

Verification matrix ​

CheckBackendFrontendDocs
Catalog free Operations + contacts hard depPassPass (Marketplace)Pass
PortalUser invite / accept / login / disablePass (Pest)Pass (e2e)Pass
PortalRecordScope + PDF servicesPass (Pest)Pass (e2e lists)Pass
Help Desk stamp contact + portal_user_id notesPass (Pest)Pass (e2e)Pass
Soft module 403 / hidden sectionsPassPassPass
Isolated portal auth + workspace storageN/APass (A1 fix)Pass
Human e2e: validation + invite + docs + supportN/A3/3Pass

Go-live ​

  1. Migrate Backend (customer-portal + help-desk 1.13.0)
  2. Deploy Frontend (includes portal workspace persistence)
  3. Install Contacts → Customer Portal on target workspace
  4. Invite one Contact end-to-end on a non-tenant-bound SPA host (workspace field / ?workspace=)
  5. Confirm Vendor Portal remains unshipped

Pest / Playwright ​

  • tests/Feature/Tenant/CustomerPortal/* + catalog seeder / help-desk 1.13.0 bump
  • npm run test:e2e:customer-portal (set E2E_BROWSER_CHANNEL=chrome when bundled Chromium is unavailable)

Official documentation for the EloSync SaaS Platform.