BASE44DEVS

SOLUTION · MARKETPLACE

Base44 for Marketplaces: Escrow, Onboarding and Real-Time

Base44 can ship a working two-sided marketplace MVP in two to four weeks, but three areas need deliberate engineering before it scales: real-time comes as two primitives, entities.subscribe() for record updates such as new bids and messages and Actors for presence, typing indicators and live auctions, so load-test whichever you rely on before launch; there is no native escrow integration, so you build the held-funds flow on Stripe Connect by hand; and seller onboarding needs custom work, from Stripe Connect KYC redirects to a buyer-seller split you model with extra roles or a seller profile entity. Use it to validate the marketplace thesis, not to scale it.

Last verified
2026-10-20
Industry
Marketplace
Use cases
4

Is Base44 right for marketplaces?

With caveats. Marketplaces lean on real-time more than most verticals, and Base44 covers it with two primitives. Record-change subscriptions through entities.subscribe() (docs.base44.com) put new bids, new messages, order-status changes and inventory counts on screen as they are written. Actors are stateful realtime rooms over WebSockets, one live instance per room id, built for presence, typing indicators, in-room chat and live auctions (Base44 actors docs). Service marketplaces and slow-moving B2B niches rarely need more than record updates. A live-auction or live-commerce product that depends on who is watching and who is typing runs those rooms on Actors, so load-test them at your expected concurrency before launch.

The honest read: Base44 is a fast way to validate whether your marketplace thesis works at all. If users won't list and won't book on the MVP, they won't book on a rebuilt v2 either. Use Base44 to disprove the demand-side hypothesis cheap. If you survive that test, load-test the real-time paths at your projected traffic before you decide whether to stay or migrate.

What you can build

Marketplaces that fit Base44's shape:

  • Service marketplaces — hire a tutor, book a coach, find a consultant. Listings are static, booking is asynchronous, payment happens once per transaction. Polling-friendly.
  • Curated directories — paid listings in a vertical niche (e.g., "best agencies for SaaS marketing"). Subscription-based seller side, free buyer side, lead-form handoff. Almost no real-time needs.
  • B2B procurement — RFQ, quote, contract. Long-cycle, document-heavy, polling is fine.
  • Lead-generation marketplaces — buyers fill a form, sellers buy access to the lead. Stripe one-time payment per lead purchased, no escrow.
  • Live-auction marketplaces, after a load test (eBay-style, sneaker drops, NFT mints) — Base44's docs list live auctions and presence as Actor use cases, but sub-second bid ordering and who-is-watching presence are the product, so prove them at peak concurrency before you commit.

What does not fit:

  • High-frequency booking (ride-hailing, food delivery) — real-time matching is the product.
  • Chat-native marketplaces (Whatnot-style live commerce) — live video is the moat, and it would come from a third-party video service.
  • Anything with regulated escrow (legal, real estate trust accounts) — compliance posture is wrong.

Critical patterns for marketplaces

1. Two-sided identity: users + seller_profiles

Every Base44 app starts with Admin and User roles, and you can add extra roles and fields (Base44 access docs). Marketplaces need users to be buyers, sellers, or both, which is easier to model as data than as a role. The pattern:

// Collections
users {
  id, email, name, default_role: 'buyer' | 'seller'
}

seller_profiles {
  id, user_id (FK), stripe_connect_account_id,
  kyc_status: 'pending' | 'verified' | 'rejected',
  payout_schedule: 'instant' | 'weekly' | 'monthly',
  trust_tier: 'new' | 'verified' | 'top',
  total_listings: number, total_sales: number, rating: number
}

listings {
  id, seller_profile_id (FK), title, price_cents,
  status: 'draft' | 'active' | 'sold' | 'archived',
  // ... domain fields
}

orders {
  id, listing_id, buyer_user_id, seller_profile_id,
  amount_cents, fee_cents, escrow_status: 'held' | 'released' | 'refunded',
  stripe_payment_intent_id
}

