07 / 10 · White-label helpdesk

TicketFlow

White-label helpdesk with a client portal and an API for agents.

FlowSolutions product2026Built solo

  • Web
  • Backend
TicketFlow kanban board
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 show demo data.

Outcome

  • Interface and e-mails in Croatian, German and English.
  • Playwright end-to-end regression and a clean SonarQube report.
  • Screenshots show demo data.

Stack

  • Next.js 16
  • React 19
  • TypeScript
  • Supabase
  • PostgreSQL
  • next-intl
  • shadcn/ui
  • React Email
  • Resend
  • Playwright
  • Vercel

Links