Marketplace Architecture · Bubble.io

How to Build a Two-Sided Marketplace on Bubble.io

Buyers on one side, sellers on the other, money flowing through the middle. The two-sided marketplace is one of the most valuable business models in software — and Bubble.io is the fastest way to build one without a development team.

2-sidedUser Roles
Stripe ConnectPayments
6wkMVP Timeline
⏱ 12 min read · Bubble.io · 2026

The Three Things That Make Marketplace Architecture Unique

A marketplace is not a SaaS with two user types. It is a fundamentally different product structure: two distinct audiences with conflicting incentives, a matching or discovery mechanism between them, and a payment flow where the platform sits in the middle and takes a fee. Every architectural decision flows from these three facts.

👥

Dual User Roles

Buyer and Seller are distinct roles with completely different dashboards, workflows, and data access. A User record needs a role field (or separate profile data types) to determine which experience they see.

🔍

Discovery Mechanism

Buyers must find sellers. This means a searchable, filterable listing page — the most performance-critical page in the app. Every filter must be a search constraint, never a :filtered by expression.

💰

Split Payments (Stripe Connect)

Money flows from buyer through the platform to the seller, minus a platform fee. This requires Stripe Connect — not standard Stripe. Each seller has their own connected Stripe account. The platform charges the buyer and transfers to the seller in one atomic operation.

The Marketplace Data Model

📋Listing
seller→ User
titletext
descriptiontext
pricenumber
categoryoption set
imageslist of image
statusoption set
avg_ratingnumber

💳Order
buyer→ User
listing→ Listing
seller→ User
amountnumber
platform_feenumber
stripe_pi_idtext
statusoption set

Review
order→ Order
reviewer→ User
listing→ Listing
ratingnumber (1–5)
bodytext
created_datedate

💬Message
thread→ Thread
sender→ User
bodytext
created_datedate

👤SellerProfile
user→ User
stripe_account_idtext
onboarding_doneyes/no
total_earnednumber
avg_ratingnumber

💬Thread
buyer→ User
seller→ User
listing→ Listing
last_message_atdate

The Payment Flow: Stripe Connect in Four Steps

1
Seller onboards to Stripe Connect
POST stripe.com/v1/accounts (type=express)
→ Save account.id to SellerProfile’s stripe_account_id
POST stripe.com/v1/account_links (create onboarding link)
→ Redirect seller to Stripe hosted onboarding
2
Buyer pays — platform charges and transfers
POST stripe.com/v1/payment_intents
amount = Listing price in cents
application_fee_amount = platform_fee (e.g. 10%)
transfer_data[destination] = seller’s stripe_account_id
→ Buyer pays full amount; Stripe splits automatically
3
Webhook confirms payment — update Order status

Handle payment_intent.succeeded: find Order by PaymentIntent ID, set status = Paid, notify seller via email, create empty Review record for post-delivery collection.

4
After delivery — collect review, update rating

Prompt buyer to review after order completion. On review submission: update Listing’s avg_rating as a denormalised field using all Review ratings for that Listing. Never query all reviews on render — always read the denormalised value.

Ready to Build on Bubble?

Architecture, data model design, Stripe billing, and full SaaS builds — done right from day one.

Book a Free Call →
See Our Work

Simple Automation Solutions

Business Process Automation, Technology Consulting for Businesses, IT Solutions for Digital Transformation and Enterprise System Modernization, Web Applications Development, Mobile Applications Development, MVP Development