07 / 10 · White-label helpdesk
TicketFlow
White-label helpdesk with a client portal and an API for agents.

- Languages
- hr · de · en
- MCP tools for AI agents
- 5
- Access control
- Postgres RLS
- Stack
- Next.js 16 · Supabase
TicketFlow is a helpdesk for software companies and their clients. A client signs in, reports a bug, question or feature request and follows it by e-mail. The team takes tickets, comments publicly or in internal notes and closes them. Every customer gets their own instance with their own name, logo, colour and domain, without a code change.
I built it alone, with access control in the database rather than in application code.
Context
- A small software company supports several clients, each with their own products. Requests arrive by e-mail and chat, get lost, and the client never knows the state of their report. Existing helpdesks are priced per agent and look like the vendor, not like the company using them.
- TicketFlow gives each client a portal under the company's brand, and the team one queue with keys per product, like Jira.
What I built
- Next.js 16 app with Server Actions: ticket list and kanban with drag and drop, ticket detail with activity, internal notes, attachments pasted from the clipboard.
- Supabase schema with RLS so a client sees only their company's tickets and never an internal note; ticket keys, status history and reopening handled by database triggers.
- Registration with confirmation link and a self-chosen password, invitations, admin approval, Google sign-in, and rate-limited account e-mails.
- E-mail notifications in the recipient's language with React Email, sent after the response so a mail outage never blocks the UI.
- Voice messages recorded in the browser and transcribed in the background with Whisper via Groq.
- An MCP API with five tools so an AI agent can read tickets, comment and change status under the same RLS and permissions as the key owner.
How it works
- Every ticket gets a key per product (BF-12, CX-3) from one atomic counter in the database.
- A client reply on a ticket that is waiting for them moves it back to "In progress" automatically.
- Attachments go straight from the browser to a private bucket and are read through signed URLs.
- Branding (name, logo, colour, e-mail footer, reply-to) is set in the admin and applies to the app and every mail.
- Each customer gets an isolated instance: own Supabase project, own Vercel project, own domain.
Screens
Screens show demo data.
Tickets by status, moved by drag and drop. List with search, filters, grouping and assignment. Activity, internal notes and attachments on one ticket. The client sees their own tickets and what waits for their reply. Permissions per action, custom roles. A white-label instance: own name, colour and sign-in page, no code change. A client replies with a voice message; the transcript appears under it.
Outcome
- Interface and e-mails in Croatian, German and English.
- Playwright end-to-end regression and a clean SonarQube report.
- Screenshots show demo data.