Skip to main content
RapidDev - Software Development Agency
bubble-tutorial

How to build a meeting scheduler in Bubble

Build a Calendly-style meeting scheduler in Bubble with configurable available time slots, a shareable booking link, attendee slot selection with confirmation emails, and calendar integration. This tutorial walks through the data model for availability, the booking UI, conflict prevention, and automated email notifications.

What you'll learn

  • How to define available time slots in a Bubble database
  • How to build a booking page where attendees pick a slot
  • How to prevent double-booking with conflict checks
  • How to send confirmation emails to both parties automatically
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Beginner7 min read25-30 minAll Bubble plansMarch 2026RapidDev Engineering Team
TL;DR

Build a Calendly-style meeting scheduler in Bubble with configurable available time slots, a shareable booking link, attendee slot selection with confirmation emails, and calendar integration. This tutorial walks through the data model for availability, the booking UI, conflict prevention, and automated email notifications.

Overview: Building a Meeting Scheduler in Bubble

This tutorial shows you how to build a Calendly-style meeting scheduler in Bubble. You will create a system where hosts define their available time slots, share a booking link, attendees select an open slot, and both parties receive confirmation emails. The system prevents double-booking and supports recurring availability patterns.

Prerequisites

  • A Bubble account with a new or existing app
  • User authentication already set up
  • Basic familiarity with Bubble's Data tab and workflows
  • Understanding of date and time handling in Bubble

Step-by-step guide

1

Create the Availability and Booking Data Types

Go to the Data tab. Create a Data Type called Availability with fields: Host (User), Day of Week (text or Option Set with Monday through Sunday), Start Time (text such as 09:00), End Time (text such as 17:00), Slot Duration (number in minutes, such as 30), and Is Active (yes/no). Then create a Booking Data Type with: Host (User), Attendee Name (text), Attendee Email (text), Date (date), Start Time (date), End Time (date), Status (Option Set: Confirmed, Cancelled), and Notes (text).

Expected result: Two Data Types (Availability and Booking) appear in your Data tab.

2

Build the availability settings page for hosts

Create a page called availability-settings. Add a Repeating Group with Type set to Availability, Data source: Search for Availabilities where Host equals Current User. In each cell, show the Day of Week, Start Time, End Time, and Slot Duration as editable inputs, plus a toggle for Is Active. Add a button to create new availability entries for each day. Hosts set their recurring weekly schedule here: for example, Monday 9:00 to 17:00 with 30-minute slots.

Pro tip: Use an Option Set for Day of Week to keep values consistent. Pre-create all seven days when a user first visits the settings page.

Expected result: Hosts can configure their weekly availability for each day, including start time, end time, and slot duration.

3

Generate available time slots on the booking page

Create a page called book with a URL parameter for the host's user ID. Add a Date Picker for the attendee to select a date. When a date is selected, determine the day of week and find the host's Availability for that day. Use a Repeating Group to display available slots. Generate the slots by calculating from Start Time to End Time in increments of Slot Duration. For each potential slot, check if a Booking already exists for that host, date, and time range with Status equals Confirmed. Only show slots where no booking conflict exists.

Expected result: The booking page shows available time slots for the selected date, automatically hiding slots that are already booked.

4

Create the booking workflow with conflict prevention

When the attendee selects a slot and clicks Book, add an Input for their name, email, and optional notes. Create the workflow: first search for existing Bookings for that host, date, and time where Status equals Confirmed. Add an Only when condition: the search count is 0. If no conflict, Create a new Booking with Host, Attendee Name, Attendee Email, Date, Start Time, End Time, Status as Confirmed, and Notes. If a conflict exists, show an alert saying the slot has been taken.

Pro tip: Run the conflict check in a Backend Workflow for extra safety since frontend workflows can have race conditions if two people book simultaneously.

Expected result: Clicking Book creates a confirmed booking only if the slot is still available, preventing double-booking.

5

Send confirmation emails to both parties

After the Create Booking action, add two Send email actions. The first goes to the attendee: To equals Attendee Email, Subject is Meeting Confirmed with the host's name, Body includes the date, time, and any meeting link. The second email goes to the host: To equals Host's email, Subject is New booking from the attendee name, Body includes the attendee details and meeting time. Include a link to a cancellation page with the booking ID as a URL parameter.

Expected result: Both the attendee and host receive confirmation emails with meeting details immediately after booking.

6

Build a booking management page for hosts

Create a page called my-bookings. Add a Repeating Group with Type Booking, Data source: Search for Bookings where Host equals Current User, sorted by Date ascending. In each cell, display the attendee name, date, time, and status. Add a Cancel button with a workflow that changes the Booking Status to Cancelled and sends a cancellation email to the attendee. Add a tab or filter to show upcoming versus past bookings using a constraint on Date compared to Current date/time.

