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

Copyright © 2026