The discipline: every listing and order carries seller_profile_id, and each seller's user record carries the same id as a custom field, so an RLS rule can compare the two and enforce "you can only act on your own seller account." This pattern survives migration cleanly.

2. Escrow: Stripe Connect with manual capture

The flow that works:

Buyer creates order      -> Base44 backend function creates PaymentIntent
                            with capture_method='manual', destination=seller_account
                         -> Stripe authorizes the buyer's card (funds held)
                         -> Order status: 'authorized'
Seller delivers          -> Order moves to 'delivered'
Buyer confirms (or 7d)   -> Backend function calls stripe.paymentIntents.capture()
                            (transfers minus platform fee to seller)
                         -> Order status: 'released'
Buyer disputes           -> Backend function calls stripe.refunds.create()
                         -> Order status: 'refunded'

The capture window is the trap. Stripe holds authorizations for 7 days for cards. Disputes that drag past 7 days force you to capture-and-refund instead of release-or-cancel, which leaves a paper trail that complicates accounting. Build dispute handling into the order state machine from day one.

3. Search: filter UI now, Algolia later

Up to 5,000 listings, Base44's collection filters cover most search needs; 5,000 is also the most one list() or filter() request returns (docs.base44.com, read 25 Sep 2026). UI: category dropdown, price range, location filter, sort by created_at or price. Past 5,000, you sync to Algolia:

// On every listing write, in backend function:
async function syncListingToAlgolia(listing) {
  await algolia.saveObject({
    objectID: listing.id,
    title: listing.title,
    description: listing.description,
    category: listing.category,
    price: listing.price_cents / 100,
    location: { lat: listing.lat, lng: listing.lng },
    seller_trust_tier: listing.seller.trust_tier,
    _tags: listing.tags,
  });
}

Frontend queries Algolia directly with a search-only API key. Backend handles writes. Clean separation, $30–100/month at modest scale.

4. Real-time: subscriptions for records, Actors for live rooms

Anything that is a record — a bid, a chat message, an order moving to delivered — can stream through the SDK. entities.subscribe() delivers every create, update and delete on an entity, so filter to the auction on screen:

// Frontend: live bid list for one auction
const unsubscribe = base44.entities.Bid.subscribe((event) => {
  if (event.type === 'create' && event.data.auction_id === auctionId) {
    setBids((prev) => [event.data, ...prev]);
  }
});
// Call unsubscribe() when the auction page unmounts

Presence and "X is typing" are not record changes, and they do not belong in entities. They belong in an Actor: a stateful realtime room over WebSockets, one live instance per room id, which Base44's docs list for presence, typing indicators, in-room chat and live auctions (Base44 actors docs). Give each order's conversation its own room:

// Frontend: the order's private chat room. order.room_id is a
// crypto.randomUUID() stored on the order, readable only by buyer and seller.
const conn = base44.actors.OrderChat(order.room_id).connect();
conn.subscribe((msg) => {
  if (msg.type === 'typing') showTypingDots(msg);
});
conn.send({ type: 'typing' });
// Call conn.close() when the order page unmounts

There is no room-level auth: the room id is the admission control, so mint it with crypto.randomUUID() rather than reusing an order id, and keep it out of any list other users can read. Inside the actor, attribute messages to the verified conn.identity, never to a user id the client sends. Entities keep every record; the room carries only the state you would never store, such as who is online and who is typing. Write anything that matters, like a closing bid, from the actor to an entity, and load-test rooms at launch concurrency before a live auction depends on them.

5. Trust and safety: review queue + manual escalation

Marketplaces need moderation. There is no native moderation UI on Base44, so you build it:

  • Every new listing, review, and chat message lands in a moderation_queue collection with status pending.
  • A small admin UI (built on Base44, gated by an is_admin flag on users) shows pending items with approve/reject buttons.
  • AI-assisted triage is straightforward: a backend function calls a moderation API (OpenAI moderation, Perspective) on write and auto-approves anything below a threshold.

Plan for 4–6 hours per week of human moderation work for any marketplace past 100 listings. The platform will not do this for you.

Limitations and gotchas

LimitationImpactWorkaround
Realtime needs the right primitiveRecord subscriptions carry bids and messages, not presence or typingentities.subscribe() for records; actors for presence, typing and live auctions; load-test before launch
Buyer-seller duality is yours to modelDefault Admin and User roles do not describe a sellerExtra roles and fields, or a side-table seller_profiles
No full-text searchSearch degrades past 5k listingsAlgolia or Meilisearch
No native moderationT&S is 100% custommoderation_queue + admin UI
5,000 items per list() or filter() requestLarge catalogues are read in pagesCursor pagination; bulkCreate(), upsert() or CSV import for bulk seller imports
AI-set data permissions can be too broadCross-seller data leakManual seller_profile_id filter on every rule; test it in preview
Scheduled automations stop at the 5-minute function limitLong payout runs are cut offBatch payouts across runs; confirm each run on the Logs page
Mobile app reviewBase44's store build (Builder plan and up) is a web-view wrapper, which Apple's guideline 4.2 turns away when the app is not "particularly useful, unique, or 'app-like'"; in-app purchases are "Not yet" supported, so paid listings and paid lead access cannot be sold inside the appStripe stays fine for bookings and physical goods; sell digital extras on the web (App Store rejection guide)
No reputation systemReviews are entirely yours to designBuild it; align with vertical norms

The expensive mistake for a marketplace team: treating Stripe Connect webhooks as fire-and-forget. Point them at a backend function's own HTTP endpoint, verify the signature, make the handler idempotent so a retried event never pays a seller twice, and confirm each checkout on the success page instead of relying on webhooks alone.

Real-world example architecture

An example service-marketplace MVP on Base44:

Collections:
- users                    (id, email, default_role)
- seller_profiles          (user_id, stripe_connect_id, kyc_status, trust_tier)
- listings                 (seller_profile_id, title, price, category, location)
- orders                   (listing_id, buyer_user_id, escrow_status, stripe_pi_id)
- messages                 (order_id, sender_user_id, body, read_at)
- reviews                  (order_id, rating, body, public)
- moderation_queue         (entity_type, entity_id, status, reason)
- audit_events             (actor, event, entity, ts)

Actors:
- OrderChat                (one private room per order: presence, typing)

External services:
- Stripe Connect              -> escrow + payouts
- Algolia (optional, post-5k) -> search
- Postmark                    -> transactional email
- Twilio                      -> SMS for booking confirmations

Key flows:
- Seller onboarding -> Stripe Connect Express -> KYC redirect -> seller_profile complete
- Listing creation -> moderation queue -> AI auto-approve OR human review
- Order placement  -> Stripe authorize -> escrow held -> seller delivers -> capture
- Dispute          -> refund flow -> dispute_events log -> manual review
- Payout           -> Stripe Connect payout schedule -> webhook -> seller_profile total update

On our build tiers this stack is Standard ($9,000, 4–6 weeks) or Premium ($15,000, 6–10 weeks) work, depending on how much escrow and search integration it needs. Once listings approach the 5,000 search threshold above, the migration conversation starts.

Cost to ship

For a marketplace at 500 active listings, 200 monthly transactions, $50 average order:

Line itemMonthlyOne-time
Base44 Pro or Elite plan (when credits run out, the documented route is to upgrade or adjust your plan)$80–200—
Stripe Connect fees (~$10k GMV)$290 + $0.25/payout—
Postmark$50—
Algolia (deferred until 5k listings)$0–50$1,500 setup if needed
Sentry$26—
Manual moderation labor$400–800—
Build (escrow, onboarding, search, T&S)—$9,000–15,000
Total~$845–1,415/mo + per-payout fees~$9,000–15,000

Comparable Next.js + Supabase + Stripe + Algolia stack: $150–250/month operational, $30,000–50,000 initial build. Base44 is meaningfully cheaper to start, less expensive at scale only if you stay under the ceilings.

Migration off-ramp

