BASE44DEVS

SOLUTION · MARKETPLACE

Base44 for Marketplaces: Escrow, Onboarding, and Why Real-Time Hurts

Base44 can ship a working two-sided marketplace MVP in two to four weeks, but the platform has three structural gaps that will hurt at scale: no WebSocket means no real-time bid or chat updates, no native escrow integration means you build the held-funds flow on Stripe Connect by hand, and the seller onboarding flow needs heavy custom work because Base44's identity layer is single-role. Use it to validate the marketplace thesis, not to scale it.

Last verified
2026-05-01
Industry
Marketplace
Use cases
4

Is Base44 right for marketplaces?

With caveats. Marketplaces are where Base44 hits its hardest architectural limit: no real-time. Every interesting marketplace UX — live bids, presence indicators, instant chat, real-time inventory — depends on bidirectional sockets the platform does not provide. Polling gets you most of the way for service marketplaces and slow-moving B2B niches. Polling does not get you to a live-auction or marketplace-chat product without a third-party socket service bolted on.

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 a polling-based MVP, they won't book on a Pusher-backed v2 either. Use Base44 to disprove the demand-side hypothesis cheap. If you survive that test, plan the migration to a stack with real-time as a first-class primitive.

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 unlock, no escrow.

What does not fit:

  • Live-auction marketplaces (eBay-style, sneaker drops, NFT mints) — sub-second updates required.
  • High-frequency booking (ride-hailing, food delivery) — real-time matching is the product.
  • Chat-native marketplaces (Whatnot-style live commerce) — WebSocket is the moat.
  • Anything with regulated escrow (legal, real estate trust accounts) — compliance posture is wrong.

Critical patterns for marketplaces

1. Two-sided identity: users + seller_profiles

Base44's user model is single-role. Marketplaces need users to be buyers, sellers, or both. 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 read of a listing or order joins through seller_profiles so RLS rules can 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. 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: polling first, Pusher when forced

For chat presence, "X is typing," and inventory updates under 30 seconds of staleness, polling at 5–10 second intervals is fine. Implement with a last_seen_at field on relevant rows and a frontend useInterval hook. When polling stops being enough — usually live auctions, video-stream chat, or sub-second presence — wire Pusher Channels through a backend function:

// Backend function: emit-bid.ts
await pusher.trigger(`auction-${auctionId}`, 'new-bid', {
  amount, bidder_id, ts: Date.now()
});
// Then write to Base44 collection so the data survives
await db.from('bids').insert({ auction_id, amount, bidder_id });

Pusher delivers real-time, Base44 owns the source of truth. If Pusher is down, polling fallback degrades gracefully.

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
No WebSocketNo real-time bids, chat, presencePolling (5–10s) or Pusher/Ably ($50–200/mo)
Single-role user modelBuyer-seller duality awkwardSide-table seller_profiles
No full-text searchSearch degrades past 5k listingsAlgolia or Meilisearch
Webhooks need active usersStripe Connect events lost overnightExternal webhook proxy
No native moderationT&S is 100% custommoderation_queue + admin UI
5,000-item request limitBulk seller imports breakPagination + queue
RLS defaults openCross-seller data leakManual seller_profile_id filter on every rule
No background jobs UIPayout schedule debugging is painfulExternal cron + retry log collection
Mobile app limitsMarketplace mobile = web wrapper, often rejectedApp Store rejection guide
No reputation systemReviews are entirely yours to designBuild it; align with vertical norms

The killer for most marketplace teams: realizing six weeks in that webhook reliability matters and rebuilding the Stripe Connect event handling on a Cloudflare Worker.

Real-world example architecture

A typical 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)

External services:
- Stripe Connect              -> escrow + payouts
- Cloudflare Worker           -> Stripe webhook reliability
- Algolia (optional, post-5k) -> search
- Pusher (optional)           -> real-time chat presence
- 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

This stack ships in 6–10 weeks for a vertical service marketplace with under 1,000 expected listings. Past that scale, 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 + credit overage$200–400
Cloudflare Worker (webhooks)$5$300
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)$15,000–25,000
Total~$1,000/mo + GMV fees~$15,000–25,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 closes the WebSocket gap. Stripe Connect carries over unchanged. We document the playbook in the Next.js + Supabase migration guide. Marketplace migrations typically run 10–14 weeks, $15,000–30,000 fixed-price, depending on listing volume and how deep the SDK calls leaked into the React components.

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

Not natively. Base44 has no WebSocket support. Your real-time options are polling (every 3–10 seconds, which works for chat-presence but breaks for live auctions), or a third-party real-time service (Ably, Pusher, Supabase Realtime) wired in via a backend function. For an auction marketplace with sub-second bid updates, the third-party path is mandatory and adds roughly $50–200/month and 8–15 hours of integration work.

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

Base44's user model is single-role per workspace, so a marketplace where users can be both buyers and sellers needs a side-table. 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. Most teams ship a server-side filter UI (category, price, location) and call it good. Once you cross 5,000–10,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. We have audited four marketplaces on Base44 in 2026; all sub-2,000 active listings, all in vertical niches (services, B2B procurement, hobby-specific). The pattern is consistent: they shipped fast, validated the demand side, and either migrated off (two of four) or accepted the scale ceiling and stayed (two of four). None of them used the AI agent past month three; they all moved 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 that polling can't fake (live auctions, in-app calling, presence), 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 real Postgres full-text search and proper async support.

NEXT STEP

Ready to scope your build?

Free first call. Fixed-price scope after.