A real service desk, built for the way IT actually works

Structured workflows. Keyboard-first speed. AI-powered triage. Every feature below is shipped — and every plan unlocks all of it.

Tickets the way you actually work

Structure where it matters, speed everywhere else.

  • Ticket types: Incident, Service Request, Change, Problem, Bug, Feature, Task, Epic — and roll your own
  • Per-workspace ticket keys (INC-42, REQ-101) allocated atomically
  • Custom fields per ticket type, defined inline (text / number / date / select)
  • Configurable workflows with arbitrary states and explicit transitions
  • Parent / child / epic hierarchy with breadcrumbs on every ticket
  • Linked tickets: blocks, duplicates, relates-to, clones, causes, child-of
  • Ticket merge — combine duplicate tickets into one conversation, with messages moved and the duplicate auto-closed and linked
  • Watchers + @mention autocomplete in messages (adds the mentioned person as a watcher)
  • Ticket collaborators — CC external people (a manager, vendor, or second customer contact) by email onto a ticket; they receive every public agent reply and inbound CCs are captured automatically
  • Inline editable subject, story points, components, fix versions, sprints

Multiple views, one inbox

See the same tickets the way your role needs to see them.

  • Queues — built-in (Mine / Unassigned / Urgent / Breached / Awaiting Customer / by Type) and unlimited saved custom ones
  • Kanban board with drag-and-drop status changes and inline column quick-add
  • Backlog with per-sprint sections, moving tickets between sprints, and a live burndown bar
  • Bulk actions: resolve, close, escalate, assign, tag — up to 200 tickets per batch
  • Density toggle (comfortable / compact), sort by deadline / priority / key
  • URL-synced filters: every queue is a shareable link

AI assist

A useful AI, not a chatbot. Falls back gracefully if no key is configured.

  • AI Triage in the New Ticket dialog: suggests type + priority + tags from subject and body
  • AI Draft Reply: composes the next agent reply from the thread and any matching KB articles
  • AI Summarize: 3-bullet summary of the thread — problem, current state, next step
  • Every AI output is cached, attributable, and logged to the audit trail
  • Prompt caching keeps per-call cost low; pay nothing extra when no API key is configured

Workflow & automation

