April 14, 2025

Our ticketing system in EspoCRM

As our business grew, so did the complexity of our customer communication. For many years, we used OTRS to handle incoming support messages. It worked well, but when the open-source edition was discontinued, we needed a solution that fit better with our evolving tech stack.

At the same time, our team had already moved most of our internal workflows — tasks, sales, operations — into EspoCRM. So the question became: why not also bring support into the same place? Instead of finding a new external ticketing platform, we made a strategic decision: build a fully integrated Ticketing System directly into EspoCRM, tailored to our exact needs.

In this article, we’ll walk you through how our system works, why we built it this way, and how we can help you implement a similar solution for your business.


Why We Didn’t Use the Case Entity for Support

EspoCRM already includes a Case entity, and at first glance, it might seem like a good fit for handling tickets. However, in our workflow, we use Cases differently.

A Case, in our environment, is used for matters that need to be resolved but are more complex in nature — such as:

  • Coordinating with government institutions
  • Managing tender procedures
  • Handling legal or procedural escalations

These are long-lived issues, often with multiple steps or departments involved. On the other hand, support tickets tend to be shorter, more frequent, and communication-heavy. That’s why we decided to build a separate entity called “Ticket” — borrowing some functionality from Cases but with its own identity and optimized flow.


Core Features of the Ticket Entity We Built

Our custom Ticket entity is lightweight but powerful. It focuses on practical support tasks, smooth team collaboration, and a clean experience for customers. Here’s how it works:

Ticket Structure

Every ticket includes the following key components:

  • Name / Subject: A clear title for fast identification
  • Status: Open, In Progress, Pending, Closed
  • Priority: Low, Normal, High, Urgent — used to determine response deadlines
  • Related Entities:
    • Account: The customer company
    • Contact: Individual involved
    • Lead: For pre-sales inquiries
    • Task: If a task is opened from a ticket, the ticket automatically appears in that task’s activity stream

We also store:

  • A description field for internal or external notes
  • Attachments, which are handled in a GDPR-safe way (more below)
  • A stream, where all communication is centralized

How We Handle Email Conversations

Tickets are tightly connected with email communication. We’ve set up several email identities for different regions and languages — the default being [email protected]. Agents can quickly choose the correct identity from a dropdown, and our system will automatically load the appropriate email template.

Here’s how the process works:

  1. Inbound Email: When a customer sends an email, our parser checks the subject and message body. If it matches an existing ticket ID, the message is added to that ticket’s stream.
  2. Replying: From the stream, our team can write a reply. If the message is not marked as “internal”, it’s sent directly to the customer via email.
  3. Internal Notes: Marked messages stay in the stream but don’t get sent — useful for technical collaboration.

By keeping communication within the ticket stream, we avoid messy inboxes and maintain a single source of truth.


Using the Customer Dashboard for Ticket Interaction

Some of our clients have access to our customer dashboard, where they can see their ticket history and reply directly through a chat-like interface. This not only improves transparency but also reduces the need for back-and-forth emails.

The dashboard shows the full stream, including messages, attachments, and ticket status. It’s simple, intuitive, and secure.


Handling Attachments with GDPR Compliance

As a European company, we’re particularly focused on data privacy and security. That’s why we built the ticketing system to comply with GDPR requirements from day one.

Instead of attaching files directly in emails, we use our own extension called Dubas Send. Here’s how it works:

  • When uploading a file to a ticket message, the file is stored and linked to the message.
  • Instead of embedding the file in an email, the system generates a secure download link.
  • This link is added to the email — and can be revoked at any time if needed.
  • We can also set expiration dates or restrict access.

This approach offers several advantages:

  • We avoid sending large files through email
  • We retain control if a file is sent to the wrong recipient
  • Customers can download files safely with full tracking

It’s a small but powerful feature that improves both security and customer trust.


Managing Response Times and Escalations

We’ve also built a basic SLA system into the ticket module. Here’s how it works in practice:

  • Each ticket priority has a predefined response time
  • If the assigned agent does not reply within that timeframe, the system sends a notification to their supervisor
  • The goal isn’t to enforce pressure, but to maintain accountability and avoid bottlenecks

This setup helps us deliver consistent service — and gives managers an overview of how the support team is performing.


Working with Pending Tickets

Often, support requires a waiting period — maybe we’re waiting for customer feedback, or the issue is under review. That’s where the Pending status comes in.

When an agent replies, they can:

  • Check a box to mark the ticket as “Replied”
  • Set the ticket to “Pending”
  • Optionally enter a follow-up date

If no date is set, the system will automatically close the ticket after 7 days of inactivity — and notify the customer that the issue has been closed.

Customers can always reopen the ticket by replying, which makes it easy to resume the conversation.


Autoresponders and Work Calendar Integration

One of the features our clients appreciate is the smart autoresponder built into the system.

When a ticket is created:

  • The system checks which employee is currently working, based on EspoCRM’s Working Calendar
  • It then sends an autoresponder that includes:
    • A greeting and confirmation
    • The assigned agent’s availability (e.g. “Your request has been assigned to Anna. She will reply tomorrow when her shift starts at 9:00 AM.”)

This small detail helps set clear expectations and significantly reduces uncertainty on the client’s side.


Future Plans: Smarter, More Flexible Ticketing

As of now, we are actively developing several improvements based on real client needs:

Support for Multiple Leads

Currently, each ticket can be assigned to a single Lead. However, in B2B environments, conversations often involve multiple stakeholders. We plan to support:

  • Multiple leads per ticket
  • Better handling of group conversations from the same company

AI-Powered Ticket Analysis

We’re working on integrating AI to:

  • Analyze ticket content
  • Suggest a category or priority
  • Identify sentiment and urgency

Due to GDPR constraints, we’re considering deploying this using our in-house AI models, ensuring privacy and control.


Want Something Similar in Your CRM?

This entire system is built and maintained in EspoCRM — with open architecture, no vendor lock-in, and full customization available.

If you’re running EspoCRM (or planning to) and need a smarter way to manage support, we’d be happy to help you implement a similar system:

  • With your own email identities
  • Your own templates and languages
  • Custom workflows, priorities, escalation logic
  • Customer dashboards or secure portals

If you’re ready to transform your CRM into a customer support powerhouse, reach out to us today. At devcrm.it, we don’t just build tools — we craft solutions that fit your business like a glove.

📩 Contact us now and let’s discuss how we can implement this Ticketing System for your company!

Recent posts

Table of Contents

Unlock Your

25% Discount

Sign up and use code BLACKWEEK for an instant discount!
Click here to get more information.

Skip to content