Building a helpdesk platform in Bubble involves creating a ticket submission flow, agent assignment with load balancing, SLA tracking, a knowledge base, and customer satisfaction scoring. This tutorial walks you through the database design, customer-facing ticket form, agent dashboard, automated assignment logic, and satisfaction survey workflows for a complete support system.
Overview: Building a Helpdesk Platform in Bubble
This tutorial guides you through building a helpdesk platform in Bubble with ticket management, agent assignment, SLA tracking, and satisfaction surveys. You will create the database architecture, customer-facing submission form, agent dashboard with queue management, and automated workflows for assignment and escalation.
Prerequisites
- A Bubble app with user authentication set up
- Understanding of Bubble Data Types and workflows
- Familiarity with Repeating Groups and conditional visibility
- A SendGrid or other email plugin for ticket notifications (optional)
Step-by-step guide
Design the helpdesk database schema
Design the helpdesk database schema
In the Data tab, create these Data Types: (1) Ticket — fields: subject (text), description (text), customer (User), assigned_agent (User), status (Option Set: TicketStatus — Open/InProgress/Resolved/Closed), priority (Option Set: Priority — Low/Medium/High/Urgent), category (Option Set: TicketCategory), created_date (date), resolved_date (date), sla_deadline (date). (2) TicketMessage — fields: ticket (Ticket), sender (User), message (text), is_internal_note (yes/no). (3) KnowledgeBase — fields: title (text), content (text), category (Option Set: TicketCategory), view_count (number). (4) SatisfactionRating — fields: ticket (Ticket), rating (number 1-5), comment (text). Create Option Sets for TicketStatus, Priority, and TicketCategory with relevant options.
Expected result: Your database has all Data Types needed for ticket management, messaging, knowledge base, and satisfaction tracking.
Build the customer ticket submission form
Build the customer ticket submission form
Create a 'submit-ticket' page. Add a form group containing: a Text Input for subject, a Multiline Input for description, a Dropdown for category (data source: Option Set TicketCategory), and a File Uploader for attachments. Add a Submit button. The workflow on Submit: (1) Create a new Ticket with customer = Current User, status = Open, priority = Medium (default), created_date = Current date/time, and sla_deadline = Current date/time + 24 hours (for standard SLA). (2) Send a confirmation email to the customer. (3) Navigate to a 'ticket-detail' page showing the created ticket.
Pro tip: Add a knowledge base search above the form — search KnowledgeBase articles matching the subject text and display suggestions before the user submits a ticket. This deflects common questions.
Expected result: Customers can submit support tickets with subject, description, category, and attachments, receiving a confirmation email.
Create the agent dashboard with ticket queue
Create the agent dashboard with ticket queue
Create an 'agent-dashboard' page (visible only when Current User's role is Agent or Admin). Add a Repeating Group showing open tickets: Do a Search for Tickets with constraints: status is not Closed, sorted by priority (Urgent first) then created_date (oldest first). In each cell, display the ticket subject, customer name, priority (with color coding using Conditionals — red for Urgent, orange for High, yellow for Medium, green for Low), time since creation, and SLA status. Add filter dropdowns above the Repeating Group for status, priority, category, and assigned agent. Add a tab for 'My Tickets' filtered to assigned_agent = Current User.
Expected result: Agents see a prioritized ticket queue with color-coded priorities, filters, and a personal assignments tab.
Implement automated ticket assignment
Implement automated ticket assignment
When a new ticket is created, use a backend workflow to assign it automatically. The logic: Do a Search for Users where role = Agent, sorted by active_ticket_count ascending (a computed field), and pick the first item. This implements round-robin load balancing — the agent with the fewest open tickets gets the next one. Update the Ticket's assigned_agent field and increment the agent's active_ticket_count. Send a notification to the assigned agent. For manual reassignment, add a dropdown on the ticket detail page listing all agents, with a workflow that changes assigned_agent and sends a notification.
Expected result: New tickets are automatically assigned to the least-busy agent, and managers can manually reassign tickets.
Add SLA tracking and escalation
Add SLA tracking and escalation
Each ticket has an sla_deadline field set at creation based on priority (Urgent: 4 hours, High: 8 hours, Medium: 24 hours, Low: 48 hours). Create a scheduled backend workflow that runs every 15 minutes, searching for Tickets where status is not Resolved, status is not Closed, and sla_deadline is less than Current date/time. For each overdue ticket, change the priority to the next level up (Medium → High, High → Urgent), send an alert email to the team lead, and add an internal note to the TicketMessage thread. On the agent dashboard, add a Conditional on each ticket cell: when sla_deadline is less than Current date/time + 1 hour, show a red warning icon.
Expected result: Tickets approaching or past their SLA deadline are automatically escalated in priority with notifications sent to supervisors.
Build the satisfaction survey workflow
Build the satisfaction survey workflow
When an agent changes a Ticket status to Resolved, trigger a workflow that sends an email to the customer with a link to a satisfaction survey page. The survey page (type = Ticket) displays: a rating selector (1-5 stars using clickable icons with a custom state for the selected rating), a comment textarea, and a Submit button. The Submit workflow creates a SatisfactionRating record linked to the ticket. On the agent dashboard, add a metrics section showing average satisfaction score (from a stored computed field updated after each rating) and recent feedback. This data helps identify top performers and areas for improvement.
Expected result: Customers receive a satisfaction survey after ticket resolution, and agents see aggregated satisfaction scores on their dashboard.
Complete working example
1HELPDESK PLATFORM ARCHITECTURE2================================34DATA TYPES:5 Ticket:6 - subject: text7 - description: text8 - customer: User9 - assigned_agent: User10 - status: Option Set (Open/InProgress/Resolved/Closed)11 - priority: Option Set (Low/Medium/High/Urgent)12 - category: Option Set (TicketCategory)13 - created_date: date14 - resolved_date: date15 - sla_deadline: date1617 TicketMessage:18 - ticket: Ticket19 - sender: User20 - message: text21 - is_internal_note: yes/no2223 KnowledgeBase:24 - title: text25 - content: text26 - category: Option Set (TicketCategory)27 - view_count: number2829 SatisfactionRating:30 - ticket: Ticket31 - rating: number (1-5)32 - comment: text3334SLA DEADLINES BY PRIORITY:35 Urgent: created_date + 4 hours36 High: created_date + 8 hours37 Medium: created_date + 24 hours38 Low: created_date + 48 hours3940KEY WORKFLOWS:41 Ticket Submission:42 → Create Ticket (status: Open)43 → Set SLA deadline based on priority44 → Auto-assign to least busy agent45 → Send confirmation email to customer46 → Send notification to assigned agent4748 SLA Escalation (scheduled, every 15 min):49 → Search Tickets where SLA deadline passed50 → Upgrade priority one level51 → Notify team lead52 → Add internal note5354 Ticket Resolution:55 → Change status to Resolved56 → Set resolved_date57 → Send satisfaction survey email58 → Decrement agent active_ticket_count5960 Satisfaction Survey:61 → Create SatisfactionRating62 → Update agent average scoreCommon mistakes when building a helpdesk app in Bubble
Why it's a problem: Displaying all tickets in a single Repeating Group without pagination
How to avoid: Paginate the ticket queue to 20-30 items per page and use filters to narrow results by status, priority, and assignment
Why it's a problem: Not using internal notes versus customer-visible messages
How to avoid: Add an is_internal_note yes/no field to TicketMessage and filter customer-facing views to show only messages where is_internal_note is no
Why it's a problem: Calculating SLA status dynamically on every page load
How to avoid: Use a scheduled backend workflow to flag overdue tickets with a field like is_sla_breached and display based on that field
Best practices
- Use Option Sets for ticket statuses, priorities, and categories — they load instantly with zero database cost
- Store computed metrics like average satisfaction score as fields rather than calculating on every page load
- Separate internal notes from customer-visible messages using a boolean field
- Paginate ticket queues and use filters to keep the agent dashboard responsive
- Set SLA deadlines at ticket creation based on priority level for consistent tracking
- Use backend workflows for automated assignment and escalation to ensure they run even if the page closes
- Add a knowledge base search before the ticket form to deflect common questions
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
I want to build a helpdesk ticketing system in Bubble.io with automated agent assignment, SLA tracking, and customer satisfaction surveys. Help me design the database schema and key workflows.
Create a ticket submission form with subject, description, category dropdown, and file upload. When submitted, create a Ticket with status Open, auto-assign to the agent with the fewest open tickets, set SLA deadline based on priority, and send a confirmation email to the customer.
Frequently asked questions
Can I build a helpdesk on Bubble's free plan?
You can build the core ticketing functionality on the free plan, but you will need a paid plan for backend workflows (automated assignment, SLA escalation), custom domains, and higher workload unit limits as ticket volume grows.
How does automatic agent assignment work?
A backend workflow searches for all agents and sorts by their active open ticket count ascending. The first result (least busy agent) is assigned to the new ticket. This creates a simple load-balanced round-robin system.
Can I integrate email so customers submit tickets by email?
Yes. Use a service like Mailgun or SendGrid with a webhook that fires when an email is received at your support address. The webhook triggers a Bubble backend workflow that creates a Ticket from the email subject and body.
How do I track SLA compliance over time?
Add a resolved_within_sla yes/no field to Tickets. When a ticket is resolved, check if resolved_date is before sla_deadline. Build a dashboard showing the percentage of tickets resolved within SLA grouped by week or month.
Can RapidDev help build a helpdesk platform in Bubble?
Yes. RapidDev can build a complete helpdesk solution including automated assignment, SLA escalation, email integration, knowledge base, and analytics dashboards tailored to your support team's specific workflow.
What happens when all agents are at full capacity?
Set a maximum ticket limit per agent. If all agents are at capacity, leave the ticket unassigned and notify the team lead. Add a condition in the assignment workflow that skips agents whose active_ticket_count exceeds the threshold.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation