Frappe Helpdesk is a ticket management system built on the Frappe Framework. SLAs, escalation rules, a customer-facing portal, a knowledge base, and email-to-ticket — all as doctypes on the same engine that powers ERPNext, CRM, and HRMS. It pairs naturally with Frappe CRM but installs and runs standalone.
Frappe Helpdesk does what Zendesk and Freshdesk do — receive tickets via email or a portal, assign them to agents, track SLA compliance, and let customers check status — but it's open source, self-hosted, and built on the same Frappe doctype system everything else in the ecosystem uses. That means the same permissions model, the same API surface, and the same hook system.
The frontend is a Vue 3 SPA (like Frappe CRM) rather than the standard Frappe Desk. It provides an agent dashboard, a customer portal, and a knowledge base editor. The backend is pure Frappe doctypes — tickets, agents, SLA policies, canned responses, and knowledge base articles are all documents you can query and manipulate via REST.
Because every ticket is a doctype document with a standard API, an AI agent can triage incoming tickets, auto-assign based on content, draft responses from the knowledge base, and escalate when SLA deadlines approach — all through the same REST calls a human agent's browser makes. No special bot API required.
| Doctype | Purpose | Key fields |
|---|---|---|
HD Ticket | A support request from a customer or internal user | subject, description, status, priority, ticket_type, agent, contact |
HD Agent | A support team member who handles tickets | user, agent_name, group |
HD Service Level Agreement | SLA policy defining response and resolution targets | priority, response_time, resolution_time, support_days |
HD Canned Response | Pre-written reply template | title, message |
HD Article | Knowledge base article for self-service | title, content, category, published |
HD Ticket Comment | Internal note or customer-visible reply on a ticket | content, commented_by, is_pinned |
Create tickets, assign agents, check SLA status, and search the knowledge base — all via the standard Frappe API.
# List open tickets assigned to a specific agent GET /api/resource/HD Ticket ?filters=[["agent","=","[email protected]"],["status","=","Open"]] &fields=["name","subject","priority","creation","contact"] &order_by=creation asc &limit_page_length=25
# Create a ticket from an external webhook POST /api/resource/HD Ticket { "subject": "Cannot access billing portal", "description": "Login returns 403 since this morning.", "ticket_type": "Bug", "priority": "High", "contact": "[email protected]" } # Assign a ticket to an agent PUT /api/resource/HD Ticket/HD-TICKET-00058 { "agent": "[email protected]", "status": "Open" }
# Search the knowledge base for self-service GET /api/resource/HD Article ?filters=[["published","=",1]] &or_filters=[["title","like","%billing%"],["content","like","%billing%"]] &fields=["name","title","category"] # Add a reply to a ticket POST /api/resource/HD Ticket Comment { "reference_ticket": "HD-TICKET-00058", "content": "We've identified the issue. Deploying a fix now.", "commented_by": "[email protected]" }
Email-to-ticket is the primary ingest channel. If Frappe's Email Account setup is wrong — wrong IMAP settings, missing domain verification, or the scheduler not pulling — tickets simply don't arrive. Test this before anything else.
SLA timers only tick during defined support days and hours. If you don't configure the support schedule in the SLA policy, the clock runs 24/7 — which is either what you want or a silent misconfiguration that makes metrics meaningless.
The customer-facing portal is a Frappe website route. It requires the Website module to be active and the portal pages to be properly configured. If you skip this, customers have no self-service view.
The KB is a simple article list with categories. No search weighting, no article versioning, no analytics on which articles deflect tickets. If you need a serious knowledge base, you may want Frappe Wiki alongside Helpdesk.