# How to build a vehicle rental booking 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 vehicle rental booking system in Bubble with a vehicle inventory featuring availability calendars, date range selection for pickup and return, dynamic pricing calculation, booking confirmation workflows, and return check-in tracking. This covers the full rental lifecycle from browsing to return.

## Overview: Building a Vehicle Rental Booking System in Bubble

This tutorial walks you through building a vehicle rental system in Bubble. You will create data types for vehicles and bookings, build a catalog with availability filtering, implement date range selection with pricing calculation, create booking and confirmation workflows, and add return check-in tracking.

## Before you start

- A Bubble account with an existing app
- Basic understanding of Bubble data types and workflows
- Familiarity with Repeating Groups and date pickers
- Optional: Stripe plugin for payment processing

## Step-by-step guide

### 1. Create the rental data types

Go to the Data tab. Create Vehicle with fields: name (text), type (Option Set: Car, SUV, Van, Truck), daily_rate (number), image (image), description (text), and is_active (yes/no). Create Booking with fields: vehicle (Vehicle), renter (User), pickup_date (date), return_date (date), total_price (number), status (Option Set: Reserved, Active, Returned, Cancelled), actual_return_date (date), and stripe_charge_id (text).

**Expected result:** Vehicle and Booking data types exist with all required fields.

### 2. Build the vehicle catalog with availability filter

Create a vehicle listing page with two Date Pickers for pickup and return dates. Add a Repeating Group showing Vehicles where is_active = yes. To check availability, add a constraint or filter that excludes vehicles with overlapping bookings. The availability check: Do a search for Bookings where vehicle = this vehicle AND status is not Cancelled AND pickup_date < desired return date AND return_date > desired pickup date. If count = 0, the vehicle is available.

> Pro tip: Display an Available or Booked badge on each vehicle card using a conditional that runs the availability search.

**Expected result:** Users can browse vehicles and see which ones are available for their selected dates.

### 3. Calculate pricing and show booking summary

On the vehicle detail page, display the selected dates and calculate the total: (return_date - pickup_date) in days * Vehicle's daily_rate. Show a booking summary with vehicle name, dates, number of days, daily rate, and total price. Add a Confirm Booking button below the summary.

**Expected result:** Users see a clear pricing breakdown before confirming their booking.

### 4. Create the booking confirmation workflow

When Confirm Booking is clicked: Action 1: Create a new Booking with vehicle, renter = Current User, dates, total_price, status = Reserved. Action 2: If using Stripe, trigger payment for the total_price. Action 3: On payment success, update Booking status to Reserved and store the stripe_charge_id. Action 4: Navigate to a confirmation page showing booking details and a confirmation number (the Booking's unique ID).

**Expected result:** A booking is created, payment is processed, and the user sees a confirmation.

### 5. Build the return check-in process

Create an admin page for managing returns. Show Active bookings in a Repeating Group. Each cell has a Check In button. The workflow: Make changes to Booking — status = Returned, actual_return_date = Current date/time. If the return is late (actual_return_date > return_date), calculate additional charges: (actual_return_date - return_date) in days * Vehicle's daily_rate * 1.5 (late fee multiplier). For complex fleet management with maintenance tracking and multi-location support, consider working with RapidDev.

**Expected result:** Staff can check in returned vehicles and apply late fees when applicable.

## Complete code example

File: `Workflow summary`

```text
VEHICLE RENTAL SYSTEM — WORKFLOW SUMMARY
==========================================

DATA TYPES:
  Vehicle
    - name (text), type (Option Set), daily_rate (number)
    - image (image), description (text), is_active (yes/no)
  Booking
    - vehicle (Vehicle), renter (User)
    - pickup_date (date), return_date (date)
    - total_price (number)
    - status (Option Set: Reserved/Active/Returned/Cancelled)
    - actual_return_date (date), stripe_charge_id (text)

AVAILABILITY CHECK:
  Vehicle is available when:
    Search for Bookings (vehicle=this, status≠Cancelled,
      pickup_date < desired_return, return_date > desired_pickup)
      :count is 0

PRICING:
  days = (return_date - pickup_date) in days
  total = days * Vehicle's daily_rate
  late_fee = extra_days * daily_rate * 1.5

WORKFLOW 1: Confirm booking
  Action 1: Create Booking (status=Reserved)
  Action 2: Stripe Checkout (total * 100)
  Action 3: Navigate to confirmation

WORKFLOW 2: Check in return
  Action 1: Make changes to Booking
    status = Returned
    actual_return_date = Current date/time
  Action 2 (if late): Calculate and charge late fee
```

## Common mistakes

- **Not checking for booking date overlaps** — Two users can book the same vehicle for overlapping dates, causing double-booking conflicts Fix: Always check for existing bookings with overlapping date ranges before allowing a new booking.
- **Using equals instead of range comparison for date availability** — Checking exact date matches misses partial overlaps. A booking from Monday-Friday overlaps with one from Wednesday-Saturday Fix: Use the overlap formula: existing.pickup < desired.return AND existing.return > desired.pickup.
- **Not handling cancelled bookings in availability checks** — Cancelled bookings still show as occupied, making vehicles appear unavailable when they are actually free Fix: Exclude Cancelled bookings from availability searches by adding status is not Cancelled to the constraint.

## Best practices

- Use date range overlap logic for accurate availability checking
- Exclude cancelled bookings from availability searches
- Calculate pricing dynamically from the date range and daily rate
- Store the stripe_charge_id for refund processing
- Track actual return dates separately from planned return dates
- Apply late fee multipliers for overdue returns
- Add Privacy Rules so renters can only see their own bookings

## Frequently asked questions

### Can I add multiple pickup locations?

Yes. Create a Location data type and add a location field to Vehicle. Let users filter by pickup location and show only vehicles at their selected location.

### How do I handle security deposits?

Create a pre-authorization with Stripe (charge but do not capture) at booking time. Capture the deposit amount if there is damage, or release it when the vehicle is returned in good condition.

### Can I add vehicle maintenance tracking?

Yes. Create a MaintenanceRecord data type linked to Vehicle. Block bookings when a vehicle has upcoming maintenance scheduled.

### Can RapidDev help build a fleet management platform?

Yes. RapidDev specializes in Bubble development and can build comprehensive fleet management with multi-location support, maintenance scheduling, insurance tracking, and analytics dashboards.

### How do I handle same-day bookings?

Set a minimum booking lead time (e.g., 2 hours) by checking that pickup_date is at least 2 hours after Current date/time before allowing the booking.

---

Source: https://www.rapidevelopers.com/bubble-tutorial/build-a-vehicle-rental-booking-system-in-bubble
© RapidDev — https://www.rapidevelopers.com/bubble-tutorial/build-a-vehicle-rental-booking-system-in-bubble
