# How to manage customers in Bubble

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

## TL;DR

Building a customer management system in Bubble involves creating a Customer Data Type with relevant fields, a searchable customer list using Repeating Groups with filters, individual customer detail pages, and interaction history tracking. This tutorial guides you through each component for a basic CRM-style customer management setup.

## Overview: Managing Customers in a Bubble App

This tutorial walks you through building a complete customer management interface in Bubble. You will create a Customer Data Type, build a searchable and filterable customer list, design a customer detail page showing profile information and interaction history, and add tagging for segmentation. This is a foundational feature for any business app — whether you are building a CRM, a service platform, or an internal tool.

## Before you start

- A Bubble account with an app
- Basic familiarity with Bubble's Data tab and Data Types
- Understanding of Repeating Groups for displaying lists
- A clear idea of what customer information you need to track

## Step-by-step guide

### 1. Create the Customer Data Type with essential fields

Go to the Data tab and create a new Data Type called Customer. Add these fields: first_name (text), last_name (text), email (text), phone (text), company (text), status (text — active, inactive, lead), source (text — referral, website, ad), notes (text), tags (list of text), created_by (User), and last_contacted (date). If your customers are also app users, add a user_account field (type User) to link the Customer record to a User account. This separation lets you manage customer data independently of login accounts.

> Pro tip: Use an Option Set for status and source fields instead of raw text — it prevents typos and makes filtering more reliable.

**Expected result:** A Customer Data Type with all essential fields for tracking customer information, activity, and segmentation.

### 2. Build a searchable customer list page

Create a new page called 'customers'. Add a Group at the top with Row layout containing: a Search Input (placeholder: 'Search customers...'), a Dropdown for status filter (choices: All, Active, Inactive, Lead), and a Button labeled 'Add Customer'. Below this group, add a Repeating Group with type Customer. Set the data source to Do a Search for Customer with constraints: first_name contains Search Input's value OR last_name contains Search Input's value OR email contains Search Input's value. Add an Only when condition on the status constraint: Dropdown's value is not 'All'. In each RG cell, display the customer's name, email, company, status (with colored badge), and last contacted date.

**Expected result:** A customer list page with working search and status filter, showing key customer details in each row.

### 3. Create an Add/Edit Customer form

Create a Popup element called 'Popup Customer Form'. Inside, add Input elements for each Customer field: first_name, last_name, email, phone, company, a Dropdown for status, a Dropdown for source, and a Multiline Input for notes. Add Save and Cancel buttons. On the Save button, create a workflow: if creating a new customer, use Create a new Customer and set all fields from the inputs. If editing, use Make changes to a thing (the customer stored in a custom state on the popup). Wire the 'Add Customer' button on the list page to show the popup with empty inputs, and add an Edit icon in each RG cell that shows the popup pre-filled with that customer's data via Display data in a group.

**Expected result:** A popup form for creating new customers and editing existing ones, accessible from the customer list page.

### 4. Design a customer detail page with interaction history

Create a new page called 'customer-detail' with a content type of Customer. Use the URL slug to load the correct customer (the page data source is automatically set when navigating with Go to page and sending data). At the top, display the customer's name, email, phone, company, and status in a profile card Group. Below, create a Data Type called Interaction with fields: customer (Customer), type (text — call, email, meeting, note), description (text), date (date), and logged_by (User). Add a Repeating Group on the detail page showing all Interactions where customer = Current Page's Customer, sorted by date descending.

**Expected result:** A customer detail page showing profile information and a chronological list of all interactions with that customer.

### 5. Add interaction logging with a quick-entry form

On the customer detail page, add a Group below the profile card with Row layout containing: a Dropdown for interaction type (Call, Email, Meeting, Note), a Multiline Input for description, and a Log Interaction button. Create a workflow on the button: Create a new Interaction with customer = Current Page's Customer, type = Dropdown's value, description = Input's value, date = Current Date/Time, and logged_by = Current User. After creation, also update the Customer record: Make changes to Current Page's Customer → set last_contacted = Current Date/Time. Reset the inputs after saving.

**Expected result:** Users can quickly log interactions from the customer detail page, and the customer's last_contacted date updates automatically.

### 6. Implement customer tagging for segmentation

On the customer detail page (or the edit popup), add a Multi-dropdown or a tag input for the tags field. To add a tag, create a workflow that uses Make changes to Current Page's Customer → tags add [new tag value]. To remove a tag, use tags remove [tag value]. On the customer list page, add a tag filter: another Dropdown or Multiline Input where the user enters a tag. Add a constraint to the Repeating Group search: tags contains Dropdown Tag Filter's value (use Ignore empty constraints so it shows all customers when the filter is blank).

> Pro tip: Create an Option Set called Customer Tags with predefined tags (VIP, Enterprise, Churned, etc.) so tags are consistent across all customers.

**Expected result:** Customers can be tagged for segmentation, and the customer list can be filtered by tag.

## Complete code example

