Skip to content

Support

The support admin pages live at /admin/support/ and let you curate the structured taxonomy used by the Support system.

Three sub-pages

  • Manage Categories — top-level grouping (e.g. Account, Billing, Connections, Composer).
  • Manage Labels — fine-grained tags applied to support items (e.g. migration, saml, stripe).
  • Manage Types — content types (e.g. how-to, troubleshooting, FAQ, policy).

Item shape

Each row is a small entity:

typescript
{
  id: string,
  name: string,
  icon: string,         // lucide name or emoji
  color: string,        // hex / named color
  status: number,       // 1 = active, 0 = archived
}

The frontend uses the same <AddDialog> and inline-edit affordances across all three pages — operations are list, add, edit, delete.

API

Categories, labels, and types are persisted via the support items API (the frontend hook is useSupportItems with a type query param). The exact endpoint paths follow the conventional REST pattern under /api/v1/support-items.

Tickets

The ticket queue

Admin → Support → Tickets is the queue. It opens on Needs attention, which is every ticket with admin_read: 0 — new ones, and ones where the customer has replied since you last looked. Opening a ticket clears the flag; a customer reply sets it back, so nothing has to be remembered.

Each ticket shows who wrote it, their workspace, plan and subscription status, so you never have to go and look those up — the user-facing docs ask people to include their workspace name, and this is why they no longer need to.

Replying posts into the same thread the customer sees, sends them an e-mail and an in-app notification, and moves an Open ticket to In progress. A customer replying to a Resolved ticket reopens it. A Closed ticket stays closed until someone deliberately reopens it.

Statuses are 1 = Open, 2 = In progress, 3 = Resolved, 4 = Closed. Only staff can set In progress — it is a claim about what support is doing.

Set SUPPORT_NOTIFY_EMAIL

Without it, tickets are still recorded and still readable here, but nobody is e-mailed when one arrives, so the queue only moves when someone thinks to check it. It is comma-separated and has no default on purpose: a wrong default would drop support mail into someone else's inbox, which is worse than sending none. The server logs a warning at boot when it is unset.

API: GET /admin/support/tickets, GET /admin/support/tickets/:id, POST /admin/support/tickets/:id/reply, PATCH /admin/support/tickets/:id, GET /admin/support/stats — all admin-only.