16 · Tickets & appointments

Service-desk ticketing (with public portal / feedback-style categories), salon-style appointments + stylists, and how they connect — including the real code path where booking can create a billable ticket.

Public portal can be enabled per tenant Appointments → ticket link exists in code Not movie admission seating tickets

Two related products (not one blob)

Tickets (service desk)Appointments (booking)
Job Track work items: support, repair, feedback, orders-as-tickets, etc. Schedule time with staff (stylists, etc.)
Staff UI /tickets, service desk, settings, portal designer /admin/appointments, active stylists
Public UI /:slug/public/ticket, /support/:slug /book/:slug
API /api/tickets, /api/public/* ticket routes, admin ticket-settings /api/appointments, /api/public/appointments
Feature gate tickets (plan) appointments feature flag on mounts
Your instinct was right Appointments can create/link a ticket for billing/tracking. Public ticket portal + categories (including “Compliment”) is how feedback-style intake works — not a separate “feedback app,” but the same ticket system with portal + categories enabled.

Ticketing system

Staff surfaces

PathPurpose
/ticketsDashboard
/tickets/new · /tickets/search · /tickets/:idCRUD / detail
/admin/ticket-managementService desk simple UI
/admin/ticket-settingsPortal on/off, categories, SLA-ish settings
/admin/settings/ticket-portal-designerPublic form designer
Staff portal …/ticketsMy tickets (staff view)

Backend

  • /api/tickets — list/create/update/status; scopes tickets:read/write
  • Types include: incident, request, change, task, asset, kb, order, bizticket, customsvc
  • Workflows: ticketWorkflow.service.js (auto-assign, escalation, transitions when enabled)
  • SLA: ticketSLA.service.js
  • Notifications: ticketNotification.service.js
  • Queue numbers: ticketCounter — “now serving #42” style
  • Optional bill / POS invoice hooks on tickets (maybeCreatePosInvoiceForTicket)

Public portal & feedback-style use

flowchart LR
  SET[Ticket settings
publicPortalEnabled] CAT[Categories
Inquiry · Issue · Compliment …] FORM[Portal form designer] PUB[Public URLs] TK[(tickets table)] STAFF[Staff service desk] SET --> PUB FORM --> PUB CAT --> PUB PUB -->|submit| TK --> STAFF

Enablement (per tenant)

SettingMeaning
publicPortalEnabledTurn public intake on/off
allowGuestTicketsGuests without login can submit
requireLoginOpposite policy — force account
Portal URLBackend-generated: /{tenantSlug}/public/ticket
Theme / language / timezonePortal presentation

Public endpoints (public.tickets.routes.js)

PathPurpose
GET /api/public/portal-form/:tenantSlugForm config for designer-driven portal
GET /api/public/categories/:tenantSlugCategories for the form
POST /api/public/tickets/:tenantSlugSubmit a ticket
POST …/trackTrack existing ticket
Comments endpointsPublic follow-up on a ticket number
Knowledge base routeKB surface for tenant

Feedback without a separate product

Default category seeds include things like General Inquiry and Compliment (“Share positive feedback”). Businesses enable the public portal and use categories (or custom categories) for feedback, complaints, warranty, etc. Same ticket pipeline → same workflows/SLA/staff desk.

UI entry points: /support/:tenantSlug (SupportPortal), /:tenantSlug/public/ticket, legacy /tickets/public.

Appointments & stylists

SurfacePathRole
Appointments list/admin/appointmentsSchedule board / list
Active stylists/admin/appointments/stylistsWho appears on public booking
Public booking/book/:tenantSlugCustomer picks staff/time
  • API: /api/appointments (+ staff sub-routes) with feature gate appointments
  • Public: /api/public/appointments/:tenantSlug — available slots, staff, create booking
  • Stylists managed via /api/appointments/staff — “active stylists appear in public portal”

What this is not

ConceptReality in GPE today
Movie admission / seat inventory tickets Different product idea — floor seat IDs + invoicing; not this service-desk ticket engine
Kitchen tickets kitchen_tickets / KDS — separate table and flow (see DocHub 15)
Standalone “Feedback app” Portal + categories + tickets, not a separate app package

File anchors

ConcernPath
Tickets APIbackend/routes/tickets.routes.js
Admin tickets / settings / workflowsadmin.tickets · admin.ticket-settings · admin.ticket-workflows
Public ticketspublic.tickets.routes.js
Portal designer UITicketPortalDesigner.jsx · TicketSystemSettings.jsx
Public portal UIPublicTicketPortal.jsx · SupportPortal.jsx
Appointmentsappointments.routes.js · appointment-staff.routes.js
Public bookingpublic.appointments.routes.js · AppointmentBooking.jsx
Stylists UIActiveStylists.jsx
Workflow / SLA / notifyticketWorkflow.service.js · ticketSLA.service.js · ticketNotification.service.js
OAO13-TICKETS-AND-APPOINTMENTS.md

Related DocHub