# How to develop a ticketing system in Bubble.io: Step-by-Step Guide

- Tool: Bubble
- Difficulty: Beginner
- Time required: 30-35 min
- Compatibility: All Bubble plans (backend workflows require paid plans for automation)
- Last updated: March 2026

## TL;DR

A support ticketing system in Bubble uses a Ticket Data Type with categories, priorities, and assignment rules to route requests to the right team. This tutorial covers building ticket submission forms, assignment workflows, escalation logic, SLA tracking, and an agent dashboard for managing open tickets efficiently.

## Overview: Building a Support Ticketing System in Bubble

This tutorial walks through building an internal support ticketing system for IT, HR, or facilities requests. You will create a ticket submission flow with categorization, automatic assignment based on category, escalation workflows for overdue tickets, SLA tracking, and an agent dashboard for managing and resolving tickets.

## Before you start

- A Bubble account with an app
- User accounts for agents/support staff
- Understanding of Bubble Data Types and workflows
- Familiarity with backend workflows for automation

## Step-by-step guide

### 1. Create the Ticket and Agent Data Types

In the Data tab, create a Ticket Data Type: title (text), description (text), category (Option Set: IT, HR, Facilities, Finance), priority (Option Set: Low, Medium, High, Urgent), status (text: open/in-progress/waiting/resolved/closed), submitter (User), assigned_to (User), created_at (date), resolved_at (date), sla_deadline (date). Create an Agent_Profile Data Type: user (User), categories_handled (list of Option Set), is_available (yes/no), current_tickets (number). Create a Ticket_Comment Data Type: ticket (Ticket), author (User), text (text), is_internal (yes/no), created_at (date).

**Expected result:** Complete database schema for the ticketing system with tickets, agents, and comments.

### 2. Build the ticket submission form

Create a 'submit-ticket' page with: Input for title, Multiline Input for description, Dropdown for category (sourced from Option Set), Dropdown for priority (default: Medium), and a File Uploader for attachments. Add a Submit button. The workflow: create a new Ticket with all field values, set status to 'open', set created_at to now, and calculate sla_deadline based on priority (Urgent: 4 hours, High: 8 hours, Medium: 24 hours, Low: 48 hours). Then trigger the auto-assignment workflow. Show a confirmation with the ticket number.

> Pro tip: Auto-generate ticket numbers with a format like 'TK-' followed by a timestamp for easy reference.

**Expected result:** Users can submit tickets with category, priority, and description through a clean form.

### 3. Implement automatic ticket assignment

Create a backend workflow called 'assign-ticket' with a Ticket parameter. Search for Agent_Profiles where categories_handled contains the Ticket's category AND is_available is yes, sorted by current_tickets ascending (assigns to the least-loaded agent). Make changes to the Ticket: assigned_to = first result's user. Make changes to the Agent_Profile: current_tickets = current_tickets + 1. Send an email notification to the assigned agent. If no available agent is found, keep the ticket unassigned and send an alert to the admin.

**Expected result:** New tickets are automatically assigned to the least-loaded available agent handling that category.

### 4. Build the agent dashboard

Create an 'agent-dashboard' page. Add filter tabs: My Tickets, Unassigned, All Open. Add a Repeating Group showing Tickets filtered by the active tab (My Tickets: assigned_to = Current User AND status is not closed). Each row shows ticket number, title, category badge, priority badge (color-coded: red for Urgent, orange for High, yellow for Medium, green for Low), submitter name, created time, and SLA countdown. Clicking a ticket opens the detail view. Add summary counts at the top: Open, In Progress, Overdue (sla_deadline < now AND status is not resolved).

**Expected result:** Agents see a dashboard of their assigned tickets with priority indicators and SLA countdowns.

### 5. Create the ticket detail view with comments

Create a 'ticket' page (type: Ticket) showing all ticket details, a status change dropdown (agents can update status), and a Comments section. The Comments section has a Repeating Group of Ticket_Comments sorted by created_at, with each showing author, timestamp, text, and an 'Internal' badge for internal notes. Add a Multiline Input, a Checkbox for 'Internal note' (visible to agents only), and a Post Comment button. The workflow creates the comment. When status changes to 'resolved', set resolved_at to now and decrement the agent's current_tickets count.

**Expected result:** Agents can view ticket details, update status, and communicate via comments with internal note support.

### 6. Implement SLA tracking and escalation

