Skip to content
Service · Helpdesk module

A helpdesk ticketing system that already knows who the customer is

Most support teams run a separate ticketing tool, and half of every ticket is someone switching to the ERP to check the contract, the serial number and whether the last invoice got paid. A helpdesk ticketing system that lives inside ERPNext or Odoo skips that step. Describe your queues and SLAs in plain English and erpfly writes the module.

ERPNext v16

Works with ERPNext v15 and v16, and Odoo 17, 18 and 19.

Features

What your helpdesk module can do

SLA clocks that follow your working week

Response and resolution targets per priority and per contract tier, paused outside support hours and on the holidays you actually take.

Contract check before anyone reads it

An incoming email links to the Customer, looks up their contract or warranty, and sets priority on arrival. Agents open a ticket that is already sorted.

Escalation you can read in one file

Tickets close to breach get reassigned by a short Python rule with a test beside it. No chain of automations that only one person understands.

Closing means the work is done

Required resolution notes, a root cause picklist and an optional customer confirmation step before status can move to Closed.

Tickets that can start real work

Raise a Warranty Claim, a return or a billable service visit from the ticket, with the serial number and customer carried over.

The output

What actually gets generated

Real files in a real repository. Here’s the typical output when someone asks for helpdesk.

ERPNext / Frappe app

  • Custom fields on Issue (support tier, escalated flag, root cause)
  • Service Level Agreement records per contract tier
  • Escalation job in scheduler_events (hooks.py)
  • Email Account routing into Issue by mailbox
  • Ticket ageing Script Report
  • HD Ticket extensions if you run the Frappe Helpdesk app

Odoo addon

  • helpdesk.ticket inheritance with contract fields (Enterprise)
  • helpdesk.sla policies per customer tier
  • helpdesk.team routing and assignment rules
  • ir.cron escalation action
  • Closing constraint on helpdesk.stage changes
amc_support/support/escalation.py
import frappe
from frappe.utils import now_datetime, add_to_date
from frappe.desk.form.assign_to import add as assign_to

def set_priority_from_contract(doc, method=None):
    """Issue.before_insert. support_tier is a custom field on Customer."""
    if not doc.customer:
        return
    tier = frappe.db.get_value("Customer", doc.customer, "support_tier")
    if tier == "AMC":
        doc.priority = "High"

def escalate_at_risk_issues():
    """Runs every 15 minutes from scheduler_events in hooks.py."""
    cutoff = add_to_date(now_datetime(), minutes=30)
    issues = frappe.get_all(
        "Issue",
        filters={
            "status": "Open",
            "first_responded_on": ["is", "not set"],
            "response_by": ["<", cutoff],
            "escalated": 0,
        },
        fields=["name", "subject", "issue_type"],
    )
    for issue in issues:
        lead = frappe.db.get_value("Issue Type", issue.issue_type, "team_lead")
        if not lead:
            continue
        assign_to({"doctype": "Issue", "name": issue.name, "assign_to": [lead],
                   "description": f"SLA at risk: {issue.subject}"})
        frappe.db.set_value("Issue", issue.name, "escalated", 1)
Trimmed excerpt. The full module includes tests, fixtures and a README.

How it works

From a paragraph to a pull request

The long version
  1. 01

    Describe it

    In your own words. Paste the spreadsheet or a photo of the paper form if that's easier.

  2. 02

    Answer a couple of questions

    It asks only what it can't work out from your setup, like who's allowed to override.

  3. 03

    Try it on a sandbox

    A copy of your site with the module installed. Break it, then ask for changes.

  4. 04

    Merge when it's right

    Code lands as a pull request with tests. Your developer, or ours, reviews it first.

Picking the base for your helpdesk ticketing system

People say “the ERPNext helpdesk” and mean different things, so it’s worth sorting this out first.

ERPNext ships an Issue DocType in its Support module, with Service Level Agreement, Issue Type and Issue Priority around it. It’s plain, it works, and it sits right next to Customer, Serial No and Warranty Claim. Then there’s Frappe Helpdesk, a separate Frappe app with its own agent interface and its own ticket object (HD Ticket). Nicer to work in, but a different data model.

On Odoo, Helpdesk is an Enterprise app. Community users either install the OCA helpdesk_mgmt addon or build something small themselves.

None of these is wrong. What matters is that your helpdesk ticketing system extends the one you already have instead of adding a fourth.

What support managers actually want changed

