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.
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
The Payment Flow: Stripe Connect in Four Steps
→ Save account.id to SellerProfile’s stripe_account_id
POST stripe.com/v1/account_links (create onboarding link)
→ Redirect seller to Stripe hosted onboarding
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
Handle payment_intent.succeeded: find Order by PaymentIntent ID, set status = Paid, notify seller via email, create empty Review record for post-delivery collection.
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.