Create a scheduled backend workflow called 'check-sla' that runs every 15 minutes. It searches for Tickets where sla_deadline < Current Date/Time AND status is not resolved/closed. For each overdue ticket, send an escalation email to the assigned agent and their manager. If a ticket has been overdue for more than double its SLA period, auto-escalate by reassigning to a senior agent. Log escalation events in a Ticket_Comment as an internal system note. Add an SLA status indicator on the dashboard: green (within SLA), yellow (within 1 hour of deadline), red (overdue).

**Expected result:** Overdue tickets are automatically flagged, escalated, and reassigned with email notifications.

## Complete code example

File: `Workflow summary`

```text
TICKETING SYSTEM SUMMARY
=========================

DATA TYPES:
  Ticket: title, description, category, priority, status,
    submitter (User), assigned_to (User), created_at,
    resolved_at, sla_deadline
  Agent_Profile: user, categories_handled (list), is_available,
    current_tickets (number)
  Ticket_Comment: ticket, author (User), text, is_internal, created_at

SLA DEADLINES BY PRIORITY:
  Urgent: created_at + 4 hours
  High: created_at + 8 hours
  Medium: created_at + 24 hours
  Low: created_at + 48 hours

AUTO-ASSIGNMENT:
  Backend workflow: assign-ticket
  Search Agent_Profiles:
    categories_handled contains ticket's category
    is_available = yes
    Sorted by current_tickets ascending
  Assign to first result (least loaded)

ESCALATION (every 15 min):
  Backend workflow: check-sla
  Search Tickets: sla_deadline < now AND not resolved
  For each:
    Email agent + manager
    If 2x overdue: reassign to senior agent
    Log escalation as internal comment

STATUS FLOW:
  open → in-progress → waiting → resolved → closed

DASHBOARD VIEWS:
  My Tickets: assigned_to = Current User, not closed
  Unassigned: assigned_to is empty, status = open
  All Open: status is not closed
  Overdue: sla_deadline < now AND not resolved
```

## Common mistakes

- **Not calculating SLA deadlines based on priority level** — A flat deadline for all tickets means urgent issues get the same response time as low-priority requests Fix: Calculate sla_deadline dynamically: Urgent = 4h, High = 8h, Medium = 24h, Low = 48h from creation time
- **Forgetting to decrement the agent's ticket count when a ticket is resolved** — The auto-assignment algorithm assigns to the least-loaded agent — stale counts mean some agents get overloaded Fix: When a ticket status changes to 'resolved', decrement the assigned agent's current_tickets count by 1
- **Not separating internal and external comments** — Internal agent discussions about a ticket should not be visible to the submitter Fix: Add an is_internal field to Ticket_Comment and use Privacy Rules to hide internal comments from non-agent users

## Best practices

- Calculate SLA deadlines dynamically based on ticket priority
- Use auto-assignment to distribute tickets evenly across available agents
- Separate internal agent notes from external comments using an is_internal flag
- Run SLA checks every 15 minutes via scheduled backend workflow
- Decrement agent ticket counts when tickets are resolved for accurate load balancing
- Color-code priority levels for instant visual recognition on the dashboard

## Frequently asked questions

### Can I integrate this with email for ticket creation?

Yes. Use an email parsing service like Mailgun or SendGrid that forwards incoming emails to a Bubble backend workflow via webhook, automatically creating tickets from email content.

### How do I handle ticket categories that need different agents?

The Agent_Profile Data Type has a categories_handled list field. Each agent selects which categories they handle. The auto-assignment workflow matches ticket category to agent capabilities.

### Can I add SLA business hours (excluding weekends)?

Yes, but it requires more complex date calculations. Use a backend workflow that calculates the deadline by adding only business hours, skipping weekends and holidays stored in an Option Set.

### How do I prevent ticket flooding from one user?

Add rate limiting: before creating a ticket, search for Tickets where submitter = Current User AND created_at > 1 hour ago. If count exceeds a threshold (like 5), block submission and show a message.

### Can I track ticket resolution time for reporting?

Yes. The resolved_at field minus created_at gives you the resolution time. Build a reporting page that calculates average resolution time by category, priority, and agent.

### Can RapidDev help build a ticketing system?

Yes. RapidDev can build complete support ticketing systems with auto-assignment, SLA management, escalation workflows, reporting dashboards, and email integration.

---

Source: https://www.rapidevelopers.com/bubble-tutorial/develop-a-ticketing-system-in-bubble
© RapidDev — https://www.rapidevelopers.com/bubble-tutorial/develop-a-ticketing-system-in-bubble
