Customer Portal Module
Free Operations Marketplace module that gives invited Contacts a separate login to view their invoices, payments, quotations, and contracts, and to submit/track Help Desk tickets. Staff remain in the workspace SPA; customers use the isolated portal shell (/#/portal/*).
Not Vendor Portal / not Stripe billing portal
This is an end-customer account hub for CRM Contacts. Vendor self-service stays parked. Stripe/Creem “customer portal” links are SaaS subscription billing for the workspace itself — unrelated.
Guides
| Audience | Document |
|---|---|
| Operators / workspace users | customer-portal.md |
| Engineers | customer-portal.md |
| Production / ops | customer-portal.md |
| Production readiness | customer-portal-1-0-0-production-readiness.md |
| Tenant API | ../api/tenant-v1-customer-portal.md |
Capabilities (1.0.0)
- Invite-only portal accounts linked 1:1 to a Contact (email + password; no open self-registration)
- Separate Sanctum guard (
portal-api) — never staffUser/ Spatie roles - Staff: Operations → Customer Portal list; Contact record invite / resend / disable / enable
- Customer SPA: login, forgot/reset password, accept invite, dashboard
- Soft-gated sections: Invoices, Payments, Quotations, Contracts, Support (Help Desk)
- Document PDF download; quotation/contract acceptance-link from portal (existing public accept pages)
- Help Desk: customer creates tickets (contact stamped server-side) and adds notes
Permissions (staff)
customer-portal.view · invite · manage
| Role | Grants |
|---|---|
| admin | All |
| manager | view, invite, manage |
| staff | view, invite |
Licensing
- Catalog slug:
customer-portal, categoryoperations, version 1.0.0 is_default_included = false,is_billable = false- Hard dependency:
contacts - Soft:
invoices,payments,quotations,contracts,help-desk(section hidden / API 403 when not entitled)
Explicitly deferred
- Projects / tasks visibility
- Magic-link passwordless login
- Public Knowledge Base
- Vendor / reseller portals
- Online payment checkout
- Portal 2FA / passkeys