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.
| Step | What happens | Who does it |
|---|---|---|
| 1. Created | Ticket gets a per-app number (#1, #2…) and status Open | Customer, widget, or API |
| 2. Notified | Requester gets a confirmation email; every agent and admin is emailed too | Automatic |
| 3. Picked up | An agent assigns it — to themselves or a teammate | Agent |
| 4. Worked | Public replies go to the customer; internal notes stay private | Agent |
| 5. Resolved | Agent sets status to Resolved; requester is emailed | Agent |
| 6. Closed | Agent sets status to Closed — the customer can no longer reply | Agent |
Statuses and priorities
Status
| Status | Means | Set by |
|---|---|---|
| Open | Needs attention. Every new ticket starts here. | Automatic on create, or an agent |
| Pending | Waiting on the customer. Set automatically when an agent replies publicly. | Automatic or agent |
| On hold | Parked — blocked on something else. Nothing happens automatically. | Agent |
| Resolved | Believed fixed. Customer can still reply, which reopens it. | Agent |
| Closed | Finished. 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.
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
- Sign in, then go to
/my/tickets/new— or click New ticket from the home page. - App — pick which product this is about. If you arrived from a board link the right app is pre-selected.
- Subject— required. One line naming the problem, e.g. “CSV export returns an empty file”.
- Description — required. What you expected, what happened, and how to reproduce it.
- Screenshots or video — optional, up to 5 files at 50 MB each.
- Category and Priority — leave at General / Normal unless you know better.
- Submit. You land on the ticket and get a confirmation email.
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.
| Column | Shows |
|---|---|
| # | Per-app ticket number |
| Subject | Subject, with the app name underneath |
| Status | Current status badge |
| Priority | Priority badge — only High and Urgent are coloured |
| Requester | The customer's email |
| Assignee | Assigned agent, or “Unassigned” |
| Updated | Relative 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.
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.
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 reply | Internal note | |
|---|---|---|
| Customer sees it | Yes | No — hidden three ways over |
| Emails the customer | Yes | No |
| Changes the status | Open → Pending | Never |
| Appears in the thread | Plain background | Amber, with an “Internal” chip |
Automatic status changes
Two transitions happen without anyone touching the status dropdown:
| When | Status becomes |
|---|---|
| An agent posts a public reply on an Open ticket | Pending |
| A customer replies to a Resolved ticket | Open |
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
| Limit | Value |
|---|---|
| Files per ticket | 5 |
| Size per file | 50 MB |
| Images | PNG, JPEG, WebP, GIF — shown inline |
| Video | MP4, WebM, MOV — playable in the thread |
| Documents | PDF, plain text — shown as a filename chip |
| When | Only 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.
Who can do what
| Action | Customer | Agent | Admin |
|---|---|---|---|
| Open a ticket | Yes | Yes | Yes |
| See their own tickets | Yes | Yes | Yes |
| See everyone's tickets | No | Yes | Yes |
| Reply publicly | Own only | Any | Any |
| Write internal notes | No | Yes | Yes |
| Read internal notes | No | Yes | Yes |
| Change status / priority / assignee | No | Yes | Yes |
| Attach files | At creation | At creation | At creation |
| Delete a ticket | No | No | No — 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.