# How to create a support ticket system in Bubble.io: Step-by-Step Guide

- Tool: Bubble
- Difficulty: Beginner
- Time required: 25-30 min
- Compatibility: All Bubble plans
- Last updated: March 2026

## TL;DR

Build a support ticket system in Bubble with a Ticket data type tracking status, priority, and assigned agent. Users submit tickets through a form, agents manage them via a dashboard with filters and status updates. Email notifications fire on ticket creation and status changes. The system tracks the full lifecycle from open to resolved.

## Build a Support Ticket System in Bubble

This tutorial shows you how to create a complete support ticket system with user submission forms, agent dashboards, status tracking, and email notifications. Whether you need customer support for your SaaS or an internal helpdesk, this guide covers the full ticket lifecycle from creation to resolution.

## Before you start

- A Bubble account with an existing app
- User authentication with at least two roles (user and agent/admin)
- Basic understanding of Data Types, workflows, and Repeating Groups
- Email sending configured (Bubble's built-in or SendGrid)

## Step-by-step guide

### 1. Create the Ticket Data Type and Option Sets

Go to Data tab → create a new type 'Ticket' with fields: subject (text), description (text), status (text — open/in-progress/resolved/closed), priority (text — low/medium/high/urgent), submitted_by (User), assigned_to (User), category (text), created_date (date), resolved_date (date), and attachments (list of files). Create an Option Set 'TicketStatus' with options: Open, In Progress, Resolved, Closed. Create another Option Set 'TicketPriority' with options: Low, Medium, High, Urgent. Using Option Sets instead of raw text ensures consistency.

**Expected result:** Ticket data type and TicketStatus/TicketPriority Option Sets exist in the database.

### 2. Build the Ticket Submission Form

Create a page called 'submit-ticket'. Add input elements: Input for subject, Dropdown for category (populated from an Option Set), Dropdown for priority, Multiline Input for description, and File Uploader for attachments. Add a Submit button. The workflow: Create a new Ticket with all form values, submitted_by = Current User, status = 'Open', created_date = Current date/time. After creation, reset inputs, show a success message with the ticket number, and send a confirmation email to the user.

**Expected result:** Users can submit support tickets with subject, category, priority, description, and file attachments.

### 3. Build the Agent Dashboard

Create a page called 'ticket-dashboard' restricted to agent/admin roles. Add filter controls at the top: Dropdown for status filter, Dropdown for priority filter, and a Search Input for ticket subject/ID. Add a Repeating Group with Type = Ticket, data source filtered by the selected status and priority. Each row displays: ticket ID, subject, submitted_by's name, priority (color-coded), status badge, assigned_to's name, and created_date. Sort by priority (urgent first) then by created_date (oldest first).

> Pro tip: Use conditional formatting on the priority column — red background for Urgent, orange for High, yellow for Medium, gray for Low — for visual scanning.

**Expected result:** Agents see a filterable, sortable list of all support tickets with color-coded priorities.

### 4. Add Ticket Detail View with Status Updates

Create a page called 'ticket-detail' with Type of content = Ticket. Display all ticket information: subject, description, category, priority, status, submitted_by, assigned_to, dates, and attachments. Add a Dropdown for status changes and an 'Update Status' button. Add a Dropdown for agent assignment populated with users who have the agent role. Create workflows: Update Status changes the Ticket's status field and adds a TicketComment record logging the change. If status changes to 'Resolved', set resolved_date. Send email notifications to the submitter on every status change.

**Expected result:** Agents can view full ticket details, change status, assign tickets, and the submitter receives email notifications.

### 5. Add a Comment/Reply Thread

Create a Data Type 'TicketComment' with fields: ticket (Ticket), author (User), message (text), created_date (date), and is_internal (yes/no — for agent-only notes). On the ticket detail page, add a Repeating Group showing all TicketComments for the current ticket, sorted by created_date ascending. Add a Multiline Input and Reply button below. The reply workflow creates a new TicketComment and optionally sends an email to the other party (agent → user or user → agent).

**Expected result:** Both users and agents can add comments to tickets, creating a threaded conversation history.

### 6. Add Email Notifications

Set up email triggers at key points: (1) New ticket created → email to support team, (2) Status changed → email to ticket submitter, (3) New comment from agent → email to submitter, (4) New comment from user → email to assigned agent. Use Bubble's Send Email action or an email plugin. Include the ticket subject, status, and a direct link to the ticket detail page in every email.

**Expected result:** All parties receive email notifications when tickets are created, updated, or commented on.

## Complete code example

File: `Workflow summary`

```text
DATA TYPES:
- Ticket
  - subject (text)
  - description (text)
  - status (TicketStatus option set)
  - priority (TicketPriority option set)
  - category (TicketCategory option set)
  - submitted_by (User)
  - assigned_to (User)
  - created_date (date)
  - resolved_date (date)
  - attachments (list of files)

- TicketComment
  - ticket (Ticket)
  - author (User)
  - message (text)
  - created_date (date)
  - is_internal (yes/no)

OPTION SETS:
- TicketStatus: Open, In Progress, Resolved, Closed
- TicketPriority: Low, Medium, High, Urgent
- TicketCategory: Bug, Feature Request, Account, Billing, General

PAGES:
1. submit-ticket (user-facing form)
2. my-tickets (user's ticket list)
3. ticket-dashboard (agent view — all tickets)
4. ticket-detail (full ticket view with comments)

KEY WORKFLOWS:
1. Submit Ticket → Create Ticket → Send email to support → Show success
2. Update Status → Make changes to Ticket → Log TicketComment → Send email to submitter
3. Assign Agent → Make changes to Ticket → Send email to assigned agent
4. Add Comment → Create TicketComment → Send email to other party
5. Resolve Ticket → Set status=Resolved, resolved_date=now → Send email

PRIVACY RULES:
- Ticket: submitted_by = Current User OR Current User's role is agent/admin
- TicketComment: is_internal = no OR Current User's role is agent/admin
```

## Common mistakes

- **Using raw text instead of Option Sets for status and priority** — Text fields can have inconsistent values (e.g., 'open' vs 'Open' vs 'OPEN'), breaking filters and conditionals. Fix: Use Option Sets for status and priority to enforce consistent values.
- **Not restricting the dashboard to agent roles** — Regular users could see all tickets from all users, including sensitive information. Fix: Add page-level access control: on Page load, if Current User's role is not agent, redirect to home.
- **Sending too many email notifications** — Users get annoyed by excessive emails, especially for minor status updates or internal notes. Fix: Only send external emails for meaningful status changes. Never send emails for internal agent notes.

## Best practices

- Use Option Sets for status, priority, and category to enforce consistency and make filtering reliable.
- Add a ticket number field (auto-generated sequential or random string) for easy reference.
- Color-code priority and status badges for quick visual scanning on the dashboard.
- Log all status changes as TicketComments for a complete audit trail.
- Set Privacy Rules so users only see their own tickets and agents see all.
- Add SLA tracking — calculate time between creation and resolution and flag overdue tickets.
- Create a 'my-tickets' page where users can view and track their submitted tickets.

## Frequently asked questions

### How do I auto-assign tickets to agents?

Create a round-robin assignment workflow: search for the agent with the fewest open tickets and assign the new ticket to them. Alternatively, assign by category if different agents handle different ticket types.

### Can I track response time and SLA compliance?

Yes. Store first_response_date on the Ticket when the first agent comment is added. Calculate response time as first_response_date minus created_date. Compare against your SLA threshold and flag overdue tickets.

### How do I let users rate the support experience?

When a ticket is resolved, show a rating popup (1-5 stars). Save the rating on the Ticket data type. Aggregate ratings per agent for performance tracking.

### Can I integrate with Slack for ticket notifications?

Yes. Use the API Connector to call Slack's webhook URL when a new ticket is created or a priority changes to Urgent. This alerts your team in real-time without relying on email.

### Should I build a knowledge base alongside the ticket system?

Absolutely. A knowledge base reduces ticket volume by letting users self-serve. Link relevant articles when agents resolve tickets. For comprehensive helpdesk builds, RapidDev can architect the complete system.

### How do I handle internal vs external comments?

Use the is_internal field on TicketComment. When displaying comments, filter out internal notes for non-agent users using Privacy Rules or conditional visibility.

---

Source: https://www.rapidevelopers.com/bubble-tutorial/create-a-support-ticket-system-in-bubble
© RapidDev — https://www.rapidevelopers.com/bubble-tutorial/create-a-support-ticket-system-in-bubble