File: `Workflow summary`

```text
CUSTOMER MANAGEMENT WORKFLOW SUMMARY
=====================================

DATA TYPES:
  Customer
    - first_name (text)
    - last_name (text)
    - email (text)
    - phone (text)
    - company (text)
    - status (Option Set 'Customer Status'): active, inactive, lead
    - source (Option Set 'Customer Source'): referral, website, ad
    - notes (text)
    - tags (list of text or Option Set 'Customer Tags')
    - created_by (User)
    - last_contacted (date)
    - user_account (User, optional)

  Interaction
    - customer (Customer)
    - type (Option Set 'Interaction Type'): call, email, meeting, note
    - description (text)
    - date (date)
    - logged_by (User)

OPTION SETS:
  Customer Status: Active, Inactive, Lead
  Customer Source: Referral, Website, Ad, Other
  Interaction Type: Call, Email, Meeting, Note
  Customer Tags: VIP, Enterprise, SMB, Churned, Trial

PAGES:
  customers (list page)
    - Search Input + Status Dropdown + Tag Dropdown
    - Repeating Group: Customer
      Data source: Search for Customer
        first_name contains OR last_name contains OR email contains
        status = Dropdown value (ignore empty)
        tags contains Tag Dropdown value (ignore empty)
    - Button 'Add Customer' → Show Popup Customer Form

  customer-detail (detail page, type: Customer)
    - Profile card: name, email, phone, company, status
    - Tag list with add/remove
    - Interaction log: Repeating Group of Interactions
      Data source: Search for Interaction where customer = page data
      Sorted by date descending
    - Quick log form: type dropdown + description + Log button

WORKFLOWS:
  Add Customer:
    Show Popup → Fill inputs → Save → Create new Customer
  Edit Customer:
    Display data in popup → Modify inputs → Save → Make changes
  Log Interaction:
    Create new Interaction → Make changes to Customer (last_contacted)
  Add Tag:
    Make changes to Customer → tags add [value]
  Remove Tag:
    Make changes to Customer → tags remove [value]
```

## Common mistakes

- **Using a single search constraint for name instead of searching both first and last name** — If you only search first_name, users searching by last name get no results — and vice versa Fix: Use OR logic in your search or create a computed full_name field that combines first and last name for simpler searching
- **Not adding Privacy Rules to the Customer Data Type** — Without Privacy Rules, any logged-in user can see all customer records — this is a data security risk Fix: Add Privacy Rules that restrict Customer visibility to the user who created them or to admin-role users
- **Forgetting to update last_contacted when logging an interaction** — The customer list becomes inaccurate for tracking engagement if last_contacted is stale Fix: In the Log Interaction workflow, add a Make changes to Customer action that sets last_contacted to Current Date/Time

## Best practices

- Use Option Sets for status, source, and interaction type to prevent inconsistent data entry
- Add Privacy Rules to restrict customer data visibility based on user role or ownership
- Create a full_name computed field or search across both first and last name fields
- Enable Ignore empty constraints on search filters so all customers show when no filter is active
- Update last_contacted automatically whenever a new interaction is logged
- Use pagination on the customer list Repeating Group to keep page loads fast as your customer count grows
- Store the creating user in created_by for ownership tracking and Privacy Rule enforcement

## Frequently asked questions

### Should I use the User Data Type or a separate Customer Data Type?

Use a separate Customer Data Type. This keeps customer business data separate from authentication data, allows you to have customers who are not app users, and gives you more flexibility with Privacy Rules and field management.

### How do I handle duplicate customers?

Before creating a new customer, search for existing records with the same email. If found, show a warning or redirect to the existing customer's detail page. Add a unique constraint workflow check on the email field.

### Can I import existing customers from a spreadsheet?

Yes. Go to Data tab, App data, select the Customer Data Type, and click Upload. Map your CSV columns to Customer fields. Make sure date fields are formatted correctly and any linked fields use Unique IDs.

### How do I export my customer list?

Go to Data tab, App data, select Customer, and click Export. Bubble generates a CSV file with all customer records. For automated exports, enable the Data API in Settings and use it to pull records programmatically.

### Will my customer list get slow with thousands of records?

Bubble processes about 100 rows per second, so large lists benefit from pagination (10-20 items per page) and database-level constraints rather than client-side filtering. Keep Repeating Group page sizes small.

### Can RapidDev help build a full customer management system?

Yes. RapidDev can build complete customer management systems in Bubble including advanced search, automated tagging, email integration, reporting dashboards, and team collaboration features.

### How do I track customer lifetime value?

Create an Order or Payment Data Type linked to Customer. Add a computed field on Customer or use a search aggregation to calculate the sum of all payments. Display this on the customer detail page.

---

Source: https://www.rapidevelopers.com/bubble-tutorial/manage-customers-in-bubble-app
© RapidDev — https://www.rapidevelopers.com/bubble-tutorial/manage-customers-in-bubble-app