State machines, approvals, and rules that fire on events.

  • Visual workflow editor: define states, colours, categories (todo / doing / done), and allowed transitions
  • Service-request approvals — request, decide, audit (one pending approval at a time per ticket)
  • Automation rules triggered by ticket.created / .updated / .replied with conditional actions
  • Auto-send a templated macro reply on new tickets — instant first-response acknowledgements with personalized tokens ({{contact.first_name}}, {{ticket.subject}}), zero agent effort
  • Macros (canned responses) applied to one ticket or bulk-applied to up to 50
  • Macro actions — a macro bundles ticket field changes (set status, set priority, reassign, add tags) with its reply, so an agent applies an entire workflow like "Escalate to Tier 2" in one click instead of four manual steps; the same field actions also drive on-ticket apply and bulk-apply
  • Automatic ticket assignment — flip one per-queue toggle and every new ticket routes itself to the right available agent the moment it arrives (no automation rule to build): round-robin spreads work evenly, least-busy hands it to whoever has the fewest open tickets, so nothing ever sits unowned blowing its first-response SLA
  • Load-aware auto-assignment is also composable as an automation action (round-robin or least-busy) for conditional routing rules
  • Per-agent availability flag — agents pause auto-assignment with one toggle (out sick, heads-down, end of shift) and new tickets route to whoever is accepting; if nobody is available a ticket is never dropped — it simply stays unassigned until someone frees up; round-robin remembers the last-assigned agent per queue so distribution stays even across restarts
  • Set priority, set status, send macro reply, add tag, notify user — all composable from the rule builder
  • Recurring snooze: defer a ticket until a date or keep it out of the inbox until a customer reply
  • Auto-close inactive resolved tickets after a configurable number of days — with an optional "reply to reopen" courtesy notice — so your backlog clears itself instead of rotting in the resolved column
  • Auto-acknowledgement on ticket creation — every request (portal or inbound email) gets an instant, on-brand "we've received it" confirmation with personalized merge fields; when it lands after hours or on a holiday we append exactly when they'll hear back, computed from your business-hours calendar, so no customer is ever left wondering if their message got through
  • Scheduled replies — write the reply now, send it when it lands best: pick an exact date and time or "next business-hours open" (resolved from the ticket's SLA calendar), and a leased dispatcher delivers it later — posting the reply, emailing the customer, and setting first-response exactly as a live reply would; cancel any pending send before it fires, and closed or merged tickets are skipped automatically

Realtime co-presence

Two agents on the same ticket without stepping on each other.

  • Live "Also viewing" avatars on the ticket detail page
  • Realtime ticket updates via Supabase Realtime — replies appear without refresh
  • Realtime board: cards move between columns as your teammates work
  • In-app notifications page + bell with deep-link to the originating ticket
  • Per-user notification preferences (in-app / email / push) per notification kind

SLA management

Promises you can actually keep.

  • SLA policies with per-priority first-response & resolution targets
  • Business-hours-aware SLA clock with configurable holidays
  • Stop-the-clock SLAs — the resolution timer pauses automatically while a ticket waits on the customer, so your team is measured on its own response time, not customer delay.
  • Assign policies by contact, tag, channel, or workspace default
  • Live SLA countdown on every ticket card — green / amber / pulsing red as it gets close
  • Automatic breach flags on first response and resolution
  • Time-triggered SLA escalation rules — admin-configurable rules that act before and at breach, not just after: auto-escalate at 75% of the SLA window (first-response or resolution), bump priority, reassign to the least-busy agent, or notify only the team lead — each fires exactly once per ticket per stage (no spam), runs under a distributed cron lease so multiple instances never double-escalate
  • escalate_to_role action — notify all owners/admins (or a specific role) when a ticket is heading toward breach, replacing the old blanket notification that pinged every workspace member
  • Response Time Estimator — interactive widget to pre-configure SLA targets before go-live

Analytics & accountability

See the trends, hold the line.

  • Dashboard: 7-day volume sparkline, SLA-at-risk feed, agent workload bars, recent activity stream
  • Reports: configurable window (7/30/90/180d), volume chart, first-reply time histogram
  • Backlog aging: open tickets bucketed by age (< 1 day / 1-3 / 3-7 / 7-30 / 30+) with priority breakdown and posture indicator
  • CSAT distribution + channel mix + ticket-type mix breakdown
  • Tag mix analytics — see what your customers are actually writing in about, with your top support tags ranked by ticket volume and each topic's average CSAT score, so you can spot the highest-volume and worst-scoring subjects straight from the tags your team already curates
  • First Contact Resolution and reopen rate — the master support metric, finally measured: every reopened ticket (status change, workflow transition out of done, or a customer reply to a resolved ticket) is counted, FCR is reported net of reopens so the number can't be gamed, and both surface as threshold-coloured Reports tiles plus per-agent columns on the leaderboard
  • SLA attainment report — historical first-response and resolution attainment (% of tickets that met their SLA deadline), broken down by priority (urgent / high / normal / low) with met/eligible counts; shows how your team has actually performed against configured targets over any reporting window
  • Coverage heatmap — see exactly when tickets arrive vs. when you're staffed, with median response time per hour, so you can fix the off-hours gaps that quietly breach your SLAs; a 7×24 weekday × hour-of-day grid in your workspace timezone with arrival volume and median first-reply toggles, off-hours and holiday cells shaded as unstaffed, and an auto-generated insight ("14% of tickets arrive outside business hours; their median first reply is 6.2h vs 41m in-hours")
  • Deflection metric — a Deflected tile counts KB self-service deflections in the window plus the top deflecting articles, turning the knowledge base into a measurable ROI line next to CSAT and volume
  • Content-gap analytics — see exactly what customers searched for and couldn't find, turned into a prioritized KB writing backlog: every committed help-center search is logged with its result count, and Reports surfaces a zero-result-rate tile plus the top zero-result queries grouped by phrase, so the highest-ROI helpdesk signal (searches that returned nothing) is finally measured instead of thrown away
  • Macro adoption analytics — a Most-used macros card ranks your canned responses by real usage with last-used dates, plus a per-macro "used 142×, last 3d ago" badge, so you can see which replies earn their keep and prune the dead weight
  • Agent leaderboard ranked by resolved + average first-reply minutes, with per-agent CSAT (average score + response count) alongside FCR and reopens — see satisfaction by agent, not just for the team, so you can spot coaching opportunities and recognise top performers
  • Per-ticket time tracking with billable + DCAA-friendly labor categories
  • Time-tracking report — total and billable hours at a glance, the unbilled backlog waiting to be invoiced to Books, and a breakdown by agent and labor category, all on the Reports window selector
  • Automatic CSAT surveys — every resolved ticket triggers a one-click 1-5 satisfaction request (with optional comment) that feeds the CSAT distribution and average in Reports
  • Negative-CSAT alerts — every 1- or 2-star rating instantly flags the ticket, pings the assigned agent, and fires a webhook so you can win back unhappy customers before they churn

Customer-facing surfaces

Deflect tickets, capture satisfaction, never re-explain.

  • Magic-link customer portal — no password, single-use token, brand-coloured
  • Service catalog: customers pick the request type that matches their need, you collect the right custom fields up front
  • Knowledge base with categories and draft / published / archived states
  • Per-article visibility — publish an article to the public help center, keep it internal for agents only, or private to its author; the portal and deflection search only ever surface public articles
  • Ticket deflection — as a customer types their ticket subject, matching published KB articles surface inline ("These might answer your question") before they ever hit submit; opening one instead of filing is recorded as a measurable deflection event
  • Knowledge base feedback — customers rate every article helpful or not from a one-click "Was this helpful?" widget (deduped per visitor), and authors see per-article views plus the helpful / not-helpful split so they know which docs deflect tickets and which need a rewrite
  • Markdown-rendered messages on both sides of the conversation, including inline ticket-key references
  • File attachments via signed URLs; drag-drop straight onto the reply composer

CMDB / Asset management

ITIL-style asset tracking, integrated.

  • Asset registry for servers, services, applications, databases, networks, licenses, hardware, endpoints, sites
  • Status badges (active / degraded / offline / retired) for at-a-glance impact triage
  • Free-form JSON metadata per asset — IP, OS, version, anything
  • Link assets to tickets as "affected" or "related" — incident impact in one glance
  • Asset picker on every ticket with type-ahead search by name or identifier
  • Full-text search across name, identifier, description

Recurring tickets

For the things you have to do every Monday, every month, every quarter.

  • Schedule a ticket template to recreate every N days (1–365)
  • Optional cap on total runs ("create this 12 times then stop")
  • Auto-allocates a fresh key (INC-103, INC-104…) each time
  • Pre-fills type, priority, assignee, tags, affected assets
  • Lazy runner driven by dashboard loads — no cron infrastructure needed
  • "Run on next dashboard load" override for manual triggers

Outbound webhooks

Push ticket events into any system that accepts an HMAC-signed POST — team chat, on-call, automation platforms, your own services.

  • Subscribe per event: created / updated / replied / assigned / resolved / closed / snoozed
  • HMAC-SHA256 signed POSTs (X-Desk-Signature) for verification on your side
  • Per-webhook signing secret, rotateable
  • Configurable retry policy (1-10 attempts) with exponential backoff
  • Custom headers per webhook (e.g. tenant id for the target)
  • Full delivery log: status code, latency, error, attempt count — last 50 deliveries per webhook
  • One-click "Test fire" to validate the wiring before going live

Inbound email-to-ticket

Forwarded email becomes a tracked ticket automatically.

  • Per-workspace inbound key embedded in the webhook URL — no shared secret needed
  • Auto-parses Postmark, Mailgun, SES and SendGrid inbound shapes plus generic
  • Auto-creates the contact from the From: address (or matches an existing one)
  • Routes to a configurable default ticket type and priority per endpoint
  • Allocates a real ticket key (REQ-103) and threads the email body as the first message
  • Receipt count + last-received timestamp visible on each endpoint

API tokens

Programmatic access without sharing your password.

  • Personal access tokens (`hdsk_…`) usable as Bearer auth on any /api/desk/* endpoint
  • Scopes: read-only, read-write, admin
  • Optional expiry, manual revocation
  • SHA-256 hashed at rest — plaintext shown only at creation time
  • Per-token last-used tracking

Saved replies

Personal or team-shared canned responses, inserted from the composer in one click.

  • Personal replies (your own scratchpad) vs. team-shared (admin-created)
  • Optional keyboard shortcut tag (e.g. `/ack`, `/thanks`)
  • Available from a dropdown in every reply composer
  • Markdown supported — bold, lists, links, code
  • Merge fields in saved replies & macros — auto-fill the customer name, ticket key, and your sign-off into canned text ({{contact.first_name}}, {{ticket.key}}, {{agent.name}}); unknown tokens are stripped so a raw placeholder never reaches a customer

Public status page

A public health dashboard powered by your CMDB.

  • One-click enable per workspace — lives at /status/your-slug
  • Asset grid grouped by kind, current status (operational / degraded / offline / retired)
  • Overall posture banner (operational / minor / major / critical)
  • Uptime monitors — active HTTP(S) checks on your own interval with per-monitor timeout, expected-status-code and keyword assertions; up/down transitions update the linked CMDB asset automatically, notify your team, and record a heartbeat history, with one-click "check now"
  • Declare incidents linked to affected assets — posts the asset to degraded automatically
  • Auto-declare incidents from uptime monitors — flip on "Auto-declare public incident" for any monitor and a failed health check opens a public incident (with its own timeline entry) and emails your confirmed subscribers automatically; it resolves itself the moment the monitor recovers. One incident per outage, never a duplicate, and every auto-managed incident stays fully editable in the dashboard. Opt-in per monitor with a configurable impact and failure threshold
  • Public incident timeline with status updates (investigating / identified / monitoring / resolved)
  • Full public incident-history archive at /status/your-slug/history — every past incident, grouped by month with "Load older" pagination, not just the last handful; each row links straight to its own permalink
  • Per-incident permalinks (/status/your-slug/incidents/:id) — a stable, shareable URL for any incident with its full update timeline; the same link is dropped into subscriber notification emails so recipients jump to the exact incident
  • Written postmortems — publish a root-cause retrospective on any incident from the dashboard; it renders below the timeline on the public permalink page (the written retrospective regulated-SaaS buyers expect after a major incident)
  • Schedule maintenance windows in advance — give customers a heads-up before planned downtime, not a red alert during it; shows as a calm "Upcoming" then "In progress" notice (Upcoming / In progress / Completed) that never trips the failure posture or changes any asset status
  • Email subscription for customers who want incident updates — double opt-in (subscribers confirm their own address before any mail is sent); confirmed subscribers are emailed automatically when you declare or update an incident, with the incident title, current status, update body, and a one-click unsubscribe link
  • Machine-readable RSS 2.0 + Atom 1.0 incident feeds at /status/your-slug/feed.rss and /feed.atom — follow every incident in a reader, pipe into Slack/Teams, or trigger automation, no email required; the status page emits autodiscovery link tags so readers find them automatically
  • Custom title, subtitle, contact email, optional custom CSS

Live chat widget

Embed real-time chat on any site you control. Zero deps, ~6KB.

  • One-line `<script>` snippet — drop on any HTML page
  • Customer JS persists session in localStorage; survives page navigation
  • Agent UI at /dashboard/chats with realtime updates via Supabase
  • Brand color, header title, greeting message all configurable
  • "Close + Make ticket" replays the transcript into a real ticket so the conversation persists in your inbox
  • Lives behind the same paywall as everything else — no metered pricing

CSV import

Bulk-onboard hundreds of contacts in one click.

  • Upload .csv from the Contacts page — handles quoted fields, commas in values, multi-line cells
  • Accepts headers: `name`, `email`, `phone`, `company`, `notes`
  • Dedupes on email — re-import the same file safely
  • Bounded to 500 rows per batch with a per-row audit

Organizations / company accounts

A genuine B2B primitive — see every requester and ticket from one customer in a single view.

  • First-class company accounts that group requesters (contacts) under one organization
  • Automatic membership by email domain — a new contact or inbound-email requester on acme.com auto-joins Acme (subdomains too; free-mail providers excluded)
  • Shared account view: the member roster plus the union of everyone's tickets, with an open-ticket count and recent activity
  • Filter the inbox by organization — every ticket across the whole account in one queue
  • VIP flag and free-text notes per account
  • One-click backfill groups your existing contacts by their company name into draft organizations — non-destructive, admin-gated, opt-in
  • Turns the company data your CRM importer already pulls in into something actionable

Dark mode

Light / dark / system. Your retinas will thank you.

  • Toggle from the topbar — cycles light → dark → system
  • System mode follows `prefers-color-scheme` and re-applies on system change
  • Persists per browser via localStorage
  • Comprehensive coverage including KB, customer portal, and admin pages

Installable web app — mobile and desktop

Install the desk as an app from the browser. No store, no review.

  • Web app manifest with theme color, app shortcuts (+ New, My work, Board)
  • Installable on iOS, Android, macOS, Windows, Chromebook
  • Standalone display mode — no browser chrome
  • Tab title shows unread notification count when in the background

Sentry & GitLab integrations

Your error tracker and your repo, wired straight into the queue.

  • Sentry import — a daily sync opens a desk ticket for every unresolved Sentry issue, with configurable minimum level (debug → fatal) and environment filter; imported issues are tracked so re-runs never create duplicates
  • GitLab links — commits and merge requests that mention a ticket key (REQ-101, INC-42) are linked to the ticket via webhook, with a system note recording the ref, title, author and URL
  • Auto-resolve on merge — optionally resolve the referenced ticket automatically when a linked merge request merges, through the same audited resolve pipeline as a human resolve (webhooks + CSAT included)

Hosting suite integrations

CRM, Books and Field, wired in as first-class concepts.

  • Import + search contacts from Hosting CRM
  • Pull a linked invoice from Hosting Books onto any ticket
  • Invoice billable time entries straight to Books
  • Spawn a Field dispatch job from a ticket that needs a tech onsite
  • Soft links — your desk keeps working if a sibling product is disabled

Governance & compliance

Built for regulated SaaS from day one.

  • Tamper-evident, hash-chained audit log on every mutation
  • Filterable audit feed for admins and owners
  • Audit-chain verification endpoint to prove the log is intact
  • CSV audit-log export for external review
  • JSON workspace export — your data leaves with you
  • Optional agent anonymization for customer-facing portal views

Team, workspaces & branding

Multi-agent, role-based, recoverable.

  • Owner / admin / agent / viewer roles with strict role-gated mutations
  • Token-based member invites with expiry and single-use accept
  • Ownership transfer between members
  • Soft-delete a workspace with a restore window
  • Workspace branding: name, brand colour, logo
  • Configurable business hours and holiday calendar
  • Components, fix versions, sprints — full agile planning primitives
  • 14-day free trial; honest per-seat billing thereafter

Built for speed

Designed by people who hate their helpdesk.

  • Global "+ New" button in the topbar; `c` keyboard shortcut from anywhere
  • ⌘K omnibox search across tickets, contacts, messages, KB
  • ⌘↵ to submit any compose form
  • Inline quick-add on Board columns and Backlog sections — type-and-enter to create
  • Ticket cloning (with or without conversation history) as a single click
  • No-config defaults: every workspace ships with 8 ticket types and a default workflow

What you actually get

All shipped

A configurable workflow editor, AI-powered triage and reply drafting, realtime co-presence, a public status page powered by your CMDB, an embeddable chat widget, omnichannel inbound (web, email, chat), an immutable audit chain, and live suite-wide integrations to invoicing and field dispatch — all in one self-hostable product. Every feature available on every plan.