Built mockup — not a screenshot
The problem
Clients ask the same three questions: is my service up, what happened to my ticket, and what do I owe. Answering those by message is slower for everyone than showing them.
The approach
A session-authenticated portal reading per-user records, with a first-admin bootstrap flow and admin-only user creation. The support chat is identified with the signed-in account rather than starting a cold conversation every time.
The architecture
- Session auth with hashed passwords and an enforced password policy
- PDO data layer with per-user service, ticket and billing records
- Self-healing schema — a missing column is added on boot rather than failing the page
- CSRF tokens on every state-changing form
- Cloudflare Turnstile support on public forms
- Chatwoot live chat identified to the authenticated user, with session reset on logout
Result
Built so the portal degrades rather than breaks: when a schema column or a record is missing, the page renders an honest empty state instead of a fatal error.
Your next system starts here.
Have a technical problem worth solving?