Using Lunax

Support tickets

A ticket is a private conversation between one customer and your support staff, scoped to a single app. This page covers both sides — opening a ticket as a customer, and working the queue as an agent.

The lifecycle of a ticket

Every ticket follows the same arc. Nothing here is configurable — there are no custom workflows or automation rules.

StepWhat happensWho does it
1. CreatedTicket gets a per-app number (#1, #2…) and status OpenCustomer, widget, or API
2. NotifiedRequester gets a confirmation email; every agent and admin is emailed tooAutomatic
3. Picked upAn agent assigns it — to themselves or a teammateAgent
4. WorkedPublic replies go to the customer; internal notes stay privateAgent
5. ResolvedAgent sets status to Resolved; requester is emailedAgent
6. ClosedAgent sets status to Closed — the customer can no longer replyAgent
Resolved and Closed are different on purpose
A Resolved ticket can still be replied to — and a customer reply automatically reopens it. A Closed ticket hides the reply box entirely, and there is no way for the customer to reopen it. Use Closed only when you mean it.

Statuses and priorities

Status

StatusMeansSet by
OpenNeeds attention. Every new ticket starts here.Automatic on create, or an agent
PendingWaiting on the customer. Set automatically when an agent replies publicly.Automatic or agent
On holdParked — blocked on something else. Nothing happens automatically.Agent
ResolvedBelieved fixed. Customer can still reply, which reopens it.Agent
ClosedFinished. The customer loses the ability to reply.Agent

Priority

Four levels: Low, Normal (the default), High, and Urgent. High and Urgent are the only two that get a coloured badge, so they stand out in the inbox at a glance.

Customers can set their own priority — including Urgent
The priority dropdown on the customer ticket form is unrestricted. Priority is a signal to triage, not a promise, and it does not drive any SLA or escalation. Agents should re-set it during triage.

Category

General (default), Billing, Bug, Account, Other. This list is fixed — it can't be edited from the admin UI. The category is shown on the ticket but is not a filter in the inbox.

Customer — open a ticket

  1. Sign in, then go to /my/tickets/new — or click New ticket from the home page.
  2. App — pick which product this is about. If you arrived from a board link the right app is pre-selected.
  3. Subject— required. One line naming the problem, e.g. “CSV export returns an empty file”.
  4. Description — required. What you expected, what happened, and how to reproduce it.
  5. Screenshots or video — optional, up to 5 files at 50 MB each.
  6. Category and Priority — leave at General / Normal unless you know better.
  7. Submit. You land on the ticket and get a confirmation email.
Write the description as if the reader can't see your screen
Agents see nothing about your session — no browser, no account state, no logs. The description and attachments are all they get. A screenshot is worth three paragraphs.

Customer — track and reply

/mylists every ticket you've opened, most recently updated first, with its status and priority. There's no search or filter on this page — it's a plain list.

Open any ticket to read the thread, oldest message first. Your own messages are tinted. Type in the reply box and press Send reply to respond.

  • You will never see internal staff notes — they are filtered out server-side.
  • You can't attach files to a reply, only to the original ticket.
  • You can't change status, priority, or assignee.
  • Replying to a Resolved ticket reopens it automatically. A Closed ticket has no reply box — open a new ticket instead.

Agent — the inbox

/inbox is the shared queue across every app. It is not per-agent — everyone sees the same list, including tickets assigned to someone else.

ColumnShows
#Per-app ticket number
SubjectSubject, with the app name underneath
StatusCurrent status badge
PriorityPriority badge — only High and Urgent are coloured
RequesterThe customer's email
AssigneeAssigned agent, or “Unassigned”
UpdatedRelative time since the last activity

Filtering

  • Search— matches the subject, the ticket number, and the requester's email. It does not search message bodies or assignee names.
  • Status and App dropdowns narrow the list further. All three combine.
The inbox loads the 200 most recently updated tickets
Filtering and search run over those 200 rows in your browser — they do not query the whole database. Once a workspace passes 200 active tickets, older ones fall off the bottom and become unreachable from this screen. Sorting by clicking a column header is also not wired up yet; the order is always most-recently-updated first.

Agent — working a ticket

Open a ticket from the inbox. The right-hand sidebar holds every control; each change saves immediately and shows a toast.

  • Status — all five values. Changing it emails the requester.
  • Priority — all four values. Changing it emails nobody.
  • Assignee — any agent or admin, or Unassigned. Changing it emails nobody.
  • Assign to me — one-click self-assign.
Assignment does not restrict anyone
Assigning a ticket only changes who future customer replies notify. It does not lock the ticket — any agent can still reply to or edit any ticket. Treat it as a claim, not a lock.

The category can't be changed from this sidebar, even though the ticket displays it.

Agent — internal notes

The reply box on the agent side has an Internal note (hidden from customer) checkbox. Tick it and the message becomes staff-only: it renders with an amber border and an Internal chip, and the button changes to Add note.

Public replyInternal note
Customer sees itYesNo — hidden three ways over
Emails the customerYesNo
Changes the statusOpen → PendingNever
Appears in the threadPlain backgroundAmber, with an “Internal” chip
Internal notes are genuinely private
Hiding is enforced at three layers — the API refuses to mark a non-staff message internal, the customer's page filters them out, and a database policy blocks the row even if someone queries directly. Attachments on internal notes are hidden the same way.

Automatic status changes

Two transitions happen without anyone touching the status dropdown:

WhenStatus becomes
An agent posts a public reply on an Open ticketPending
A customer replies to a Resolved ticketOpen

Internal notes never move the status. Any message — public or internal — does bump the ticket's “updated” time, which is what re-sorts it to the top of the inbox.

Attachments

LimitValue
Files per ticket5
Size per file50 MB
ImagesPNG, JPEG, WebP, GIF — shown inline
VideoMP4, WebM, MOV — playable in the thread
DocumentsPDF, plain text — shown as a filename chip
WhenOnly at ticket creation — replies can't carry files

Files are stored privately and served through links that expire after one hour, so the page regenerates them each time you load the ticket. There is no way to delete an attachment once it's uploaded.

A rejected file can still leave a ticket behind
File validation currently runs after the ticket is created. If an upload is rejected for being too large or the wrong type, you'll see an error but the ticket may already exist in the inbox without its attachment. Re-attach by replying, or open a fresh ticket.

Who can do what

ActionCustomerAgentAdmin
Open a ticketYesYesYes
See their own ticketsYesYesYes
See everyone's ticketsNoYesYes
Reply publiclyOwn onlyAnyAny
Write internal notesNoYesYes
Read internal notesNoYesYes
Change status / priority / assigneeNoYesYes
Attach filesAt creationAt creationAt creation
Delete a ticketNoNoNo — nobody can

Access is enforced in the middleware, again on each page, again in the API, and finally by database row-level security. A customer who guesses another person's ticket URL gets a 404.