Build a property listings system in Bubble with listing creation forms, photo galleries, map integration, and status management. This tutorial walks you through designing the data model for properties, creating a search-and-filter listings page with a Repeating Group, embedding maps, and managing listing statuses from active to sold.
Overview: Building a Property Listings System in Bubble
This tutorial covers building a property listings system suitable for real estate agencies, rental platforms, or property marketplaces. You will create a structured data model, design listing cards with photos and key details, add search and filtering, integrate maps for location display, and build an admin view for managing listing status. This guide is for non-technical founders who want to launch a property platform without code.
Prerequisites
- A Bubble account with at least one app
- Basic familiarity with the Design tab and Repeating Groups
- Sample property data (addresses, prices, photos) for testing
- A Google Maps API key (free tier available) if you want map integration
Step-by-step guide
Create the Property Data Type and Option Sets
Create the Property Data Type and Option Sets
Go to Data tab → Data types and create a new type called Property with fields: Title (text), Description (text), Address (geographic address), Price (number), Bedrooms (number), Bathrooms (number), Square_Feet (number), Property_Type (Option Set), Status (Option Set), Photos (list of images), Listed_By (User), and Listed_Date (date). Create two Option Sets: PropertyType with options Apartment, House, Condo, Townhouse, Land; and ListingStatus with options Active, Pending, Sold, Withdrawn. The geographic address field automatically stores latitude and longitude for map display.
Pro tip: Use the geographic address field type instead of plain text for addresses — it integrates directly with Bubble's Map element and enables distance-based searches.
Expected result: A Property Data Type with all fields and two Option Sets for property type and listing status.
Build the property listing creation form
Build the property listing creation form
Create a new page called add-listing. Add input elements for each property field: an Input for Title, a Multiline Input for Description, a Search Box for Address (set to Geographic places), Inputs for Price, Bedrooms, Bathrooms, and Square Feet, Dropdowns for Property Type and Status (data source: All PropertyTypes and All ListingStatuses), and a Multi-file Uploader for Photos. Add a Submit button. Create a workflow: When Submit is clicked → Create a new Property with each field mapped to its input element, Listed_By = Current User, Listed_Date = Current date/time. After creation, navigate to the listing detail page using Go to page with the new Property as a parameter.
Expected result: A form page where users can enter all property details and submit to create a new listing in the database.
Design the listings page with search and filters
Design the listings page with search and filters
Create a page called listings. At the top, add a Search Box (Geographic places type) for location search, a Dropdown for Property Type filter, an input range for Min Price and Max Price, and a Dropdown for Bedrooms (1+, 2+, 3+, 4+). Below the filters, add a Repeating Group with Type: Property, Data source: Do a search for Properties with constraints: Status = Active, Property_Type = Dropdown PropertyType's value, Price >= Min Price Input's value, Price <= Max Price Input's value, Bedrooms >= Dropdown Bedrooms' value. Check 'Ignore empty constraints' on each. Inside each cell, add an Image (Current cell's Property's Photos:first item), Text elements for Title, Price formatted as currency, Bedrooms/Bathrooms count, and Address.
Pro tip: Add a Dropdown for sort order (Price Low to High, Price High to Low, Newest First) and use it as the Sort field on the Repeating Group's data source.
Expected result: A filterable listings page showing property cards with photos, prices, and key details in a responsive grid.
Embed Google Maps to display property locations
Embed Google Maps to display property locations
On the listings page, click the + icon and search for Map. Drag the Map element onto the page beside or below the Repeating Group. Set the Map's data source to the same search as the Repeating Group (Do a search for Properties with the same constraints). Set the 'Marker address field' to Address. Customize the map style and zoom level in the element properties. To make map markers clickable, create a workflow: When a map marker is clicked → Go to page property-detail, sending Current marker's Property as data. You can also add a Map element on the individual property detail page showing just that property's address.
Expected result: A Google Map displays markers for all matching properties, and clicking a marker navigates to the property detail page.
Create the property detail page
Create the property detail page
Create a page called property-detail with Type of content set to Property. Add a Slideshow or Repeating Group (horizontal, 1 row) with Data source: Current page Property's Photos to display the photo gallery. Add Text elements for Current page Property's Title, Description, Price (formatted as currency), Address, Bedrooms, Bathrooms, Square Feet, Property Type's Display, and Status's Display. Add conditional formatting on the Status text: when Status is Active show green background, Pending show yellow, Sold show red. Add a Contact button that triggers a workflow to send an email to the Listed_By user or create an Inquiry record.
Expected result: A detail page showing the full property information with a photo gallery, all details, and a contact action.
Build the listing management dashboard
Build the listing management dashboard
Create a page called manage-listings. Add a Repeating Group with Type: Property, Data source: Do a search for Properties where Listed_By = Current User, sorted by Listed_Date descending. In each cell, show a thumbnail (Photos:first item), Title, Price, Status, and a Dropdown to change the Status. Create a workflow: When Status Dropdown's value changes → Make changes to Current cell's Property → Status = This Dropdown's value. Add a Delete button with a confirmation popup — when confirmed, delete the Property. Add Privacy Rules: only the Listed_By user can modify or delete their own listings.
Pro tip: Add a tab system at the top to filter between Active, Pending, and Sold listings by adding constraints on the Repeating Group's search.
Expected result: Property owners can view, update status, and delete their own listings from a management dashboard.
Complete working example
1PROPERTY LISTINGS SYSTEM — WORKFLOW SUMMARY2=============================================34DATA TYPES:5 Property: Title (text), Description (text), Address (geographic address),6 Price (number), Bedrooms (number), Bathrooms (number),7 Square_Feet (number), Property_Type (Option Set),8 Status (Option Set), Photos (list of images),9 Listed_By (User), Listed_Date (date)1011OPTION SETS:12 PropertyType: Apartment, House, Condo, Townhouse, Land13 ListingStatus: Active, Pending, Sold, Withdrawn1415PAGE: add-listing16 Form inputs: Title, Description, Address (SearchBox), Price,17 Bedrooms, Bathrooms, Sq Ft, Type dropdown, Photos uploader18 Workflow: Submit clicked19 1. Create new Property (map all fields, Listed_By=Current User)20 2. Go to page property-detail (data: Result of step 1)2122PAGE: listings23 Filters: Location SearchBox, Type dropdown, Price range, Bedrooms24 Repeating Group → Type: Property25 Source: Search Properties (Status=Active + filter constraints)26 Ignore empty constraints: checked27 Map element → Same data source as Repeating Group28 Marker address: Address field29 Workflow: Map marker clicked → Go to property-detail3031PAGE: property-detail (Type of content: Property)32 Photo gallery: RG horizontal → Current page Property's Photos33 Details: Title, Description, Price, Address, Beds, Baths, SqFt34 Status badge with conditional colors (green/yellow/red)35 Contact button → Send email to Listed_By user3637PAGE: manage-listings38 Repeating Group → Properties where Listed_By = Current User39 Each cell: Thumbnail, Title, Price, Status dropdown, Delete button40 Workflow: Dropdown changes → Make changes to Property → new Status41 Workflow: Delete confirmed → Delete Property4243PRIVACY RULES:44 Property: Everyone can view Active listings45 Property: Only Listed_By user can modify/delete own listingsCommon mistakes when developing a property listings system in Bubble.io: Step-by-Step Guide
Why it's a problem: Using a plain text field for addresses instead of the geographic address type
How to avoid: Use the geographic address field type and a SearchBox element (set to Geographic places) for address input.
Why it's a problem: Loading all property photos at full resolution in the listings grid
How to avoid: Display only the first photo (Photos:first item) in listing cards and use Bubble's image processing to resize. Show the full gallery only on the detail page.
Why it's a problem: Not adding Privacy Rules to restrict listing modifications
How to avoid: Add a Privacy Rule: when Current User is not This Property's Listed_By → deny Modify and Delete permissions.
Best practices
- Use Option Sets for property types and listing statuses to ensure consistent values across the app
- Compress images before uploading to keep the listings page fast-loading
- Add pagination to the Repeating Group (10-20 items per page) to avoid performance issues with large datasets
- Use database constraints on the search instead of client-side :filtered for better performance
- Add an 'Ignore empty constraints' checkbox to make filters optional
- Include a Listed_Date field and sort by it to show newest listings first by default
- Set up email notifications to alert listing owners when someone inquires about their property
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
I'm building a property listings platform in Bubble.io. I need a data model for properties with photos, location, price, bedrooms, and status tracking. Can you help me design the schema and outline the key pages I need?
Create a listings page with a Repeating Group showing property cards in a 3-column grid. Each card should display the first photo, title, price, bedrooms, and bathrooms. Add filter dropdowns above for property type and bedroom count.
Frequently asked questions
Can I use Google Maps on Bubble's Free plan?
Yes. Bubble's built-in Map element works on all plans. You will need a Google Maps API key, which has a generous free tier. Add the key in Settings → General → Google Maps API key.
How do I handle multiple property photos?
Use a list of images field on the Property Data Type and a Multi-file Uploader element on the creation form. Display photos in a horizontal Repeating Group or slideshow element on the detail page.
Can users search by distance from a location?
Yes. Use the geographic address field and add a distance constraint on the search: Property's Address is within X miles of SearchBox's value. Bubble supports distance-based search natively.
How many property listings can Bubble handle?
Bubble handles thousands of listings well with proper optimization. Use database constraints (not client-side filtering), paginate Repeating Groups, and compress images. For platforms with tens of thousands of listings, consult RapidDev for performance optimization strategies.
How do I add a favorites feature for saved properties?
Add a Saved_Properties (list of Properties) field to the User Data Type. Create a heart icon button that toggles: add or remove Current cell's Property from Current User's Saved_Properties list.
Can I enable property listing approvals before they go live?
Yes. Set the default Status to Pending Review instead of Active. Create an admin page where you search for Properties with Status = Pending Review and add a button to change the Status to Active.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation