Servio is a multi-tenant marketplace platform for local service and product businesses. Every business gets its own branded storefront with a subdomain in production, an isolated catalog, its own Stripe Connect account, and its own admin. Customers experience a single front door: the apex domain runs a ZIP-based marketplace that searches products, services, and stores across every published tenant at once. Result cards link straight into the relevant tenant storefront, where booking, cart, and checkout stay scoped to that one business and that one Stripe payout. The platform ships with a 5-step vendor onboarding wizard (account, business type, store setup, Stripe Connect, subscription), 20 tenant-admin pages covering appointments, availability, products, services, payments, analytics, coupons, customers, orders, QR codes, Amazon affiliate imports, route planning, and service areas, plus 11 platform-admin pages for organization management, impersonation, plan definitions, and revenue tracking. Geographic discovery is powered by Postgres trigram GIN indexes on store, product, and service names, latitude and longitude geocoding, and ZIP-radius service-area matching.
The Challenge
Local-services SaaS usually forces a choice. You can build a per-tenant storefront product that is isolated and branded but hard to discover, or you can build a marketplace with great discovery but no brand ownership for the seller. Servio had to deliver both at once without breaking tenant isolation. Carts, payouts, refunds, and admin scopes had to stay strictly single-store. A customer cannot have a haircut from Store A and a candle from Store B land in one cart or one PaymentIntent. At the same time, the apex domain still had to feel like one searchable marketplace covering every published tenant.
Our Solution
A two-layer architecture. The apex domain renders a marketplace landing with a ZIP and keyword hero plus a /discover results page powered by /api/discover/search. Those queries deliberately omit the organizationId filter and instead gate on isPublished, stripeConnectChargesEnabled, and active platform status, using Postgres trigram GIN indexes for fuzzy matching, lat/lng geocoding, and ServiceArea coverage for ZIP-radius proximity. Result cards deep-link into per-tenant storefronts via buildStoreUrl(), which resolves to a subdomain in production and to /store/{slug}/ in dev. Once inside a storefront, every Prisma query, cart item, order, and Stripe Connect PaymentIntent re-applies organizationId. Read-only cross-store endpoints (/api/account/carts, /wishlist, /orders) group by organizationId so the apex account hub at /me shows a unified view without ever merging tenants. Vendor onboarding is a guarded 5-step wizard, and platform-admin gets organization and store publishing controls, impersonation, plan management, and revenue tracking.
Results
Tech Stack
Want Similar Results?
Let's discuss how we can build something great for your business.