The clean migration target is Next.js + Supabase + Algolia + Stripe Connect. Component model maps. Postgres gives you full-text search out of the box (you can defer Algolia). Supabase Realtime's Presence and Broadcast channels take over the who-is-online and typing features you ran on Actors. Stripe Connect carries over unchanged. We document the playbook in the Next.js + Supabase migration guide. Hired out, it is fixed-price on our published migration tiers: $12,000 for up to 20 tables with multi-role auth and Stripe (4–5 weeks), and $25,000+ for multi-tenant or SOC 2 / HIPAA-compatible work, quoted in a written proposal within one week. How deep the SDK calls leaked into the React components decides how much of the frontend gets rewritten.

Get this scoped

If you are building a marketplace on Base44 and want to know whether the architecture will hold up to your traffic projections, our standard build engagement covers the escrow, onboarding, and moderation plumbing end-to-end. Or if you have a marketplace already live and want a written assessment of where the scale ceilings will hit, the $497 production audit maps the failure modes against your actual data volumes.

Book a 15-minute call to scope your marketplace

QUERIES

Frequently asked questions

Q.01Can Base44 handle a marketplace with real-time bidding or chat?
A.01

Yes, with the right primitive for each job. entities.subscribe() delivers record changes over a WebSocket: your app receives create, update and delete events on an entity, so a new bid or a new chat message can appear without polling. For live sessions Base44 has Actors, stateful realtime rooms over WebSockets with one live instance per room id, which its docs list for presence, typing indicators, in-room chat and live auctions. Run each auction or conversation as its own room, write the results that matter (the winning bid, the message history) to entities, and load-test rooms at your expected concurrency before launch.

Q.02How do you handle escrow on Base44?
A.02

There is no native escrow. The standard pattern is Stripe Connect with manual capture. The buyer's payment authorizes but does not capture. The funds sit in Stripe's holding state until the seller delivers and the buyer confirms, then a Base44 backend function calls stripe.paymentIntents.capture(). Failure modes: the capture window is 7 days for most payment methods, so disputes that take longer break the flow; and the orchestration logic (refund triggers, dispute handling, payout schedule) is roughly 25–40 hours of careful build. None of it is on the happy path.

Q.03What's the seller onboarding pattern on Base44?
A.03

Every Base44 app starts with Admin and User roles, and you can create extra roles and fields, so the role layer is not the hard part. A user who is both buyer and seller is still cleanest as data. Pattern: a users collection plus a seller_profiles collection with a foreign key. The seller_profiles row carries Stripe Connect account ID, KYC status, payout schedule, and trust tier. Onboarding is multi-step (Stripe Connect Express creates the account, redirects through KYC, then redirects back), so you wire the redirect URLs into Base44 backend functions and persist the in-flight state on the seller_profile row.

Q.04How does search work on a Base44 marketplace?
A.04

Adequately for under 5,000 listings, painfully past that. Base44 collections support filter-and-sort but no full-text search, no faceted search, and no relevance ranking. At that size, a server-side filter UI (category, price, location) is enough. Once you cross 5,000 listings and need typo-tolerant text search, you sync the listings collection to Algolia or Meilisearch via a backend function on every write. Add roughly $30–100/month and 6–10 hours of integration.

Q.05Are there marketplaces actually running on Base44 in production?
A.05

Yes — small ones. The marketplaces that fit sit in vertical niches (services, B2B procurement, hobby-specific) with modest listing counts. Ship fast, validate the demand side, then decide whether to migrate off or accept the scale ceiling and stay. Once the core flows settle, move from the AI agent to the code editor for stability.

Q.06When should I migrate a marketplace off Base44?
A.06

Three signals: (1) you cross 5,000 listings and search becomes unbearable, (2) you need real-time features beyond record subscriptions and Actors, such as in-app calling or live video, or your Actor load test fails, or (3) you're closing a fundraise and your investors want to see a stack they recognize. Migration target is usually Next.js + Supabase + Algolia, which gives you the same component model plus Postgres full-text search.

NEXT STEP

Ready to scope your build?

Free first call. Fixed-price scope after.