After enough of these projects the requests start to rhyme. Hardly anyone asks for more ticket fields. They ask for things like:

  • Different response targets for contract customers and everyone else, measured in working hours.
  • Tickets from a specific mailbox or domain landing in the right team without triage.
  • A rule for what happens 30 minutes before a breach, rather than a report about it the next morning.
  • A closed ticket that has a reason attached.

Stock SLA settings get you partway. The rest is always specific to your contracts, and that’s the part erpfly writes as code in your own app, wired in through hooks.py or an Odoo addon manifest.

There’s a reporting side too. Support managers rarely want a dashboard with 14 tiles. They want to know which customers eat the most time, which products generate the most tickets, and how many tickets reopened within a week of closing. Those three questions make a decent Script Report or pivot view, and they’re far more useful when the ticket already links to the item, the serial number and the contract. A separate ticketing tool can’t answer the second one without an export and a long afternoon in a spreadsheet.

Worked example: an equipment servicing company

Picture a firm that services commercial kitchen equipment. Three support agents, one team lead called Sunita, roughly 40 tickets on a normal day. About a third of customers hold an annual maintenance contract (AMC).

Support hours are 8:00 to 18:00, Monday to Friday. AMC customers get a first response within 4 working hours. Everyone else gets 10 working hours, which is one support day.

A combi oven fails and an AMC customer emails at 16:40 on a Friday. The ticket links to the customer by email domain, reads their tier and sets priority to High. The clock runs 1 hour 20 minutes on Friday, stops at 18:00, and picks up Monday morning. The response is due at 10:40 Monday. At 10:10, if no agent has replied, the escalation job assigns it to Sunita and marks it so it doesn’t fire twice.

When an engineer has to go on site, the agent creates a service visit straight from the ticket. The serial number and address come across, so the engineer doesn’t retype them.

That’s the snippet on this page, more or less. About 30 lines, plus a custom field or two.

When we’d advise against it

Some helpdesk projects shouldn’t happen, or shouldn’t happen yet.

If you get five tickets a week, a shared inbox with labels will serve you fine. Building SLA timers for that volume is ceremony.

If support is a 60-seat operation with phone, chat, social and a knowledge base all feeding one queue, a dedicated support platform probably fits better. Sync the customer and contract data from the ERP and let it do what it’s good at.

And please don’t create 12 priority levels. Agents use three. The other nine turn into a sorting argument.

Tickets as the start of a chain

A ticket that stays a ticket is only half useful. The payoff comes when it turns into a field service visit with the right parts, or flags a pattern on a machine in your asset register. Sales should see open tickets on the account too, which is easy when the helpdesk and the CRM module share one customer record.

If you’re still deciding which platform to build on, our ERPNext vs Odoo comparison covers how licensing affects things like Helpdesk. For changes to an existing ERPNext site, see ERPNext customization.

Guides and terms for helpdesk

Helpdesk module questions

Something missing? Email hello@erpfly.com and a person will answer.

Should we use ERPNext's Issue or the Frappe Helpdesk app?

If agents are already in the ERPNext desk all day, Issue with Service Level Agreement is enough and simpler to extend. If you want a dedicated agent screen and a cleaner customer portal, Frappe Helpdesk is the better base. erpfly can generate against either, and we'll ask which one you run before writing anything.

Odoo Helpdesk is Enterprise. What if we're on Community?

We can extend the OCA helpdesk_mgmt addon or generate a smaller ticket addon of our own on Community. You won't get Enterprise features like the built-in SLA reports for free, so we'd build only the SLA logic you actually use.

Can we move our history over from Zendesk or Freshdesk?

Yes. We generate an import script that maps their ticket, requester and comment exports onto Issue or helpdesk.ticket, including attachments where the export includes them. Old tickets usually come in as closed with their original dates, so your SLA reports don't suddenly look terrible.

Will the SLA timers survive an upgrade?

The SLA logic sits in its own app or addon and uses the standard SLA objects where they exist, so a version upgrade doesn't overwrite it. Run the included tests after a major jump, because field names on Issue have shifted between ERPNext versions before.

Can customers raise tickets from their phone?

Through email, always. Through the customer portal, yes, since both ERPNext and Odoo portals work in a mobile browser. A native app is a separate project and we'd question whether you need one.

How long before we can take real tickets?

A working first version takes minutes to generate. Plan on a week of running it alongside your current tool before switching the support@ mailbox over, because that's when the odd routing cases show up.

Your next module is one paragraph away

Write it the way you’d explain it to a new hire. We’ll turn it into an app you can read, test and install.

ERPNext v16

Create your account

Free to start. No card needed.

By signing up you agree to our terms and privacy policy.