Expected result: Hosts can view all their bookings, see upcoming and past meetings, and cancel bookings with automatic attendee notification.

Complete working example

Workflow summary
1MEETING SCHEDULER WORKFLOW SUMMARY
2=====================================
3
4DATA TYPES:
5 Availability
6 - Host (User)
7 - Day of Week (Option Set: Mon-Sun)
8 - Start Time (text, e.g. '09:00')
9 - End Time (text, e.g. '17:00')
10 - Slot Duration (number, minutes)
11 - Is Active (yes/no)
12
13 Booking
14 - Host (User)
15 - Attendee Name (text)
16 - Attendee Email (text)
17 - Date (date)
18 - Start Time (date)
19 - End Time (date)
20 - Status (Option Set: Confirmed, Cancelled)
21 - Notes (text)
22
23PAGE: availability-settings (host-only)
24 Repeating Group (Availability, Host=Current User)
25 Each row: Day, Start Time, End Time, Duration, Active toggle
26 Button: Save changes to each Availability
27
28PAGE: book?host=[user_id] (public)
29 Date Picker selected date
30 Repeating Group: available time slots
31 Generated from Availability for that day of week
32 Filtered: no existing Confirmed Booking at that time
33 Booking form: Name, Email, Notes inputs
34 Button: Book Meeting
35
36WORKFLOW: Create Booking
37 Trigger: Book button clicked
38 Condition: Search Bookings (Host, Date, Time, Confirmed):count = 0
39 Actions:
40 1. Create Booking (all fields, Status = Confirmed)
41 2. Send email to Attendee (confirmation)
42 3. Send email to Host (new booking notification)
43
44WORKFLOW: Cancel Booking
45 Trigger: Cancel button clicked
46 Actions:
47 1. Make changes to Booking Status = Cancelled
48 2. Send email to Attendee (cancellation)
49
50PAGE: my-bookings (host-only)
51 Tab: Upcoming (Date >= today, Status = Confirmed)
52 Tab: Past (Date < today)
53 Tab: Cancelled (Status = Cancelled)
54 Each row: Attendee, Date, Time, Status, Cancel button

Common mistakes when building a meeting scheduler in Bubble

Why it's a problem: Not checking for existing bookings before creating a new one

How to avoid: Always search for existing Confirmed bookings at the same host, date, and time before creating a new booking

Why it's a problem: Storing times as text strings instead of date objects

How to avoid: Store Start Time and End Time as full date-time objects in the Booking Data Type for accurate comparisons

Why it's a problem: Not handling timezone differences between host and attendee

How to avoid: Display times in the viewer's local timezone using Bubble's date formatting options, and store all times in UTC internally

Best practices

  • Store booking times as full date-time objects for accurate conflict detection and sorting
  • Run booking conflict checks in a Backend Workflow to prevent race conditions
  • Display times in the viewer's local timezone and store in UTC internally
  • Add a buffer time between slots (e.g., 5-10 minutes) to prevent back-to-back meetings
  • Send confirmation emails immediately after booking and reminder emails 24 hours before
  • Use Privacy Rules to ensure attendees cannot see other attendees' booking details
  • Provide a cancellation link in confirmation emails that includes the booking ID as a parameter

Still stuck?

Copy one of these prompts to get a personalized, step-by-step explanation.

ChatGPT Prompt

I want to build a Calendly-like meeting scheduler in Bubble.io where hosts set their weekly availability, attendees pick a time slot, and both get confirmation emails. How should I design the data model and booking workflow?

Bubble Prompt

Create a meeting booking page where a visitor selects a date, sees available time slots for that date, and books a slot. Include conflict prevention so the same slot cannot be booked twice.

Frequently asked questions

Can I integrate this with Zoom to auto-generate meeting links?

Yes. Use the API Connector to call Zoom's Create Meeting API after a booking is confirmed. Store the returned meeting URL on the Booking record and include it in confirmation emails.

How do I handle recurring meetings?

Create multiple Booking records at once using a Backend Workflow that creates bookings for each occurrence. Store a Recurrence ID on each booking so they can be managed as a group.

Can attendees reschedule instead of cancelling?

Yes. Add a Reschedule button that cancels the existing booking and redirects to the booking page with the host pre-selected. Pass the old booking ID via URL parameter so the system can reference the original booking.

How do I send reminder emails before the meeting?

Create a Backend Workflow that runs on a schedule. It searches for Bookings where Date equals tomorrow and Status is Confirmed, then sends reminder emails to both the host and attendee.

Can RapidDev help build a more advanced scheduling platform?

Yes. RapidDev can help you build advanced scheduling features including team scheduling with round-robin assignment, payment collection at booking, Google Calendar integration, and custom branding for the booking page.

Can I limit how far in advance attendees can book?

Yes. Set the Date Picker's minimum date to today and maximum date to a calculated future date like Current date/time plus 30 days. This prevents bookings too far in advance.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.